diff --git a/transport/internet/splithttp/hub.go b/transport/internet/splithttp/hub.go index 179d696a..d161741a 100644 --- a/transport/internet/splithttp/hub.go +++ b/transport/internet/splithttp/hub.go @@ -24,8 +24,6 @@ import ( "github.com/xtls/xray-core/transport/internet/reality" "github.com/xtls/xray-core/transport/internet/stat" "github.com/xtls/xray-core/transport/internet/tls" - "golang.org/x/net/http2" - "golang.org/x/net/http2/h2c" ) type requestHandler struct { @@ -426,11 +424,15 @@ func ListenXH(ctx context.Context, address net.Address, port net.Port, streamSet handler.localAddr = l.listener.Addr() - // h2cHandler can handle both plaintext HTTP/1.1 and h2c + // server can handle both plaintext HTTP/1.1 and h2c + protocols := new(http.Protocols) + protocols.SetHTTP1(true) + protocols.SetUnencryptedHTTP2(true) l.server = http.Server{ - Handler: h2c.NewHandler(handler, &http2.Server{}), + Handler: handler, ReadHeaderTimeout: time.Second * 4, MaxHeaderBytes: 8192, + Protocols: protocols, } go func() { if err := l.server.Serve(l.listener); err != nil { diff --git a/transport/internet/splithttp/splithttp_test.go b/transport/internet/splithttp/splithttp_test.go index f566ecc4..1db54255 100644 --- a/transport/internet/splithttp/splithttp_test.go +++ b/transport/internet/splithttp/splithttp_test.go @@ -3,10 +3,8 @@ package splithttp_test import ( "context" "crypto/rand" - gotls "crypto/tls" "fmt" "io" - gonet "net" "net/http" "runtime" "testing" @@ -23,7 +21,6 @@ import ( . "github.com/xtls/xray-core/transport/internet/splithttp" "github.com/xtls/xray-core/transport/internet/stat" "github.com/xtls/xray-core/transport/internet/tls" - "golang.org/x/net/http2" ) func Test_ListenXHAndDial(t *testing.T) { @@ -201,17 +198,11 @@ func Test_ListenXHAndDial_H2C(t *testing.T) { common.Must(err) defer listen.Close() + protocols := new(http.Protocols) + protocols.SetUnencryptedHTTP2(true) client := http.Client{ - Transport: &http2.Transport{ - // So http2.Transport doesn't complain the URL scheme isn't 'https' - AllowHTTP: true, - // even with AllowHTTP, http2.Transport will attempt to establish - // the connection using DialTLSContext. Disable TLS with custom - // dial context. - DialTLSContext: func(ctx context.Context, network, addr string, cfg *gotls.Config) (gonet.Conn, error) { - var d gonet.Dialer - return d.DialContext(ctx, network, addr) - }, + Transport: &http.Transport{ + Protocols: protocols, }, }