(c *net.TCPConn)
| 93 | } |
| 94 | |
| 95 | func (s *Socks5ToHTTP) Handle(c *net.TCPConn) error { |
| 96 | b := make([]byte, 0, 1024) |
| 97 | for { |
| 98 | var b1 [1024]byte |
| 99 | n, err := c.Read(b1[:]) |
| 100 | if err != nil { |
| 101 | return err |
| 102 | } |
| 103 | b = append(b, b1[:n]...) |
| 104 | if bytes.Contains(b, []byte{0x0d, 0x0a, 0x0d, 0x0a}) { |
| 105 | break |
| 106 | } |
| 107 | if len(b) >= 2083+18 { |
| 108 | return errors.New("HTTP header too long") |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | bb := bytes.SplitN(b, []byte(" "), 3) |
| 113 | if len(bb) != 3 { |
| 114 | return errors.New("Invalid Request") |
| 115 | } |
| 116 | method, address := string(bb[0]), string(bb[1]) |
| 117 | var addr string |
| 118 | if method == "CONNECT" { |
| 119 | addr = address |
| 120 | } |
| 121 | if method != "CONNECT" { |
| 122 | var err error |
| 123 | addr, err = GetAddressFromURL(address) |
| 124 | if err != nil { |
| 125 | return err |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | tmp, err := s.Dial.Dial("tcp", addr) |
| 130 | if err != nil { |
| 131 | return err |
| 132 | } |
| 133 | rc := tmp.(*net.TCPConn) |
| 134 | defer rc.Close() |
| 135 | if s.TCPTimeout != 0 { |
| 136 | if err := rc.SetDeadline(time.Now().Add(time.Duration(s.TCPTimeout) * time.Second)); err != nil { |
| 137 | return err |
| 138 | } |
| 139 | } |
| 140 | if method == "CONNECT" { |
| 141 | _, err := c.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) |
| 142 | if err != nil { |
| 143 | return err |
| 144 | } |
| 145 | } |
| 146 | if method != "CONNECT" { |
| 147 | if _, err := rc.Write(b); err != nil { |
| 148 | return err |
| 149 | } |
| 150 | } |
| 151 | go func() { |
| 152 | var bf [1024 * 2]byte |
no test coverage detected