17 recvSocks chan<- net.Conn |
17 recvSocks chan<- net.Conn |
18 sendSocks chan net.Conn |
18 sendSocks chan net.Conn |
19 } |
19 } |
20 |
20 |
21 func startLayer1(sock net.Conn, recvWriter io.WriteCloser, |
21 func startLayer1(sock net.Conn, recvWriter io.WriteCloser, |
22 sendReader io.ReadCloser) *layer1 { |
22 sendReader io.ReadCloser, status <-chan Status) *layer1 { |
23 l1 := layer1{sock: sock} |
23 l1 := layer1{sock: sock} |
24 recvSocks := make(chan net.Conn) |
24 recvSocks := make(chan net.Conn) |
25 l1.recvSocks = recvSocks |
25 l1.recvSocks = recvSocks |
26 sendSocks := make(chan net.Conn, 1) |
26 sendSocks := make(chan net.Conn, 1) |
27 l1.sendSocks = sendSocks |
27 l1.sendSocks = sendSocks |
28 go recvTransport(recvSocks, recvWriter) |
28 go recvTransport(recvSocks, recvWriter, status) |
29 go sendTransport(sendSocks, sendReader) |
29 go sendTransport(sendSocks, sendReader) |
30 recvSocks <- sock |
30 recvSocks <- sock |
31 sendSocks <- sock |
31 sendSocks <- sock |
32 return &l1 |
32 return &l1 |
33 } |
33 } |
48 l1.sock = tls.Client(l1.sock, conf) |
48 l1.sock = tls.Client(l1.sock, conf) |
49 sendSockToSender(l1.sock) |
49 sendSockToSender(l1.sock) |
50 l1.recvSocks <- l1.sock |
50 l1.recvSocks <- l1.sock |
51 } |
51 } |
52 |
52 |
53 func recvTransport(socks <-chan net.Conn, w io.WriteCloser) { |
53 func recvTransport(socks <-chan net.Conn, w io.WriteCloser, |
|
54 status <-chan Status) { |
|
55 |
54 defer w.Close() |
56 defer w.Close() |
55 var sock net.Conn |
57 var sock net.Conn |
56 p := make([]byte, 1024) |
58 p := make([]byte, 1024) |
57 for { |
59 for { |
58 select { |
60 select { |
|
61 case stat := <-status: |
|
62 if stat == StatusShutdown { |
|
63 return |
|
64 } |
|
65 |
59 case sock = <-socks: |
66 case sock = <-socks: |
60 default: |
67 default: |
61 } |
68 } |
62 |
69 |
63 if sock == nil { |
70 if sock == nil { |