diff --git a/src/shrpx_http2_downstream_connection.cc b/src/shrpx_http2_downstream_connection.cc index a359c3db..dd65c7bd 100644 --- a/src/shrpx_http2_downstream_connection.cc +++ b/src/shrpx_http2_downstream_connection.cc @@ -207,16 +207,16 @@ ssize_t http2_data_read_callback(nghttp2_session *session, int32_t stream_id, if (!trailers.empty()) { std::vector nva; nva.reserve(trailers.size()); - for (auto &kv : trailers) { - nva.push_back(http2::make_nv(kv.name, kv.value, kv.no_index)); - } - rv = nghttp2_submit_trailer(session, stream_id, nva.data(), nva.size()); - if (rv != 0) { - if (nghttp2_is_fatal(rv)) { - return NGHTTP2_ERR_CALLBACK_FAILURE; + http2::copy_headers_to_nva(nva, trailers); + if (!nva.empty()) { + rv = nghttp2_submit_trailer(session, stream_id, nva.data(), nva.size()); + if (rv != 0) { + if (nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } else { + *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; } - } else { - *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; } } } diff --git a/src/shrpx_http2_upstream.cc b/src/shrpx_http2_upstream.cc index abe28be7..537cc30c 100644 --- a/src/shrpx_http2_upstream.cc +++ b/src/shrpx_http2_upstream.cc @@ -1098,16 +1098,17 @@ ssize_t downstream_data_read_callback(nghttp2_session *session, if (!trailers.empty()) { std::vector nva; nva.reserve(trailers.size()); - for (auto &kv : trailers) { - nva.push_back(http2::make_nv(kv.name, kv.value, kv.no_index)); - } - rv = nghttp2_submit_trailer(session, stream_id, nva.data(), nva.size()); - if (rv != 0) { - if (nghttp2_is_fatal(rv)) { - return NGHTTP2_ERR_CALLBACK_FAILURE; + http2::copy_headers_to_nva(nva, trailers); + if (!nva.empty()) { + rv = nghttp2_submit_trailer(session, stream_id, nva.data(), + nva.size()); + if (rv != 0) { + if (nghttp2_is_fatal(rv)) { + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } else { + *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; } - } else { - *data_flags |= NGHTTP2_DATA_FLAG_NO_END_STREAM; } } if (nghttp2_session_get_stream_remote_close(session, stream_id) == 0) {