From 17d1039f5c59e7841dae49870100b760ba7aecdf Mon Sep 17 00:00:00 2001 From: Zhouyihai Ding Date: Mon, 1 Apr 2024 13:30:26 -0700 Subject: [PATCH] grpc: Export header list sizes in DialOption and ServerOption (#7033) --- default_dial_option_server_option_test.go | 13 +++++++++++++ dialoptions.go | 16 +++++++++++++--- server.go | 16 +++++++++++++--- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/default_dial_option_server_option_test.go b/default_dial_option_server_option_test.go index 4af5c0b87..c24619922 100644 --- a/default_dial_option_server_option_test.go +++ b/default_dial_option_server_option_test.go @@ -132,3 +132,16 @@ func (s) TestJoinServerOption(t *testing.T) { t.Fatalf("Unexpected s.opts.initialWindowSize: %d != %d", s.opts.initialWindowSize, initialWindowSize) } } + +// funcTestHeaderListSizeDialOptionServerOption tests +func (s) TestHeaderListSizeDialOptionServerOption(t *testing.T) { + const maxHeaderListSize uint32 = 998765 + clientHeaderListSize := WithMaxHeaderListSize(maxHeaderListSize) + if clientHeaderListSize.(MaxHeaderListSizeDialOption).MaxHeaderListSize != maxHeaderListSize { + t.Fatalf("Unexpected s.opts.MaxHeaderListSizeDialOption.MaxHeaderListSize: %d != %d", clientHeaderListSize, maxHeaderListSize) + } + serverHeaderListSize := MaxHeaderListSize(maxHeaderListSize) + if serverHeaderListSize.(MaxHeaderListSizeServerOption).MaxHeaderListSize != maxHeaderListSize { + t.Fatalf("Unexpected s.opts.MaxHeaderListSizeDialOption.MaxHeaderListSize: %d != %d", serverHeaderListSize, maxHeaderListSize) + } +} diff --git a/dialoptions.go b/dialoptions.go index 402493224..e4a985f45 100644 --- a/dialoptions.go +++ b/dialoptions.go @@ -601,12 +601,22 @@ func WithDisableRetry() DialOption { }) } +// MaxHeaderListSizeDialOption is a DialOption that specifies the maximum +// (uncompressed) size of header list that the client is prepared to accept. +type MaxHeaderListSizeDialOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeDialOption) apply(do *dialOptions) { + do.copts.MaxHeaderListSize = &o.MaxHeaderListSize +} + // WithMaxHeaderListSize returns a DialOption that specifies the maximum // (uncompressed) size of header list that the client is prepared to accept. func WithMaxHeaderListSize(s uint32) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.copts.MaxHeaderListSize = &s - }) + return MaxHeaderListSizeDialOption{ + MaxHeaderListSize: s, + } } // WithDisableHealthCheck disables the LB channel health checking for all diff --git a/server.go b/server.go index fd4558daa..89f8e4792 100644 --- a/server.go +++ b/server.go @@ -527,12 +527,22 @@ func ConnectionTimeout(d time.Duration) ServerOption { }) } +// MaxHeaderListSizeServerOption is a ServerOption that sets the max +// (uncompressed) size of header list that the server is prepared to accept. +type MaxHeaderListSizeServerOption struct { + MaxHeaderListSize uint32 +} + +func (o MaxHeaderListSizeServerOption) apply(so *serverOptions) { + so.maxHeaderListSize = &o.MaxHeaderListSize +} + // MaxHeaderListSize returns a ServerOption that sets the max (uncompressed) size // of header list that the server is prepared to accept. func MaxHeaderListSize(s uint32) ServerOption { - return newFuncServerOption(func(o *serverOptions) { - o.maxHeaderListSize = &s - }) + return MaxHeaderListSizeServerOption{ + MaxHeaderListSize: s, + } } // HeaderTableSize returns a ServerOption that sets the size of dynamic