diff --git a/infra/conf/transport_method.go b/infra/conf/transport_method.go index 3f1379526..826d074fd 100644 --- a/infra/conf/transport_method.go +++ b/infra/conf/transport_method.go @@ -293,6 +293,7 @@ type SplitHTTPConfig struct { ServerMaxHeaderBytes int32 `json:"serverMaxHeaderBytes"` Xmux XmuxConfig `json:"xmux"` DownloadSettings *StreamConfig `json:"downloadSettings"` + H2Params json.RawMessage `json:"h2Params"` Extra json.RawMessage `json:"extra"` } @@ -495,6 +496,7 @@ func (c *SplitHTTPConfig) Build() (proto.Message, error) { ServerMaxHeaderBytes: c.ServerMaxHeaderBytes, SessionIDTable: c.SessionIDTable, SessionIDLength: newRangeConfig(c.SessionIDLength), + H2Params: c.H2Params, Xmux: &splithttp.XmuxConfig{ MaxConcurrency: newRangeConfig(c.Xmux.MaxConcurrency), MaxConnections: newRangeConfig(c.Xmux.MaxConnections), diff --git a/transport/internet/splithttp/config.pb.go b/transport/internet/splithttp/config.pb.go index a123a231e..9ab55b989 100644 --- a/transport/internet/splithttp/config.pb.go +++ b/transport/internet/splithttp/config.pb.go @@ -189,6 +189,7 @@ type Config struct { ServerMaxHeaderBytes int32 `protobuf:"varint,27,opt,name=serverMaxHeaderBytes,proto3" json:"serverMaxHeaderBytes,omitempty"` SessionIDTable string `protobuf:"bytes,28,opt,name=sessionIDTable,proto3" json:"sessionIDTable,omitempty"` SessionIDLength *RangeConfig `protobuf:"bytes,29,opt,name=sessionIDLength,proto3" json:"sessionIDLength,omitempty"` + H2Params []byte `protobuf:"bytes,30,opt,name=h2Params,proto3" json:"h2Params,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -426,6 +427,13 @@ func (x *Config) GetSessionIDLength() *RangeConfig { return nil } +func (x *Config) GetH2Params() []byte { + if x != nil { + return x.H2Params + } + return nil +} + var File_transport_internet_splithttp_config_proto protoreflect.FileDescriptor const file_transport_internet_splithttp_config_proto_rawDesc = "" + @@ -441,7 +449,7 @@ const file_transport_internet_splithttp_config_proto_rawDesc = "" + "\x0ecMaxReuseTimes\x18\x03 \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x0ecMaxReuseTimes\x12Z\n" + "\x10hMaxRequestTimes\x18\x04 \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x10hMaxRequestTimes\x12Z\n" + "\x10hMaxReusableSecs\x18\x05 \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x10hMaxReusableSecs\x12*\n" + - "\x10hKeepAlivePeriod\x18\x06 \x01(\x03R\x10hKeepAlivePeriod\"\xcc\f\n" + + "\x10hKeepAlivePeriod\x18\x06 \x01(\x03R\x10hKeepAlivePeriod\"\xe8\f\n" + "\x06Config\x12\x12\n" + "\x04host\x18\x01 \x01(\tR\x04host\x12\x12\n" + "\x04path\x18\x02 \x01(\tR\x04path\x12\x12\n" + @@ -472,7 +480,8 @@ const file_transport_internet_splithttp_config_proto_rawDesc = "" + "\x0fuplinkChunkSize\x18\x1a \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x0fuplinkChunkSize\x122\n" + "\x14serverMaxHeaderBytes\x18\x1b \x01(\x05R\x14serverMaxHeaderBytes\x12&\n" + "\x0esessionIDTable\x18\x1c \x01(\tR\x0esessionIDTable\x12X\n" + - "\x0fsessionIDLength\x18\x1d \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x0fsessionIDLength\x1a:\n" + + "\x0fsessionIDLength\x18\x1d \x01(\v2..xray.transport.internet.splithttp.RangeConfigR\x0fsessionIDLength\x12\x1a\n" + + "\bh2Params\x18\x1e \x01(\fR\bh2Params\x1a:\n" + "\fHeadersEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x85\x01\n" + diff --git a/transport/internet/splithttp/config.proto b/transport/internet/splithttp/config.proto index efe6de03f..dac5f0f7b 100644 --- a/transport/internet/splithttp/config.proto +++ b/transport/internet/splithttp/config.proto @@ -52,4 +52,5 @@ message Config { int32 serverMaxHeaderBytes = 27; string sessionIDTable = 28; RangeConfig sessionIDLength = 29; + bytes h2Params = 30; } diff --git a/transport/internet/splithttp/hub.go b/transport/internet/splithttp/hub.go index dd9301199..5ec3173de 100644 --- a/transport/internet/splithttp/hub.go +++ b/transport/internet/splithttp/hub.go @@ -6,6 +6,7 @@ import ( "crypto/rand" gotls "crypto/tls" "encoding/base64" + "encoding/json" "fmt" "io" "net/http" @@ -555,6 +556,14 @@ func ListenXH(ctx context.Context, address net.Address, port net.Port, streamSet handler.localAddr = l.listener.Addr() + var http2Config *http.HTTP2Config + if len(l.config.H2Params) > 0 { + http2Config = new(http.HTTP2Config) + if err := json.Unmarshal(l.config.H2Params, http2Config); err != nil { + return nil, errors.New("failed to parse HTTP2Config").Base(err) + } + } + // server can handle both plaintext HTTP/1.1 and h2c protocols := new(http.Protocols) protocols.SetHTTP1(true) @@ -564,6 +573,7 @@ func ListenXH(ctx context.Context, address net.Address, port net.Port, streamSet ReadHeaderTimeout: time.Second * 4, MaxHeaderBytes: l.config.GetNormalizedServerMaxHeaderBytes(), Protocols: protocols, + HTTP2: http2Config, } go func() { if err := l.server.Serve(l.listener); err != nil {