From fb2e5cdc8543ff38ef5624eec945856ffcc3610a Mon Sep 17 00:00:00 2001 From: Mo Zhonghua Date: Fri, 4 Oct 2019 07:08:31 +0800 Subject: [PATCH] server: add ServerOption HeaderTableSize (#2931) --- internal/transport/http2_server.go | 6 ++++++ internal/transport/transport.go | 1 + server.go | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/internal/transport/http2_server.go b/internal/transport/http2_server.go index cb1b0457546..07603836468 100644 --- a/internal/transport/http2_server.go +++ b/internal/transport/http2_server.go @@ -174,6 +174,12 @@ func newHTTP2Server(conn net.Conn, config *ServerConfig) (_ ServerTransport, err Val: *config.MaxHeaderListSize, }) } + if config.HeaderTableSize != nil { + isettings = append(isettings, http2.Setting{ + ID: http2.SettingHeaderTableSize, + Val: *config.HeaderTableSize, + }) + } if err := framer.fr.WriteSettings(isettings...); err != nil { return nil, connectionErrorf(false, err, "transport: %v", err) } diff --git a/internal/transport/transport.go b/internal/transport/transport.go index 7b1efd8a7b7..0a2722de42b 100644 --- a/internal/transport/transport.go +++ b/internal/transport/transport.go @@ -525,6 +525,7 @@ type ServerConfig struct { ReadBufferSize int ChannelzParentID int64 MaxHeaderListSize *uint32 + HeaderTableSize *uint32 } // NewServerTransport creates a ServerTransport with conn or non-nil error diff --git a/server.go b/server.go index f064b73e555..e54083d850c 100644 --- a/server.go +++ b/server.go @@ -130,6 +130,7 @@ type serverOptions struct { readBufferSize int connectionTimeout time.Duration maxHeaderListSize *uint32 + headerTableSize *uint32 } var defaultServerOptions = serverOptions{ @@ -377,6 +378,16 @@ func MaxHeaderListSize(s uint32) ServerOption { }) } +// HeaderTableSize returns a ServerOption that sets the size of dynamic +// header table for stream. +// +// This API is EXPERIMENTAL. +func HeaderTableSize(s uint32) ServerOption { + return newFuncServerOption(func(o *serverOptions) { + o.headerTableSize = &s + }) +} + // NewServer creates a gRPC server which has no service registered and has not // started to accept requests yet. func NewServer(opt ...ServerOption) *Server { @@ -686,6 +697,7 @@ func (s *Server) newHTTP2Transport(c net.Conn, authInfo credentials.AuthInfo) tr ReadBufferSize: s.opts.readBufferSize, ChannelzParentID: s.channelzID, MaxHeaderListSize: s.opts.maxHeaderListSize, + HeaderTableSize: s.opts.headerTableSize, } st, err := transport.NewServerTransport("http2", c, config) if err != nil {