Skip to content

Commit 445889c

Browse files
committed
add more test cases for socks5
1 parent 72d7850 commit 445889c

23 files changed

+1168
-417
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ go:
55

66
install: true
77
script:
8-
- env GO111MODULE=on go test -race -v -coverprofile=coverage.txt -covermode=atomic
9-
- cd cmd/gost && env GO111MODULE=on go build
8+
- go test -race -v -coverprofile=coverage.txt -covermode=atomic
9+
- cd cmd/gost && go build
1010

1111
after_success:
1212
- bash <(curl -s https://codecov.io/bash)

bypass_test.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gost
22

33
import (
44
"bytes"
5+
"fmt"
56
"io"
67
"testing"
78
"time"
@@ -158,10 +159,13 @@ var bypassContainTests = []struct {
158159

159160
func TestBypassContains(t *testing.T) {
160161
for i, tc := range bypassContainTests {
161-
bp := NewBypassPatterns(tc.reversed, tc.patterns...)
162-
if bp.Contains(tc.addr) != tc.bypassed {
163-
t.Errorf("#%d test failed: %v, %s", i, tc.patterns, tc.addr)
164-
}
162+
tc := tc
163+
t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) {
164+
bp := NewBypassPatterns(tc.reversed, tc.patterns...)
165+
if bp.Contains(tc.addr) != tc.bypassed {
166+
t.Errorf("#%d test failed: %v, %s", i, tc.patterns, tc.addr)
167+
}
168+
})
165169
}
166170
}
167171

@@ -244,6 +248,9 @@ func TestByapssReload(t *testing.T) {
244248
}
245249
if tc.stopped {
246250
bp.Stop()
251+
if bp.Period() >= 0 {
252+
t.Errorf("period of the stopped reloader should be minus value")
253+
}
247254
}
248255
if bp.Stopped() != tc.stopped {
249256
t.Errorf("#%d test failed: stopped value should be %v, got %v",

cmd/gost/.config/dns.txt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
# resolver timeout, default 30s.
22
timeout 10s
33

4-
# resolver cache TTL, default 60s, minus value means that cache is disabled.
5-
ttl 300s
4+
# resolver cache TTL,
5+
# minus value means that cache is disabled,
6+
# default to the TTL in DNS server response.
7+
# ttl 300s
68

79
# period for live reloading
810
reload 10s
911

1012
# ip[:port] [protocol] [hostname]
1113

14+
https://1.0.0.1/dns-query
1215
1.1.1.1:853 tls cloudflare-dns.com
13-
https://1.0.0.1/dns-query https
1416
8.8.8.8
1517
8.8.8.8 tcp
1618
1.1.1.1 udp

cmd/gost/cfg.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"net/url"
1111
"os"
1212
"strings"
13-
"time"
1413

1514
"github.com/ginuerzh/gost"
1615
)
@@ -196,8 +195,6 @@ func parseResolver(cfg string) gost.Resolver {
196195
if cfg == "" {
197196
return nil
198197
}
199-
timeout := 30 * time.Second
200-
ttl := 60 * time.Second
201198
var nss []gost.NameServer
202199

203200
f, err := os.Open(cfg)
@@ -237,11 +234,11 @@ func parseResolver(cfg string) gost.Resolver {
237234
}
238235
}
239236
}
240-
return gost.NewResolver(timeout, ttl, nss...)
237+
return gost.NewResolver(0, nss...)
241238
}
242239
defer f.Close()
243240

244-
resolver := gost.NewResolver(timeout, ttl)
241+
resolver := gost.NewResolver(0)
245242
resolver.Reload(f)
246243

247244
go gost.PeriodReload(resolver, cfg)

common_test.go

Lines changed: 126 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package gost
22

