From e6bf431f93b9807c1fc2db24480fe61cce0299ad Mon Sep 17 00:00:00 2001 From: lucifer9 Date: Fri, 5 Jul 2019 11:18:00 +0800 Subject: [PATCH] add server side h2c support --- transport/internet/http/hub.go | 38 ++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/transport/internet/http/hub.go b/transport/internet/http/hub.go index 1ec53c5d4..32fb30907 100644 --- a/transport/internet/http/hub.go +++ b/transport/internet/http/hub.go @@ -16,6 +16,9 @@ import ( "v2ray.com/core/common/signal/done" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" + + "golang.org/x/net/http2" + "golang.org/x/net/http2/h2c" ) type Listener struct { @@ -102,16 +105,23 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti config: *httpSettings, } + var server *http.Server config := tls.ConfigFromStreamSettings(streamSettings) if config == nil { - return nil, newError("TLS must be enabled for http transport.").AtWarning() - } + h2s := &http2.Server{} - server := &http.Server{ - Addr: serial.Concat(address, ":", port), - TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")), - Handler: listener, - ReadHeaderTimeout: time.Second * 4, + server = &http.Server{ + Addr: serial.Concat(address, ":", port), + Handler: h2c.NewHandler(listener, h2s), + ReadHeaderTimeout: time.Second * 4, + } + } else { + server = &http.Server{ + Addr: serial.Concat(address, ":", port), + TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")), + Handler: listener, + ReadHeaderTimeout: time.Second * 4, + } } listener.server = server @@ -124,10 +134,16 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti newError("failed to listen on", address, ":", port).Base(err).WriteToLog(session.ExportIDToError(ctx)) return } - - err = server.ServeTLS(tcpListener, "", "") - if err != nil { - newError("stoping serving TLS").Base(err).WriteToLog(session.ExportIDToError(ctx)) + if config == nil { + err = server.Serve(tcpListener) + if err != nil { + newError("stoping serving H2C").Base(err).WriteToLog(session.ExportIDToError(ctx)) + } + } else { + err = server.ServeTLS(tcpListener, "", "") + if err != nil { + newError("stoping serving TLS").Base(err).WriteToLog(session.ExportIDToError(ctx)) + } } }()