MCPcopy
hub / github.com/txthinking/brook / Handle

Method Handle

socks5tohttp.go:95–184  ·  view source on GitHub ↗
(c *net.TCPConn)

Source from the content-addressed store, hash-verified

93}
94
95func (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

Callers 1

ListenAndServeMethod · 0.95

Calls 6

GetAddressFromURLFunction · 0.85
DialMethod · 0.80
ReadMethod · 0.45
CloseMethod · 0.45
SetDeadlineMethod · 0.45
WriteMethod · 0.45

Tested by

no test coverage detected