@@ -13,6 +13,7 @@ import (
13
13
"io"
14
14
"net"
15
15
"net/http"
16
+ "net/http/httptrace"
16
17
"net/url"
17
18
"sync"
18
19
"time"
@@ -38,7 +39,7 @@ var defaultHeader = http.Header{
38
39
type DialFn = func (network , addr string ) (net.Conn , error )
39
40
40
41
type Conn struct {
41
- initFn func () (io.ReadCloser , error )
42
+ initFn func () (io.ReadCloser , netAddr , error )
42
43
writer io.Writer
43
44
flusher http.Flusher
44
45
netAddr
@@ -60,14 +61,15 @@ type Config struct {
60
61
}
61
62
62
63
func (g * Conn ) initReader () {
63
- reader , err := g .initFn ()
64
+ reader , addr , err := g .initFn ()
64
65
if err != nil {
65
66
g .err = err
66
67
if closer , ok := g .writer .(io.Closer ); ok {
67
68
closer .Close ()
68
69
}
69
70
return
70
71
}
72
+ g .netAddr = addr
71
73
72
74
if ! g .close .Load () {
73
75
g .reader = reader
@@ -209,15 +211,11 @@ func (g *Conn) SetDeadline(t time.Time) error {
209
211
}
210
212
211
213
func NewHTTP2Client (dialFn DialFn , tlsConfig * tls.Config , Fingerprint string , realityConfig * tlsC.RealityConfig ) * TransportWrap {
212
- wrap := TransportWrap {}
213
-
214
214
dialFunc := func (ctx context.Context , network , addr string , cfg * tls.Config ) (net.Conn , error ) {
215
215
pconn , err := dialFn (network , addr )
216
216
if err != nil {
217
217
return nil , err
218
218
}
219
- wrap .remoteAddr = pconn .RemoteAddr ()
220
- wrap .localAddr = pconn .LocalAddr ()
221
219
222
220
if tlsConfig == nil {
223
221
return pconn , nil
@@ -269,15 +267,17 @@ func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, re
269
267
return conn , nil
270
268
}
271
269
272
- wrap . Transport = & http2.Transport {
270
+ transport : = & http2.Transport {
273
271
DialTLSContext : dialFunc ,
274
272
TLSClientConfig : tlsConfig ,
275
273
AllowHTTP : false ,
276
274
DisableCompression : true ,
277
275
PingTimeout : 0 ,
278
276
}
279
-
280
- return & wrap
277
+ wrap := & TransportWrap {
278
+ Transport : transport ,
279
+ }
280
+ return wrap
281
281
}
282
282
283
283
func StreamGunWithTransport (transport * TransportWrap , cfg * Config ) (net.Conn , error ) {
@@ -304,15 +304,22 @@ func StreamGunWithTransport(transport *TransportWrap, cfg *Config) (net.Conn, er
304
304
}
305
305
306
306
conn := & Conn {
307
- initFn : func () (io.ReadCloser , error ) {
307
+ initFn : func () (io.ReadCloser , netAddr , error ) {
308
+ nAddr := netAddr {}
309
+ trace := & httptrace.ClientTrace {
310
+ GotConn : func (connInfo httptrace.GotConnInfo ) {
311
+ nAddr .localAddr = connInfo .Conn .LocalAddr ()
312
+ nAddr .remoteAddr = connInfo .Conn .RemoteAddr ()
313
+ },
314
+ }
315
+ request = request .WithContext (httptrace .WithClientTrace (request .Context (), trace ))
308
316
response , err := transport .RoundTrip (request )
309
317
if err != nil {
310
- return nil , err
318
+ return nil , nAddr , err
311
319
}
312
- return response .Body , nil
320
+ return response .Body , nAddr , nil
313
321
},
314
- writer : writer ,
315
- netAddr : transport .netAddr ,
322
+ writer : writer ,
316
323
}
317
324
318
325
go conn .Init ()
0 commit comments