Skip to content

Commit ac5cdd0

Browse files
authored
feat: add 'header_table_size()' to server builder (#888)
improve test
1 parent 55a0d9d commit ac5cdd0

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/server.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,18 @@ impl Builder {
800800
self
801801
}
802802

803+
/// Sets the header table size.
804+
///
805+
/// This setting informs the peer of the maximum size of the header compression
806+
/// table used to encode header blocks, in octets. The encoder may select any value
807+
/// equal to or less than the header table size specified by the sender.
808+
///
809+
/// The default value is 4,096.
810+
pub fn header_table_size(&mut self, size: u32) -> &mut Self {
811+
self.settings.set_header_table_size(Some(size));
812+
self
813+
}
814+
803815
/// Sets the maximum number of concurrent streams.
804816
///
805817
/// The maximum concurrent streams setting only controls the maximum number

tests/h2-tests/tests/server.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,51 @@ async fn server_builder_set_max_concurrent_streams() {
6969
join(client, h2).await;
7070
}
7171

72+
#[tokio::test]
73+
async fn server_builder_header_table_size() {
74+
h2_support::trace_init!();
75+
76+
for size in [0, 10000] {
77+
let (io, mut client) = mock::new();
78+
79+
let mut expected = frame::Settings::default();
80+
expected.set_header_table_size(Some(size));
81+
82+
let client = async move {
83+
let recv_settings = client.assert_server_handshake().await;
84+
assert_frame_eq(recv_settings, expected);
85+
client
86+
.send_frame(
87+
frames::headers(1)
88+
.request("GET", "https://example.com/")
89+
.eos(),
90+
)
91+
.await;
92+
client
93+
.recv_frame(frames::headers(1).response(200).eos())
94+
.await;
95+
};
96+
97+
let mut builder = server::Builder::new();
98+
builder.header_table_size(size);
99+
100+
let h2 = async move {
101+
let mut srv = builder.handshake::<_, Bytes>(io).await.expect("handshake");
102+
let (req, mut stream) = srv.next().await.unwrap().unwrap();
103+
assert_eq!(req.method(), &http::Method::GET);
104+
stream
105+
.send_response(
106+
http::Response::builder().status(200).body(()).unwrap(),
107+
true,
108+
)
109+
.unwrap();
110+
assert!(srv.next().await.is_none());
111+
};
112+
113+
join(client, h2).await;
114+
}
115+
}
116+
72117
#[tokio::test]
73118
async fn serve_request() {
74119
h2_support::trace_init!();

0 commit comments

Comments
 (0)