MCPcopy Create free account
hub / github.com/chainreactors/EvilProxy / Dial

Method Dial

sdk/proxyutil/proxy.go:158–214  ·  view source on GitHub ↗
(network, addr string)

Source from the content-addressed store, hash-verified

156}
157
158func (d *httpConnectDialer) Dial(network, addr string) (net.Conn, error) {
159 proxyConn, errDial := d.dialer.Dial(network, proxyDialAddr(d.proxyURL))
160 if errDial != nil {
161 return nil, fmt.Errorf("dial HTTP proxy failed: %w", errDial)
162 }
163
164 conn := proxyConn
165 if d.proxyURL.Scheme == "https" {
166 tlsConn := tls.Client(conn, &tls.Config{ServerName: d.proxyURL.Hostname()})
167 if errHandshake := tlsConn.Handshake(); errHandshake != nil {
168 if errClose := conn.Close(); errClose != nil {
169 return nil, fmt.Errorf("HTTPS proxy TLS handshake failed: %w; close failed: %v", errHandshake, errClose)
170 }
171 return nil, fmt.Errorf("HTTPS proxy TLS handshake failed: %w", errHandshake)
172 }
173 conn = tlsConn
174 }
175
176 req := &http.Request{
177 Method: http.MethodConnect,
178 URL: &url.URL{Host: addr},
179 Host: addr,
180 Header: make(http.Header),
181 }
182 if d.proxyURL.User != nil {
183 req.Header.Set("Proxy-Authorization", proxyAuthorization(d.proxyURL.User))
184 }
185 if errWrite := req.Write(conn); errWrite != nil {
186 if errClose := conn.Close(); errClose != nil {
187 return nil, fmt.Errorf("write CONNECT request failed: %w; close failed: %v", errWrite, errClose)
188 }
189 return nil, fmt.Errorf("write CONNECT request failed: %w", errWrite)
190 }
191
192 reader := bufio.NewReader(conn)
193 resp, errRead := http.ReadResponse(reader, req)
194 if errRead != nil {
195 if errClose := conn.Close(); errClose != nil {
196 return nil, fmt.Errorf("read CONNECT response failed: %w; close failed: %v", errRead, errClose)
197 }
198 return nil, fmt.Errorf("read CONNECT response failed: %w", errRead)
199 }
200 if resp.StatusCode != http.StatusOK {
201 if resp.Body != nil {
202 _ = resp.Body.Close()
203 }
204 if errClose := conn.Close(); errClose != nil {
205 return nil, fmt.Errorf("proxy CONNECT returned status %s; close failed: %v", resp.Status, errClose)
206 }
207 return nil, fmt.Errorf("proxy CONNECT returned status %s", resp.Status)
208 }
209
210 if reader.Buffered() > 0 {
211 return &bufferedConn{Conn: conn, reader: reader}, nil
212 }
213 return conn, nil
214}
215

Calls 5

proxyDialAddrFunction · 0.85
proxyAuthorizationFunction · 0.85
CloseMethod · 0.65
SetMethod · 0.45
WriteMethod · 0.45