diff --git a/lib/hpack.c b/lib/hpack.c index 37c43192..56f66b54 100644 --- a/lib/hpack.c +++ b/lib/hpack.c @@ -668,8 +668,7 @@ int lws_add_http2_header_status(struct libwebsocket_context *context, unsigned char status[10]; int n; - if (code >= 400) - wsi->u.http2.END_STREAM = 1; + wsi->u.http2.send_END_STREAM = !!(code >= 400); n = sprintf((char *)status, "%u", code); if (lws_add_http2_header_by_token(context, wsi, WSI_TOKEN_HTTP_COLON_STATUS, status, n, p, end)) diff --git a/lib/output.c b/lib/output.c index 91c754ae..cee61494 100644 --- a/lib/output.c +++ b/lib/output.c @@ -445,6 +445,8 @@ send_raw: if (protocol == LWS_WRITE_HTTP_HEADERS) { n = LWS_HTTP2_FRAME_TYPE_HEADERS; flags = LWS_HTTP2_FLAG_END_HEADERS; + if (wsi->u.http2.send_END_STREAM) + flags |= LWS_HTTP2_FLAG_END_STREAM; } if ((protocol == LWS_WRITE_HTTP || protocol == LWS_WRITE_HTTP_FINAL) && wsi->u.http.content_length) { @@ -456,7 +458,7 @@ send_raw: } } - if ((protocol == LWS_WRITE_HTTP_FINAL || protocol == LWS_WRITE_HTTP_HEADERS) && wsi->u.http2.END_STREAM) { + if (protocol == LWS_WRITE_HTTP_FINAL && wsi->u.http2.END_STREAM) { lwsl_info("%s: setting END_STREAM\n", __func__); flags |= LWS_HTTP2_FLAG_END_STREAM; } diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index 4631bfed..4f171de2 100755 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -699,6 +699,7 @@ struct _lws_http2_related { unsigned int END_STREAM:1; unsigned int END_HEADERS:1; + unsigned int send_END_STREAM:1; /* hpack */ enum http2_hpack_state hpack;