@@ -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 {
244244static void on_stream_destroy (quicly_stream_t * qs , int err );
245245static int retain_sendvecs (struct st_h2o_http3_server_stream_t * stream );
246246static 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 );
248248static 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 );
250250static void tunnel_write (struct st_h2o_http3_server_stream_t * stream );
251251static 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
10381038int 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
10581058static 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
10811081int 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
11361136static 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