| 765 | } |
| 766 | |
| 767 | func TestSocksProxyDial(t *testing.T) { |
| 768 | s := newServer(t) |
| 769 | defer s.Close() |
| 770 | |
| 771 | proxyListener, err := net.Listen("tcp", "127.0.0.1:0") |
| 772 | if err != nil { |
| 773 | t.Fatalf("listen failed: %v", err) |
| 774 | } |
| 775 | defer proxyListener.Close() |
| 776 | go func() { |
| 777 | c1, err := proxyListener.Accept() |
| 778 | if err != nil { |
| 779 | t.Errorf("proxy accept failed: %v", err) |
| 780 | return |
| 781 | } |
| 782 | defer c1.Close() |
| 783 | |
| 784 | c1.SetDeadline(time.Now().Add(30 * time.Second)) |
| 785 | |
| 786 | buf := make([]byte, 32) |
| 787 | if _, err := io.ReadFull(c1, buf[:3]); err != nil { |
| 788 | t.Errorf("read failed: %v", err) |
| 789 | return |
| 790 | } |
| 791 | if want := []byte{5, 1, 0}; !bytes.Equal(want, buf[:len(want)]) { |
| 792 | t.Errorf("read %x, want %x", buf[:len(want)], want) |
| 793 | } |
| 794 | if _, err := c1.Write([]byte{5, 0}); err != nil { |
| 795 | t.Errorf("write failed: %v", err) |
| 796 | return |
| 797 | } |
| 798 | if _, err := io.ReadFull(c1, buf[:10]); err != nil { |
| 799 | t.Errorf("read failed: %v", err) |
| 800 | return |
| 801 | } |
| 802 | if want := []byte{5, 1, 0, 1}; !bytes.Equal(want, buf[:len(want)]) { |
| 803 | t.Errorf("read %x, want %x", buf[:len(want)], want) |
| 804 | return |
| 805 | } |
| 806 | buf[1] = 0 |
| 807 | if _, err := c1.Write(buf[:10]); err != nil { |
| 808 | t.Errorf("write failed: %v", err) |
| 809 | return |
| 810 | } |
| 811 | |
| 812 | ip := net.IP(buf[4:8]) |
| 813 | port := binary.BigEndian.Uint16(buf[8:10]) |
| 814 | |
| 815 | c2, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: int(port)}) |
| 816 | if err != nil { |
| 817 | t.Errorf("dial failed; %v", err) |
| 818 | return |
| 819 | } |
| 820 | defer c2.Close() |
| 821 | done := make(chan struct{}) |
| 822 | go func() { |
| 823 | io.Copy(c1, c2) |
| 824 | close(done) |