Skip to content

Commit 8c0eca3

Browse files
committed
postpone stream shutdown by H3 frame parsers
1 parent 7989ddd commit 8c0eca3

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

Diff for: lib/http3/server.c

+11-9
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ struct st_h2o_http3_server_stream_t {
178178
struct {
179179
h2o_buffer_t *buf;
180180
int (*handle_input)(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
181-
const char **err_desc);
181+
int in_generator, const char **err_desc);
182182
uint64_t bytes_left_in_data_frame;
183183
} recvbuf;
184184
struct {
@@ -244,9 +244,9 @@ struct st_h2o_http3_server_stream_t {
244244
static void on_stream_destroy(quicly_stream_t *qs, int err);
245245
static int retain_sendvecs(struct st_h2o_http3_server_stream_t *stream);
246246
static int handle_input_post_trailers(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
247-
const char **err_desc);
247+
int in_generator, const char **err_desc);
248248
static int handle_input_expect_data(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
249-
const char **err_desc);
249+
int in_generator, const char **err_desc);
250250
static void tunnel_write(struct st_h2o_http3_server_stream_t *stream);
251251
static void tunnel_write_delayed(h2o_timer_t *timer);
252252

@@ -834,7 +834,7 @@ static void handle_buffered_input(struct st_h2o_http3_server_stream_t *stream, i
834834
while (src != src_end) {
835835
int err;
836836
const char *err_desc = NULL;
837-
if ((err = stream->recvbuf.handle_input(stream, &src, src_end, &err_desc)) != 0) {
837+
if ((err = stream->recvbuf.handle_input(stream, &src, src_end, in_generator, &err_desc)) != 0) {
838838
if (err == H2O_HTTP3_ERROR_INCOMPLETE) {
839839
if (!quicly_recvstate_transfer_complete(&stream->quic->recvstate))
840840
break;
@@ -1036,7 +1036,7 @@ static void run_delayed(h2o_timer_t *timer)
10361036
}
10371037

10381038
int handle_input_post_trailers(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
1039-
const char **err_desc)
1039+
int in_generator, const char **err_desc)
10401040
{
10411041
h2o_http3_read_frame_t frame;
10421042
int ret;
@@ -1056,7 +1056,7 @@ int handle_input_post_trailers(struct st_h2o_http3_server_stream_t *stream, cons
10561056
}
10571057

10581058
static int handle_input_expect_data_payload(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src,
1059-
const uint8_t *src_end, const char **err_desc)
1059+
const uint8_t *src_end, int in_generator, const char **err_desc)
10601060
{
10611061
size_t bytes_avail = src_end - *src;
10621062

@@ -1079,7 +1079,7 @@ static int handle_input_expect_data_payload(struct st_h2o_http3_server_stream_t
10791079
}
10801080

10811081
int handle_input_expect_data(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
1082-
const char **err_desc)
1082+
int in_generator, const char **err_desc)
10831083
{
10841084
h2o_http3_read_frame_t frame;
10851085
int ret;
@@ -1102,7 +1102,7 @@ int handle_input_expect_data(struct st_h2o_http3_server_stream_t *stream, const
11021102
stream->req.content_length - stream->req.req_body_bytes_received < frame.length) {
11031103
/* The only viable option here is to reset the stream, as we might have already started streaming the request body
11041104
* upstream. This behavior is consistent with what we do in HTTP/2. */
1105-
shutdown_stream(stream, H2O_HTTP3_ERROR_EARLY_RESPONSE, H2O_HTTP3_ERROR_GENERAL_PROTOCOL, 0);
1105+
shutdown_stream(stream, H2O_HTTP3_ERROR_EARLY_RESPONSE, H2O_HTTP3_ERROR_GENERAL_PROTOCOL, in_generator);
11061106
return 0;
11071107
}
11081108
break;
@@ -1134,8 +1134,10 @@ static int handle_input_expect_headers_send_http_error(struct st_h2o_http3_serve
11341134
}
11351135

11361136
static int handle_input_expect_headers(struct st_h2o_http3_server_stream_t *stream, const uint8_t **src, const uint8_t *src_end,
1137-
const char **err_desc)
1137+
int in_generator, const char **err_desc)
11381138
{
1139+
assert(!in_generator); /* this function is processing headers (before generators get assigned), not trailers */
1140+
11391141
struct st_h2o_http3_server_conn_t *conn = get_conn(stream);
11401142
h2o_http3_read_frame_t frame;
11411143
int header_exists_map = 0, ret;

0 commit comments

Comments
 (0)