mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 01:15:41 +08:00
general: optimize code
This commit is contained in:
parent
69bbaa809c
commit
d36b8fa394
@ -1,5 +1,5 @@
|
||||
language: go
|
||||
|
||||
go:
|
||||
- "1.12.x"
|
||||
- "1.13.x"
|
||||
- master
|
||||
|
15
go.mod
15
go.mod
@ -1,6 +1,6 @@
|
||||
module github.com/nadoo/glider
|
||||
|
||||
go 1.12
|
||||
go 1.13
|
||||
|
||||
require (
|
||||
github.com/Yawning/chacha20 v0.0.0-20170904085104-e3b1f968fc63 // indirect
|
||||
@ -9,8 +9,8 @@ require (
|
||||
github.com/dgryski/go-idea v0.0.0-20170306091226-d2fb45a411fb // indirect
|
||||
github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152 // indirect
|
||||
github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 // indirect
|
||||
github.com/klauspost/cpuid v1.2.0 // indirect
|
||||
github.com/klauspost/reedsolomon v1.9.1 // indirect
|
||||
github.com/klauspost/cpuid v1.2.1 // indirect
|
||||
github.com/klauspost/reedsolomon v1.9.2 // indirect
|
||||
github.com/nadoo/conflag v0.2.0
|
||||
github.com/nadoo/go-shadowsocks2 v0.1.0
|
||||
github.com/pkg/errors v0.8.1 // indirect
|
||||
@ -18,10 +18,11 @@ require (
|
||||
github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect
|
||||
github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b // indirect
|
||||
github.com/tjfoc/gmsm v1.0.1 // indirect
|
||||
github.com/xtaci/kcp-go v5.0.7+incompatible
|
||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576
|
||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
|
||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54 // indirect
|
||||
github.com/xtaci/kcp-go v5.4.4+incompatible
|
||||
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae // indirect
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 // indirect
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // indirect
|
||||
)
|
||||
|
||||
// Replace dependency modules with local developing copy
|
||||
|
29
go.sum
29
go.sum
@ -10,10 +10,10 @@ github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152 h1:ED31mPIxDJnrLt9W
|
||||
github.com/dgryski/go-rc2 v0.0.0-20150621095337-8a9021637152/go.mod h1:I9fhc/EvSg88cDxmfQ47v35Ssz9rlFunL/KY0A1JAYI=
|
||||
github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521 h1:fBHFH+Y/GPGFGo7LIrErQc3p2MeAhoIQNgaxPWYsSxk=
|
||||
github.com/ebfe/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:ucvhdsUCE3TH0LoLRb6ShHiJl8e39dGlx6A4g/ujlow=
|
||||
github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
|
||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/reedsolomon v1.9.1 h1:kYrT1MlR4JH6PqOpC+okdb9CDTcwEC/BqpzK4WFyXL8=
|
||||
github.com/klauspost/reedsolomon v1.9.1/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
||||
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
|
||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/reedsolomon v1.9.2 h1:E9CMS2Pqbv+C7tsrYad4YC9MfhnMVWhMRsTi7U0UB18=
|
||||
github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
|
||||
github.com/nadoo/conflag v0.2.0 h1:xao13tYqfD+5bjQ1A/jT2kBL8tUcVpFhq3seuN5kpeM=
|
||||
github.com/nadoo/conflag v0.2.0/go.mod h1:Ayl83klaw7fagwYaI6luTmbOi4psAf7FqJNRRv5YMvU=
|
||||
github.com/nadoo/go-shadowsocks2 v0.1.0 h1:NkdUrZrI8uYq8R0YDmHLttLqKt0Z9i7dUKtGvBqZQl8=
|
||||
@ -28,15 +28,20 @@ github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b h1:mnG1fcsIB1d/3vbkB
|
||||
github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4=
|
||||
github.com/tjfoc/gmsm v1.0.1 h1:R11HlqhXkDospckjZEihx9SW/2VW0RgdwrykyWMFOQU=
|
||||
github.com/tjfoc/gmsm v1.0.1/go.mod h1:XxO4hdhhrzAd+G4CjDqaOkd0hUzmtPR/d3EiBBMn/wc=
|
||||
github.com/xtaci/kcp-go v5.0.7+incompatible h1:zs9tc8XRID0m+aetu3qPWZFyRt2UIMqbXIBgw+vcnlE=
|
||||
github.com/xtaci/kcp-go v5.0.7+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE=
|
||||
github.com/xtaci/kcp-go v5.4.4+incompatible h1:QIJ0a0Q0N1G20yLHL2+fpdzyy2v/Cb3PI+xiwx/KK9c=
|
||||
github.com/xtaci/kcp-go v5.4.4+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE=
|
||||
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
|
||||
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 h1:aUX/1G2gFSs4AsJJg2cL3HuoRhCSCz733FE5GUSuaT4=
|
||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 h1:kcXqo9vE6fsZY5X5Rd7R1l7fTgnWaDCVmln65REefiE=
|
||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0=
|
||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA=
|
||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54 h1:xe1/2UUJRmA9iDglQSlkx8c5n3twv58+K0mPpC2zmhA=
|
||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
|
||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
2
main.go
2
main.go
@ -30,7 +30,7 @@ import (
|
||||
)
|
||||
|
||||
// VERSION .
|
||||
const VERSION = "0.7.0"
|
||||
const VERSION = "0.7.1"
|
||||
|
||||
func main() {
|
||||
// TODO: remove this line when Go1.13 is released.
|
||||
|
@ -43,17 +43,17 @@ func (p *HTTPObfs) NewConn(c net.Conn) (net.Conn, error) {
|
||||
|
||||
func (c *HTTPObfsConn) writeHeader() (int, error) {
|
||||
buf := new(bytes.Buffer)
|
||||
buf.Write([]byte("GET " + c.obfsURI + " HTTP/1.1\r\n"))
|
||||
buf.Write([]byte("Host: " + c.obfsHost + "\r\n"))
|
||||
buf.Write([]byte("User-Agent: " + c.obfsUA + "\r\n"))
|
||||
buf.Write([]byte("Upgrade: websocket\r\n"))
|
||||
buf.Write([]byte("Connection: Upgrade\r\n"))
|
||||
buf.WriteString("GET " + c.obfsURI + " HTTP/1.1\r\n")
|
||||
buf.WriteString("Host: " + c.obfsHost + "\r\n")
|
||||
buf.WriteString("User-Agent: " + c.obfsUA + "\r\n")
|
||||
buf.WriteString("Upgrade: websocket\r\n")
|
||||
buf.WriteString("Connection: Upgrade\r\n")
|
||||
|
||||
p := make([]byte, 16)
|
||||
rand.Read(p)
|
||||
buf.Write([]byte("Sec-WebSocket-Key: " + base64.StdEncoding.EncodeToString(p) + "\r\n"))
|
||||
buf.WriteString("Sec-WebSocket-Key: " + base64.StdEncoding.EncodeToString(p) + "\r\n")
|
||||
|
||||
buf.Write([]byte("\r\n"))
|
||||
buf.WriteString("\r\n")
|
||||
|
||||
return c.Conn.Write(buf.Bytes())
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ func NewPktConn(c net.PacketConn, writeAddr net.Addr, tgtAddr socks.Addr, tgtHea
|
||||
|
||||
if ctrlConn != nil {
|
||||
go func() {
|
||||
buf := []byte{}
|
||||
buf := make([]byte, 1)
|
||||
for {
|
||||
_, err := ctrlConn.Read(buf)
|
||||
if err, ok := err.(net.Error); ok && err.Timeout() {
|
||||
|
@ -9,6 +9,7 @@
|
||||
// socks5 server:
|
||||
// https://github.com/shadowsocks/go-shadowsocks2/tree/master/socks
|
||||
|
||||
// Package socks5 implements a socks5 proxy.
|
||||
package socks5
|
||||
|
||||
import (
|
||||
@ -114,7 +115,7 @@ func (s *SOCKS5) Serve(c net.Conn) {
|
||||
if err != nil {
|
||||
// UDP: keep the connection until disconnect then free the UDP socket
|
||||
if err == socks.Errors[9] {
|
||||
buf := []byte{}
|
||||
buf := make([]byte, 1)
|
||||
// block here
|
||||
for {
|
||||
_, err := c.Read(buf)
|
||||
|
@ -15,20 +15,20 @@ import (
|
||||
|
||||
var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")
|
||||
|
||||
// Client ws client
|
||||
// Client is ws client struct.
|
||||
type Client struct {
|
||||
host string
|
||||
path string
|
||||
}
|
||||
|
||||
// Conn is a connection to ws server
|
||||
// Conn is a connection to ws server.
|
||||
type Conn struct {
|
||||
net.Conn
|
||||
reader io.Reader
|
||||
writer io.Writer
|
||||
}
|
||||
|
||||
// NewClient .
|
||||
// NewClient creates a new ws client.
|
||||
func NewClient(host, path string) (*Client, error) {
|
||||
if path == "" {
|
||||
path = "/"
|
||||
@ -37,33 +37,38 @@ func NewClient(host, path string) (*Client, error) {
|
||||
return c, nil
|
||||
}
|
||||
|
||||
// NewConn .
|
||||
// NewConn creates a new ws client connection.
|
||||
func (c *Client) NewConn(rc net.Conn, target string) (*Conn, error) {
|
||||
conn := &Conn{Conn: rc}
|
||||
return conn, conn.Handshake(c.host, c.path)
|
||||
}
|
||||
|
||||
// Handshake handshakes with the server using HTTP to request a protocol upgrade
|
||||
// Handshake handshakes with the server using HTTP to request a protocol upgrade.
|
||||
func (c *Conn) Handshake(host, path string) error {
|
||||
clientKey := generateClientKey()
|
||||
|
||||
var buf bytes.Buffer
|
||||
buf.Write([]byte("GET " + path + " HTTP/1.1\r\n"))
|
||||
buf.Write([]byte("Host: " + host + "\r\n"))
|
||||
buf.Write([]byte("Upgrade: websocket\r\n"))
|
||||
buf.Write([]byte("Connection: Upgrade\r\n"))
|
||||
buf.Write([]byte("Origin: http://" + host + "\r\n"))
|
||||
buf.Write([]byte("Sec-WebSocket-Key: " + clientKey + "\r\n"))
|
||||
buf.Write([]byte("Sec-WebSocket-Protocol: binary\r\n"))
|
||||
buf.Write([]byte("Sec-WebSocket-Version: 13\r\n"))
|
||||
buf.Write([]byte("\r\n"))
|
||||
buf.WriteString("GET " + path + " HTTP/1.1\r\n")
|
||||
buf.WriteString("Host: " + host + "\r\n")
|
||||
buf.WriteString("Upgrade: websocket\r\n")
|
||||
buf.WriteString("Connection: Upgrade\r\n")
|
||||
buf.WriteString("Origin: http://" + host + "\r\n")
|
||||
buf.WriteString("Sec-WebSocket-Key: " + clientKey + "\r\n")
|
||||
buf.WriteString("Sec-WebSocket-Protocol: binary\r\n")
|
||||
buf.WriteString("Sec-WebSocket-Version: 13\r\n")
|
||||
buf.WriteString(("\r\n"))
|
||||
|
||||
if _, err := c.Conn.Write(buf.Bytes()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
tpr := textproto.NewReader(bufio.NewReader(c.Conn))
|
||||
_, code, _, ok := parseFirstLine(tpr)
|
||||
line, err := tpr.ReadLine()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, code, _, ok := parseFirstLine(line)
|
||||
if !ok || code != "101" {
|
||||
return errors.New("[ws] error in ws handshake parseFirstLine")
|
||||
}
|
||||
@ -99,14 +104,7 @@ func (c *Conn) Read(b []byte) (n int, err error) {
|
||||
|
||||
// parseFirstLine parses "GET /foo HTTP/1.1" OR "HTTP/1.1 200 OK" into its three parts.
|
||||
// TODO: move to separate http lib package for reuse(also for http proxy module)
|
||||
func parseFirstLine(tp *textproto.Reader) (r1, r2, r3 string, ok bool) {
|
||||
line, err := tp.ReadLine()
|
||||
// log.F("first line: %s", line)
|
||||
if err != nil {
|
||||
// log.F("[ws] read first line error:%s", err)
|
||||
return
|
||||
}
|
||||
|
||||
func parseFirstLine(line string) (r1, r2, r3 string, ok bool) {
|
||||
s1 := strings.Index(line, " ")
|
||||
s2 := strings.Index(line[s1+1:], " ")
|
||||
if s1 < 0 || s2 < 0 {
|
||||
|
@ -45,7 +45,7 @@ type frameWriter struct {
|
||||
maskKey []byte
|
||||
}
|
||||
|
||||
// FrameWriter returns a frame writer
|
||||
// FrameWriter returns a frame writer.
|
||||
func FrameWriter(w io.Writer) io.Writer {
|
||||
n := rand.Uint32()
|
||||
return &frameWriter{
|
||||
@ -130,7 +130,7 @@ type frameReader struct {
|
||||
leftBytes int64
|
||||
}
|
||||
|
||||
// FrameReader returns a chunked reader
|
||||
// FrameReader returns a chunked reader.
|
||||
func FrameReader(r io.Reader) io.Reader {
|
||||
return &frameReader{
|
||||
Reader: r,
|
||||
|
@ -1,3 +1,4 @@
|
||||
// Package ws implements a simple websocket client.
|
||||
package ws
|
||||
|
||||
import (
|
||||
@ -10,7 +11,7 @@ import (
|
||||
"github.com/nadoo/glider/proxy"
|
||||
)
|
||||
|
||||
// WS .
|
||||
// WS is the base ws proxy struct.
|
||||
type WS struct {
|
||||
dialer proxy.Dialer
|
||||
addr string
|
||||
@ -63,7 +64,7 @@ func NewWSDialer(s string, dialer proxy.Dialer) (proxy.Dialer, error) {
|
||||
return NewWS(s, dialer)
|
||||
}
|
||||
|
||||
// Addr returns forwarder's address
|
||||
// Addr returns forwarder's address.
|
||||
func (s *WS) Addr() string {
|
||||
if s.addr == "" {
|
||||
return s.dialer.Addr()
|
||||
@ -71,7 +72,7 @@ func (s *WS) Addr() string {
|
||||
return s.addr
|
||||
}
|
||||
|
||||
// NextDialer returns the next dialer
|
||||
// NextDialer returns the next dialer.
|
||||
func (s *WS) NextDialer(dstAddr string) proxy.Dialer { return s.dialer.NextDialer(dstAddr) }
|
||||
|
||||
// Dial connects to the address addr on the network net via the proxy.
|
||||
|
Loading…
Reference in New Issue
Block a user