Skip to content

Commit a8f09fc

Browse files
feat(bin): support combined up- and download benchmark (#3066)
Signed-off-by: WaterWhisperer <waterwhisperer24@qq.com>
1 parent fd5fb49 commit a8f09fc

1 file changed

Lines changed: 23 additions & 8 deletions

File tree

neqo-bin/src/server/http3.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ pub struct HttpServer {
3030
server: Http3Server,
3131
/// Progress writing to each stream.
3232
remaining_data: HashMap<StreamId, SendData>,
33-
posts: HashMap<Http3OrWebTransportStream, usize>,
33+
/// Tracks POST requests: (bytes received, optional response size from path)
34+
posts: HashMap<Http3OrWebTransportStream, (usize, Option<usize>)>,
3435
is_qns_test: bool,
3536
}
3637

@@ -104,7 +105,10 @@ impl super::HttpServer for HttpServer {
104105
qdebug!("Headers (request={stream} fin={fin}): {headers:?}");
105106

106107
if headers.contains_header(":method", "POST") {
107-
self.posts.insert(stream, 0);
108+
let response_size = headers
109+
.find_header(":path")
110+
.and_then(|path| path.value().trim_matches('/').parse::<usize>().ok());
111+
self.posts.insert(stream, (0, response_size));
108112
continue;
109113
}
110114

@@ -162,17 +166,28 @@ impl super::HttpServer for HttpServer {
162166
}
163167

164168
Http3ServerEvent::Data { stream, data, fin } => {
165-
if let Some(received) = self.posts.get_mut(&stream) {
169+
if let Some((received, _)) = self.posts.get_mut(&stream) {
166170
*received += data.len();
167171
}
168172
if fin {
169-
if let Some(received) = self.posts.remove(&stream) {
170-
let msg = received.to_string().as_bytes().to_vec();
173+
if let Some((received, response_size)) = self.posts.remove(&stream) {
174+
let mut response = response_size.map_or_else(
175+
|| SendData::from(received.to_string().into_bytes()),
176+
SendData::zeroes,
177+
);
178+
171179
stream
172-
.send_headers(&[Header::new(":status", "200")])
180+
.send_headers(&[
181+
Header::new(":status", "200"),
182+
Header::new("content-length", response.len().to_string()),
183+
])
173184
.unwrap();
174-
stream.send_data(&msg, now).unwrap();
175-
stream.stream_close_send(now).unwrap();
185+
let done = response.send(|chunk| stream.send_data(chunk, now).unwrap());
186+
if done {
187+
stream.stream_close_send(now).unwrap();
188+
} else {
189+
self.remaining_data.insert(stream.stream_id(), response);
190+
}
176191
}
177192
}
178193
}

0 commit comments

Comments
 (0)