@@ -3,9 +3,8 @@ package splithttp
3
3
import (
4
4
"bytes"
5
5
"context"
6
- "crypto/tls"
6
+ gotls "crypto/tls"
7
7
"io"
8
- gonet "net"
9
8
"net/http"
10
9
"net/url"
11
10
"strconv"
@@ -24,7 +23,7 @@ import (
24
23
"github.com/xtls/xray-core/transport/internet"
25
24
"github.com/xtls/xray-core/transport/internet/reality"
26
25
"github.com/xtls/xray-core/transport/internet/stat"
27
- v2tls "github.com/xtls/xray-core/transport/internet/tls"
26
+ "github.com/xtls/xray-core/transport/internet/tls"
28
27
"golang.org/x/net/http2"
29
28
"golang.org/x/net/http2/h2c"
30
29
)
@@ -36,7 +35,7 @@ type requestHandler struct {
36
35
ln * Listener
37
36
sessionMu * sync.Mutex
38
37
sessions sync.Map
39
- localAddr gonet. TCPAddr
38
+ localAddr net. Addr
40
39
}
41
40
42
41
type httpSession struct {
@@ -144,14 +143,25 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
144
143
}
145
144
146
145
forwardedAddrs := http_proto .ParseXForwardedFor (request .Header )
147
- remoteAddr , err := gonet .ResolveTCPAddr ("tcp" , request .RemoteAddr )
146
+ var remoteAddr net.Addr
147
+ var err error
148
+ remoteAddr , err = net .ResolveTCPAddr ("tcp" , request .RemoteAddr )
148
149
if err != nil {
149
- remoteAddr = & gonet.TCPAddr {}
150
+ remoteAddr = & net.TCPAddr {
151
+ IP : []byte {0 , 0 , 0 , 0 },
152
+ Port : 0 ,
153
+ }
154
+ }
155
+ if request .ProtoMajor == 3 {
156
+ remoteAddr = & net.UDPAddr {
157
+ IP : remoteAddr .(* net.TCPAddr ).IP ,
158
+ Port : remoteAddr .(* net.TCPAddr ).Port ,
159
+ }
150
160
}
151
161
if len (forwardedAddrs ) > 0 && forwardedAddrs [0 ].Family ().IsIP () {
152
162
remoteAddr = & net.TCPAddr {
153
163
IP : forwardedAddrs [0 ].IP (),
154
- Port : int ( 0 ) ,
164
+ Port : 0 ,
155
165
}
156
166
}
157
167
@@ -289,6 +299,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
289
299
responseFlusher : responseFlusher ,
290
300
},
291
301
reader : request .Body ,
302
+ localAddr : h .localAddr ,
292
303
remoteAddr : remoteAddr ,
293
304
}
294
305
if sessionId != "" { // if not stream-one
@@ -362,34 +373,30 @@ type Listener struct {
362
373
isH3 bool
363
374
}
364
375
365
- func ListenSH (ctx context.Context , address net.Address , port net.Port , streamSettings * internet.MemoryStreamConfig , addConn internet.ConnHandler ) (internet.Listener , error ) {
376
+ func ListenXH (ctx context.Context , address net.Address , port net.Port , streamSettings * internet.MemoryStreamConfig , addConn internet.ConnHandler ) (internet.Listener , error ) {
366
377
l := & Listener {
367
378
addConn : addConn ,
368
379
}
369
- shSettings := streamSettings .ProtocolSettings .(* Config )
370
- l .config = shSettings
380
+ l .config = streamSettings .ProtocolSettings .(* Config )
371
381
if l .config != nil {
372
382
if streamSettings .SocketSettings == nil {
373
383
streamSettings .SocketSettings = & internet.SocketConfig {}
374
384
}
375
385
}
376
- var listener net.Listener
377
- var err error
378
- var localAddr = gonet.TCPAddr {}
379
386
handler := & requestHandler {
380
- config : shSettings ,
381
- host : shSettings .Host ,
382
- path : shSettings .GetNormalizedPath (),
387
+ config : l . config ,
388
+ host : l . config .Host ,
389
+ path : l . config .GetNormalizedPath (),
383
390
ln : l ,
384
391
sessionMu : & sync.Mutex {},
385
392
sessions : sync.Map {},
386
- localAddr : localAddr ,
387
393
}
388
394
tlsConfig := getTLSConfig (streamSettings )
389
395
l .isH3 = len (tlsConfig .NextProtos ) == 1 && tlsConfig .NextProtos [0 ] == "h3"
390
396
397
+ var err error
391
398
if port == net .Port (0 ) { // unix
392
- listener , err = internet .ListenSystem (ctx , & net.UnixAddr {
399
+ l . listener , err = internet .ListenSystem (ctx , & net.UnixAddr {
393
400
Name : address .Domain (),
394
401
Net : "unix" ,
395
402
}, streamSettings .SocketSettings )
@@ -405,13 +412,14 @@ func ListenSH(ctx context.Context, address net.Address, port net.Port, streamSet
405
412
if err != nil {
406
413
return nil , errors .New ("failed to listen UDP for XHTTP/3 on " , address , ":" , port ).Base (err )
407
414
}
408
- h3listener , err : = quic .ListenEarly (Conn , tlsConfig , nil )
415
+ l . h3listener , err = quic .ListenEarly (Conn , tlsConfig , nil )
409
416
if err != nil {
410
417
return nil , errors .New ("failed to listen QUIC for XHTTP/3 on " , address , ":" , port ).Base (err )
411
418
}
412
- l .h3listener = h3listener
413
419
errors .LogInfo (ctx , "listening QUIC for XHTTP/3 on " , address , ":" , port )
414
420
421
+ handler .localAddr = l .h3listener .Addr ()
422
+
415
423
l .h3server = & http3.Server {
416
424
Handler : handler ,
417
425
}
@@ -421,11 +429,7 @@ func ListenSH(ctx context.Context, address net.Address, port net.Port, streamSet
421
429
}
422
430
}()
423
431
} else { // tcp
424
- localAddr = gonet.TCPAddr {
425
- IP : address .IP (),
426
- Port : int (port ),
427
- }
428
- listener , err = internet .ListenSystem (ctx , & net.TCPAddr {
432
+ l .listener , err = internet .ListenSystem (ctx , & net.TCPAddr {
429
433
IP : address .IP (),
430
434
Port : int (port ),
431
435
}, streamSettings .SocketSettings )
@@ -436,26 +440,24 @@ func ListenSH(ctx context.Context, address net.Address, port net.Port, streamSet
436
440
}
437
441
438
442
// tcp/unix (h1/h2)
439
- if listener != nil {
440
- if config := v2tls .ConfigFromStreamSettings (streamSettings ); config != nil {
443
+ if l . listener != nil {
444
+ if config := tls .ConfigFromStreamSettings (streamSettings ); config != nil {
441
445
if tlsConfig := config .GetTLSConfig (); tlsConfig != nil {
442
- listener = tls .NewListener (listener , tlsConfig )
446
+ l . listener = gotls .NewListener (l . listener , tlsConfig )
443
447
}
444
448
}
445
-
446
449
if config := reality .ConfigFromStreamSettings (streamSettings ); config != nil {
447
- listener = goreality .NewListener (listener , config .GetREALITYConfig ())
450
+ l . listener = goreality .NewListener (l . listener , config .GetREALITYConfig ())
448
451
}
449
452
453
+ handler .localAddr = l .listener .Addr ()
454
+
450
455
// h2cHandler can handle both plaintext HTTP/1.1 and h2c
451
- h2cHandler := h2c .NewHandler (handler , & http2.Server {})
452
- l .listener = listener
453
456
l .server = http.Server {
454
- Handler : h2cHandler ,
457
+ Handler : h2c . NewHandler ( handler , & http2. Server {}) ,
455
458
ReadHeaderTimeout : time .Second * 4 ,
456
459
MaxHeaderBytes : 8192 ,
457
460
}
458
-
459
461
go func () {
460
462
if err := l .server .Serve (l .listener ); err != nil {
461
463
errors .LogWarningInner (ctx , err , "failed to serve HTTP for XHTTP" )
@@ -488,13 +490,13 @@ func (ln *Listener) Close() error {
488
490
}
489
491
return errors .New ("listener does not have an HTTP/3 server or a net.listener" )
490
492
}
491
- func getTLSConfig (streamSettings * internet.MemoryStreamConfig ) * tls .Config {
492
- config := v2tls .ConfigFromStreamSettings (streamSettings )
493
+ func getTLSConfig (streamSettings * internet.MemoryStreamConfig ) * gotls .Config {
494
+ config := tls .ConfigFromStreamSettings (streamSettings )
493
495
if config == nil {
494
- return & tls .Config {}
496
+ return & gotls .Config {}
495
497
}
496
498
return config .GetTLSConfig ()
497
499
}
498
500
func init () {
499
- common .Must (internet .RegisterTransportListener (protocolName , ListenSH ))
501
+ common .Must (internet .RegisterTransportListener (protocolName , ListenXH ))
500
502
}
0 commit comments