33
import (
4+
"bufio"
45
"bytes"
56
"crypto/tls"
7+
"errors"
68
"fmt"
79
"io"
10+
"io/ioutil"
811
"net"
912
"net/http"
13+
"net/url"
1014
"sync"
1115
"time"
1216
)
@@ -37,6 +41,110 @@ var (
3741
})
3842
)
3943

44+
// proxyConn obtains a connection to the proxy server.
45+
func proxyConn(client *Client, server *Server) (net.Conn, error) {
46+
conn, err := client.Dial(server.Addr().String())
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
cc, err := client.Handshake(conn, AddrHandshakeOption(server.Addr().String()))
52+
if err != nil {
53+
conn.Close()
54+
return nil, err
55+
}
56+
57+
return cc, nil
58+
}
59+
60+
// httpRoundtrip does a HTTP request-response roundtrip, and checks the data received.
61+
func httpRoundtrip(conn net.Conn, targetURL string, data []byte) (err error) {
62+
req, err := http.NewRequest(
63+
http.MethodGet,
64+
targetURL,
65+
bytes.NewReader(data),
66+
)
67+
if err != nil {
68+
return
69+
}
70+
if err = req.Write(conn); err != nil {
71+
return
72+
}
73+
resp, err := http.ReadResponse(bufio.NewReader(conn), req)
74+
if err != nil {
75+
return
76+
}
77+
defer resp.Body.Close()
78+
79+
if resp.StatusCode != http.StatusOK {
80+
return errors.New(resp.Status)
81+
}
82+
83+
recv, err := ioutil.ReadAll(resp.Body)
84+
if err != nil {
85+
return
86+
}
87+
88+
if !bytes.Equal(data, recv) {
89+
return fmt.Errorf("data not equal")
90+
}
91+
return
92+
}
93+
94+
func udpRoundtrip(client *Client, server *Server, host string, data []byte) (err error) {
95+
conn, err := proxyConn(client, server)
96+
if err != nil {
97+
return
98+
}
99+
defer conn.Close()
100+
101+
conn, err = client.Connect(conn, host)
102+
if err != nil {
103+
return
104+
}
105+
106+
conn.SetDeadline(time.Now().Add(3 * time.Second))
107+
defer conn.SetDeadline(time.Time{})
108+
109+
if _, err = conn.Write(data); err != nil {
110+
return
111+
}
112+
113+
recv := make([]byte, len(data))
114+
if _, err = conn.Read(recv); err != nil {
115+
return
116+
}
117+
118+
if !bytes.Equal(data, recv) {
119+
return fmt.Errorf("data not equal")
120+
}
121+
122+
return
123+
}
124+
125+
func proxyRoundtrip(client *Client, server *Server, targetURL string, data []byte) (err error) {
126+
conn, err := proxyConn(client, server)
127+
if err != nil {
128+
return err
129+
}
130+
defer conn.Close()
131+
132+
u, err := url.Parse(targetURL)
133+
if err != nil {
134+
return
135+
}
136+
137+
conn, err = client.Connect(conn, u.Host)
138+
if err != nil {
139+
return
140+
}
141+
142+
conn.SetDeadline(time.Now().Add(500 * time.Millisecond))
143+
defer conn.SetDeadline(time.Time{})
144+
145+
return httpRoundtrip(conn, targetURL, data)
146+
}
147+
40148
type udpRequest struct {
41149
Body io.Reader
42150
RemoteAddr string
@@ -55,11 +163,12 @@ type udpHandlerFunc func(w io.Writer, r *udpRequest)
55163

56164
// udpTestServer is a UDP server for test.
57165
type udpTestServer struct {
58-
ln net.PacketConn
59-
handler udpHandlerFunc
60-
wg sync.WaitGroup
61-
mu sync.Mutex // guards closed and conns
62-
closed bool
166+
ln net.PacketConn
167+
handler udpHandlerFunc
168+
wg sync.WaitGroup
169+
mu sync.Mutex // guards closed and conns
170+
closed bool
171+
exitChan chan struct{}
63172
}
64173

65174
func newUDPTestServer(handler udpHandlerFunc) *udpTestServer {
@@ -68,9 +177,13 @@ func newUDPTestServer(handler udpHandlerFunc) *udpTestServer {
68177
if err != nil {
69178
panic(fmt.Sprintf("udptest: failed to listen on a port: %v", err))
70179
}
180+
ln.SetReadBuffer(1024 * 1024)
181+
ln.SetWriteBuffer(1024 * 1024)
182+
71183
return &udpTestServer{
72-
ln: ln,
73-
handler: handler,
184+
ln: ln,
185+
handler: handler,
186+
exitChan: make(chan struct{}),
74187
}
75188
}
76189

@@ -83,7 +196,7 @@ func (s *udpTestServer) serve() {
83196
data := make([]byte, 1024)
84197
n, raddr, err := s.ln.ReadFrom(data)
85198
if err != nil {
86-
return
199+
break
87200
}
88201
if s.handler != nil {
89202
s.wg.Add(1)
@@ -101,6 +214,9 @@ func (s *udpTestServer) serve() {
101214
}()
102215
}
103216
}
217+
218+
// signal the listener has been exited.
219+
close(s.exitChan)
104220
}
105221

106222
func (s *udpTestServer) Addr() string {
@@ -119,6 +235,8 @@ func (s *udpTestServer) Close() error {
119235
s.closed = true
120236
s.mu.Unlock()
121237

238+
<-s.exitChan
239+
122240
s.wg.Wait()
123241

124242
return err

forward.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -662,10 +662,6 @@ func TCPRemoteForwardListener(addr string, chain *Chain) (Listener, error) {
662662

663663
go ln.listenLoop()
664664

665-
// if err = <-ln.errChan; err != nil {
666-
// ln.Close()
667-
// }
668-
669665
return ln, err
670666
}
671667

@@ -680,17 +676,10 @@ func (l *tcpRemoteForwardListener) isChainValid() bool {
680676

681677
func (l *tcpRemoteForwardListener) listenLoop() {
682678
var tempDelay time.Duration
683-
// var once sync.Once
684679

685680
for {
686681
conn, err := l.accept()
687682

688-
// once.Do(func() {
689-
// l.errChan <- err
690-
// log.Log("once.Do error:", err)
691-
// close(l.errChan)
692-
// })
693-
694683
select {
695684
case <-l.closed:
696685
if conn != nil {

forward_test.go

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package gost
22

33
import (
4-
"bytes"
54
"crypto/rand"
6-
"fmt"
75
"net/http/httptest"
86
"net/url"
97
"testing"
10-
"time"
118
)
129

1310
func tcpDirectForwardRoundtrip(targetURL string, data []byte) error {
@@ -122,37 +119,6 @@ func BenchmarkTCPDirectForwardParallel(b *testing.B) {
122119
})
123120
}
124121

125-
func udpRoundtrip(client *Client, server *Server, host string, data []byte) (err error) {
126-
conn, err := proxyConn(client, server)
127-
if err != nil {
128-
return
129-
}
130-
defer conn.Close()
131-
132-
conn.SetDeadline(time.Now().Add(1 * time.Second))
133-
defer conn.SetDeadline(time.Time{})
134-
135-
conn, err = client.Connect(conn, host)
136-
if err != nil {
137-
return
138-
}
139-
140-
if _, err = conn.Write(data); err != nil {
141-
return
142-
}
143-
144-
recv := make([]byte, len(data))
145-
if _, err = conn.Read(recv); err != nil {
146-
return
147-
}
148-
149-
if !bytes.Equal(data, recv) {
150-
return fmt.Errorf("data not equal")
151-
}
152-
153-
return
154-
}
155-
156122
func udpDirectForwardRoundtrip(host string, data []byte) error {
157123
ln, err := UDPDirectForwardListener("localhost:0", 0)
158124
if err != nil {

0 commit comments

Comments
 (0)