diff --git a/src/h2load_quic.cc b/src/h2load_quic.cc index fd979cbf..5384bf8a 100644 --- a/src/h2load_quic.cc +++ b/src/h2load_quic.cc @@ -108,9 +108,15 @@ int Client::quic_acked_stream_data_offset(int64_t stream_id, size_t datalen) { } namespace { -int stream_close(ngtcp2_conn *conn, int64_t stream_id, uint64_t app_error_code, - void *user_data, void *stream_user_data) { +int stream_close(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { auto c = static_cast(user_data); + + if (!(flags & NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET)) { + app_error_code = NGHTTP3_H3_NO_ERROR; + } + if (c->quic_stream_close(stream_id, app_error_code) != 0) { return -1; } diff --git a/src/shrpx_http3_upstream.cc b/src/shrpx_http3_upstream.cc index 184e3435..179c577b 100644 --- a/src/shrpx_http3_upstream.cc +++ b/src/shrpx_http3_upstream.cc @@ -306,10 +306,15 @@ int Http3Upstream::recv_stream_data(uint32_t flags, int64_t stream_id, } namespace { -int stream_close(ngtcp2_conn *conn, int64_t stream_id, uint64_t app_error_code, - void *user_data, void *stream_user_data) { +int stream_close(ngtcp2_conn *conn, uint32_t flags, int64_t stream_id, + uint64_t app_error_code, void *user_data, + void *stream_user_data) { auto upstream = static_cast(user_data); + if (!(flags & NGTCP2_STREAM_CLOSE_FLAG_APP_ERROR_CODE_SET)) { + app_error_code = NGHTTP3_H3_NO_ERROR; + } + if (upstream->stream_close(stream_id, app_error_code) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; }