1
// Copyright 2011 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
16
func TestFromURL(t *testing.T) {
17
endSystem, err := net.Listen("tcp", "127.0.0.1:0")
19
t.Fatalf("net.Listen failed: %v", err)
21
defer endSystem.Close()
22
gateway, err := net.Listen("tcp", "127.0.0.1:0")
24
t.Fatalf("net.Listen failed: %v", err)
30
go socks5Gateway(t, gateway, endSystem, socks5Domain, &wg)
32
url, err := url.Parse("socks5://user:password@" + gateway.Addr().String())
34
t.Fatalf("url.Parse failed: %v", err)
36
proxy, err := FromURL(url, Direct)
38
t.Fatalf("FromURL failed: %v", err)
40
_, port, err := net.SplitHostPort(endSystem.Addr().String())
42
t.Fatalf("net.SplitHostPort failed: %v", err)
44
if c, err := proxy.Dial("tcp", "localhost:"+port); err != nil {
45
t.Fatalf("FromURL.Dial failed: %v", err)
53
func TestSOCKS5(t *testing.T) {
54
endSystem, err := net.Listen("tcp", "127.0.0.1:0")
56
t.Fatalf("net.Listen failed: %v", err)
58
defer endSystem.Close()
59
gateway, err := net.Listen("tcp", "127.0.0.1:0")
61
t.Fatalf("net.Listen failed: %v", err)
67
go socks5Gateway(t, gateway, endSystem, socks5IP4, &wg)
69
proxy, err := SOCKS5("tcp", gateway.Addr().String(), nil, Direct)
71
t.Fatalf("SOCKS5 failed: %v", err)
73
if c, err := proxy.Dial("tcp", endSystem.Addr().String()); err != nil {
74
t.Fatalf("SOCKS5.Dial failed: %v", err)
82
func socks5Gateway(t *testing.T, gateway, endSystem net.Listener, typ byte, wg *sync.WaitGroup) {
85
c, err := gateway.Accept()
87
t.Errorf("net.Listener.Accept failed: %v", err)
94
if typ == socks5Domain {
99
if _, err := io.ReadFull(c, b[:n]); err != nil {
100
t.Errorf("io.ReadFull failed: %v", err)
103
if _, err := c.Write([]byte{socks5Version, socks5AuthNone}); err != nil {
104
t.Errorf("net.Conn.Write failed: %v", err)
107
if typ == socks5Domain {
112
if _, err := io.ReadFull(c, b[:n]); err != nil {
113
t.Errorf("io.ReadFull failed: %v", err)
116
if b[0] != socks5Version || b[1] != socks5Connect || b[2] != 0x00 || b[3] != typ {
117
t.Errorf("got an unexpected packet: %#02x %#02x %#02x %#02x", b[0], b[1], b[2], b[3])
120
if typ == socks5Domain {
121
copy(b[:5], []byte{socks5Version, 0x00, 0x00, socks5Domain, 9})
122
b = append(b, []byte("localhost")...)
124
copy(b[:4], []byte{socks5Version, 0x00, 0x00, socks5IP4})
126
host, port, err := net.SplitHostPort(endSystem.Addr().String())
128
t.Errorf("net.SplitHostPort failed: %v", err)
131
b = append(b, []byte(net.ParseIP(host).To4())...)
132
p, err := strconv.Atoi(port)
134
t.Errorf("strconv.Atoi failed: %v", err)
137
b = append(b, []byte{byte(p >> 8), byte(p)}...)
138
if _, err := c.Write(b); err != nil {
139
t.Errorf("net.Conn.Write failed: %v", err)