5
5
package websocket
6
6
7
7
import (
8
+ "bytes"
8
9
"crypto/tls"
9
10
"crypto/x509"
10
11
"encoding/base64"
12
+ "encoding/binary"
11
13
"io"
12
14
"io/ioutil"
15
+ "net"
13
16
"net/http"
14
17
"net/http/cookiejar"
15
18
"net/http/httptest"
@@ -31,9 +34,10 @@ var cstUpgrader = Upgrader{
31
34
}
32
35
33
36
var cstDialer = Dialer {
34
- Subprotocols : []string {"p1" , "p2" },
35
- ReadBufferSize : 1024 ,
36
- WriteBufferSize : 1024 ,
37
+ Subprotocols : []string {"p1" , "p2" },
38
+ ReadBufferSize : 1024 ,
39
+ WriteBufferSize : 1024 ,
40
+ HandshakeTimeout : 30 * time .Second ,
37
41
}
38
42
39
43
type cstHandler struct { * testing.T }
@@ -143,8 +147,9 @@ func TestProxyDial(t *testing.T) {
143
147
s := newServer (t )
144
148
defer s .Close ()
145
149
146
- surl , _ := url .Parse (s .URL )
150
+ surl , _ := url .Parse (s .Server . URL )
147
151
152
+ cstDialer := cstDialer // make local copy for modification on next line.
148
153
cstDialer .Proxy = http .ProxyURL (surl )
149
154
150
155
connect := false
@@ -173,16 +178,16 @@ func TestProxyDial(t *testing.T) {
173
178
}
174
179
defer ws .Close ()
175
180
sendRecv (t , ws )
176
-
177
- cstDialer .Proxy = http .ProxyFromEnvironment
178
181
}
179
182
180
183
func TestProxyAuthorizationDial (t * testing.T ) {
181
184
s := newServer (t )
182
185
defer s .Close ()
183
186
184
- surl , _ := url .Parse (s .URL )
187
+ surl , _ := url .Parse (s .Server . URL )
185
188
surl .User = url .UserPassword ("username" , "password" )
189
+
190
+ cstDialer := cstDialer // make local copy for modification on next line.
186
191
cstDialer .Proxy = http .ProxyURL (surl )
187
192
188
193
connect := false
@@ -213,8 +218,6 @@ func TestProxyAuthorizationDial(t *testing.T) {
213
218
}
214
219
defer ws .Close ()
215
220
sendRecv (t , ws )
216
-
217
- cstDialer .Proxy = http .ProxyFromEnvironment
218
221
}
219
222
220
223
func TestDial (t * testing.T ) {
@@ -518,3 +521,82 @@ func TestDialCompression(t *testing.T) {
518
521
defer ws .Close ()
519
522
sendRecv (t , ws )
520
523
}
524
+
525
+ func TestSocksProxyDial (t * testing.T ) {
526
+ s := newServer (t )
527
+ defer s .Close ()
528
+
529
+ proxyListener , err := net .Listen ("tcp" , "127.0.0.1:0" )
530
+ if err != nil {
531
+ t .Fatalf ("listen failed: %v" , err )
532
+ }
533
+ defer proxyListener .Close ()
534
+ go func () {
535
+ c1 , err := proxyListener .Accept ()
536
+ if err != nil {
537
+ t .Errorf ("proxy accept failed: %v" , err )
538
+ return
539
+ }
540
+ defer c1 .Close ()
541
+
542
+ c1 .SetDeadline (time .Now ().Add (30 * time .Second ))
543
+
544
+ buf := make ([]byte , 32 )
545
+ if _ , err := io .ReadFull (c1 , buf [:3 ]); err != nil {
546
+ t .Errorf ("read failed: %v" , err )
547
+ return
548
+ }
549
+ if want := []byte {5 , 1 , 0 }; ! bytes .Equal (want , buf [:len (want )]) {
550
+ t .Errorf ("read %x, want %x" , buf [:len (want )], want )
551
+ }
552
+ if _ , err := c1 .Write ([]byte {5 , 0 }); err != nil {
553
+ t .Errorf ("write failed: %v" , err )
554
+ return
555
+ }
556
+ if _ , err := io .ReadFull (c1 , buf [:10 ]); err != nil {
557
+ t .Errorf ("read failed: %v" , err )
558
+ return
559
+ }
560
+ if want := []byte {5 , 1 , 0 , 1 }; ! bytes .Equal (want , buf [:len (want )]) {
561
+ t .Errorf ("read %x, want %x" , buf [:len (want )], want )
562
+ return
563
+ }
564
+ buf [1 ] = 0
565
+ if _ , err := c1 .Write (buf [:10 ]); err != nil {
566
+ t .Errorf ("write failed: %v" , err )
567
+ return
568
+ }
569
+
570
+ ip := net .IP (buf [4 :8 ])
571
+ port := binary .BigEndian .Uint16 (buf [8 :10 ])
572
+
573
+ c2 , err := net .DialTCP ("tcp" , nil , & net.TCPAddr {IP : ip , Port : int (port )})
574
+ if err != nil {
575
+ t .Errorf ("dial failed; %v" , err )
576
+ return
577
+ }
578
+ defer c2 .Close ()
579
+ done := make (chan struct {})
580
+ go func () {
581
+ io .Copy (c1 , c2 )
582
+ close (done )
583
+ }()
584
+ io .Copy (c2 , c1 )
585
+ <- done
586
+ }()
587
+
588
+ purl , err := url .Parse ("socks5://" + proxyListener .Addr ().String ())
589
+ if err != nil {
590
+ t .Fatalf ("parse failed: %v" , err )
591
+ }
592
+
593
+ cstDialer := cstDialer // make local copy for modification on next line.
594
+ cstDialer .Proxy = http .ProxyURL (purl )
595
+
596
+ ws , _ , err := cstDialer .Dial (s .URL , nil )
597
+ if err != nil {
598
+ t .Fatalf ("Dial: %v" , err )
599
+ }
600
+ defer ws .Close ()
601
+ sendRecv (t , ws )
602
+ }
0 commit comments