mirror of https://github.com/v2ray/v2ray-core
add server-side http2 over tcp (h2c) support
parent
a0aa7b7374
commit
e744537b80
|
@ -16,6 +16,9 @@ import (
|
||||||
"v2ray.com/core/common/signal/done"
|
"v2ray.com/core/common/signal/done"
|
||||||
"v2ray.com/core/transport/internet"
|
"v2ray.com/core/transport/internet"
|
||||||
"v2ray.com/core/transport/internet/tls"
|
"v2ray.com/core/transport/internet/tls"
|
||||||
|
|
||||||
|
"golang.org/x/net/http2"
|
||||||
|
"golang.org/x/net/http2/h2c"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Listener struct {
|
type Listener struct {
|
||||||
|
@ -104,34 +107,61 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti
|
||||||
|
|
||||||
config := tls.ConfigFromStreamSettings(streamSettings)
|
config := tls.ConfigFromStreamSettings(streamSettings)
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return nil, newError("TLS must be enabled for http transport.").AtWarning()
|
// return nil, newError("TLS must be enabled for http transport.").AtWarning()
|
||||||
}
|
h2s:=&http2.Server{}
|
||||||
|
|
||||||
server := &http.Server{
|
server := &http.Server{
|
||||||
Addr: serial.Concat(address, ":", port),
|
Addr: serial.Concat(address, ":", port),
|
||||||
TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")),
|
// TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")),
|
||||||
Handler: listener,
|
Handler: h2c.NewHandler(listener,h2s),
|
||||||
ReadHeaderTimeout: time.Second * 4,
|
ReadHeaderTimeout: time.Second * 4,
|
||||||
}
|
|
||||||
|
|
||||||
listener.server = server
|
|
||||||
go func() {
|
|
||||||
tcpListener, err := internet.ListenSystem(ctx, &net.TCPAddr{
|
|
||||||
IP: address.IP(),
|
|
||||||
Port: int(port),
|
|
||||||
}, streamSettings.SocketSettings)
|
|
||||||
if err != nil {
|
|
||||||
newError("failed to listen on", address, ":", port).Base(err).WriteToLog(session.ExportIDToError(ctx))
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = server.ServeTLS(tcpListener, "", "")
|
listener.server = server
|
||||||
if err != nil {
|
go func() {
|
||||||
newError("stoping serving TLS").Base(err).WriteToLog(session.ExportIDToError(ctx))
|
tcpListener, err := internet.ListenSystem(ctx, &net.TCPAddr{
|
||||||
}
|
IP: address.IP(),
|
||||||
}()
|
Port: int(port),
|
||||||
|
}, streamSettings.SocketSettings)
|
||||||
|
if err != nil {
|
||||||
|
newError("failed to listen on", address, ":", port).Base(err).WriteToLog(session.ExportIDToError(ctx))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
return listener, nil
|
err = server.Serve(tcpListener)
|
||||||
|
if err != nil {
|
||||||
|
newError("stoping serving H2C").Base(err).WriteToLog(session.ExportIDToError(ctx))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return listener, nil
|
||||||
|
} else {
|
||||||
|
server := &http.Server{
|
||||||
|
Addr: serial.Concat(address, ":", port),
|
||||||
|
TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")),
|
||||||
|
Handler: listener,
|
||||||
|
ReadHeaderTimeout: time.Second * 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
listener.server = server
|
||||||
|
go func() {
|
||||||
|
tcpListener, err := internet.ListenSystem(ctx, &net.TCPAddr{
|
||||||
|
IP: address.IP(),
|
||||||
|
Port: int(port),
|
||||||
|
}, streamSettings.SocketSettings)
|
||||||
|
if err != nil {
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return listener, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
Loading…
Reference in New Issue