1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-02-12 11:38:52 -05:00

add server-side http2 over tcp (h2c) support

This commit is contained in:
lucifer9 2019-06-27 14:21:40 +08:00
parent a0aa7b7374
commit e744537b80

View File

@ -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 {
@ -104,34 +107,61 @@ func Listen(ctx context.Context, address net.Address, port net.Port, streamSetti
config := tls.ConfigFromStreamSettings(streamSettings)
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{
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
server := &http.Server{
Addr: serial.Concat(address, ":", port),
// TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")),
Handler: h2c.NewHandler(listener,h2s),
ReadHeaderTimeout: time.Second * 4,
}
err = server.ServeTLS(tcpListener, "", "")
if err != nil {
newError("stoping serving TLS").Base(err).WriteToLog(session.ExportIDToError(ctx))
}
}()
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
}
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() {