Skip to content

Commit 23ffe45

Browse files
committed
chore: using http/httptrace to get local/remoteAddr for grpc client
1 parent 7b37fcf commit 23ffe45

File tree

3 files changed

+35
-36
lines changed

3 files changed

+35
-36
lines changed

transport/gun/gun.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"io"
1414
"net"
1515
"net/http"
16+
"net/http/httptrace"
1617
"net/url"
1718
"sync"
1819
"time"
@@ -38,7 +39,7 @@ var defaultHeader = http.Header{
3839
type DialFn = func(network, addr string) (net.Conn, error)
3940

4041
type Conn struct {
41-
initFn func() (io.ReadCloser, error)
42+
initFn func() (io.ReadCloser, netAddr, error)
4243
writer io.Writer
4344
flusher http.Flusher
4445
netAddr
@@ -60,14 +61,15 @@ type Config struct {
6061
}
6162

6263
func (g *Conn) initReader() {
63-
reader, err := g.initFn()
64+
reader, addr, err := g.initFn()
6465
if err != nil {
6566
g.err = err
6667
if closer, ok := g.writer.(io.Closer); ok {
6768
closer.Close()
6869
}
6970
return
7071
}
72+
g.netAddr = addr
7173

7274
if !g.close.Load() {
7375
g.reader = reader
@@ -209,15 +211,11 @@ func (g *Conn) SetDeadline(t time.Time) error {
209211
}
210212

211213
func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, realityConfig *tlsC.RealityConfig) *TransportWrap {
212-
wrap := TransportWrap{}
213-
214214
dialFunc := func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) {
215215
pconn, err := dialFn(network, addr)
216216
if err != nil {
217217
return nil, err
218218
}
219-
wrap.remoteAddr = pconn.RemoteAddr()
220-
wrap.localAddr = pconn.LocalAddr()
221219

222220
if tlsConfig == nil {
223221
return pconn, nil
@@ -269,15 +267,17 @@ func NewHTTP2Client(dialFn DialFn, tlsConfig *tls.Config, Fingerprint string, re
269267
return conn, nil
270268
}
271269

272-
wrap.Transport = &http2.Transport{
270+
transport := &http2.Transport{
273271
DialTLSContext: dialFunc,
274272
TLSClientConfig: tlsConfig,
275273
AllowHTTP: false,
276274
DisableCompression: true,
277275
PingTimeout: 0,
278276
}
279-
280-
return &wrap
277+
wrap := &TransportWrap{
278+
Transport: transport,
279+
}
280+
return wrap
281281
}
282282

283283
func StreamGunWithTransport(transport *TransportWrap, cfg *Config) (net.Conn, error) {
@@ -304,15 +304,22 @@ func StreamGunWithTransport(transport *TransportWrap, cfg *Config) (net.Conn, er
304304
}
305305

306306
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))
308316
response, err := transport.RoundTrip(request)
309317
if err != nil {
310-
return nil, err
318+
return nil, nAddr, err
311319
}
312-
return response.Body, nil
320+
return response.Body, nAddr, nil
313321
},
314-
writer: writer,
315-
netAddr: transport.netAddr,
322+
writer: writer,
316323
}
317324

318325
go conn.Init()

transport/gun/server.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,22 @@ func NewServerHandler(options ServerOption) http.Handler {
4343
writer.WriteHeader(http.StatusOK)
4444

4545
conn := &Conn{
46-
initFn: func() (io.ReadCloser, error) {
47-
return request.Body, nil
46+
initFn: func() (io.ReadCloser, netAddr, error) {
47+
nAddr := netAddr{}
48+
if request.RemoteAddr != "" {
49+
metadata := C.Metadata{}
50+
if err := metadata.SetRemoteAddress(request.RemoteAddr); err == nil {
51+
nAddr.remoteAddr = net.TCPAddrFromAddrPort(metadata.AddrPort())
52+
}
53+
}
54+
if addr, ok := request.Context().Value(http.LocalAddrContextKey).(net.Addr); ok {
55+
nAddr.localAddr = addr
56+
}
57+
return request.Body, nAddr, nil
4858
},
4959
writer: writer,
5060
flusher: writer.(http.Flusher),
5161
}
52-
if request.RemoteAddr != "" {
53-
metadata := C.Metadata{}
54-
if err := metadata.SetRemoteAddress(request.RemoteAddr); err == nil {
55-
conn.remoteAddr = net.TCPAddrFromAddrPort(metadata.AddrPort())
56-
}
57-
}
58-
if addr, ok := request.Context().Value(http.LocalAddrContextKey).(net.Addr); ok {
59-
conn.localAddr = addr
60-
}
6162

6263
wrapper := &h2ConnWrapper{
6364
// gun.Conn can't correct handle ReadDeadline

transport/gun/transport.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,17 @@ import (
77

88
type TransportWrap struct {
99
*http2.Transport
10-
netAddr
11-
}
12-
13-
func (tw *TransportWrap) RemoteAddr() net.Addr {
14-
return tw.remoteAddr
15-
}
16-
17-
func (tw *TransportWrap) LocalAddr() net.Addr {
18-
return tw.localAddr
1910
}
2011

2112
type netAddr struct {
2213
remoteAddr net.Addr
2314
localAddr net.Addr
2415
}
2516

26-
func (addr *netAddr) RemoteAddr() net.Addr {
17+
func (addr netAddr) RemoteAddr() net.Addr {
2718
return addr.remoteAddr
2819
}
2920

30-
func (addr *netAddr) LocalAddr() net.Addr {
21+
func (addr netAddr) LocalAddr() net.Addr {
3122
return addr.localAddr
3223
}

0 commit comments

Comments
 (0)