# HG changeset patch # User Valentin Bartenev # Date 1447434650 -10800 # Node ID f72d3129cd35c65bbdf0c84d9ec777f9cc2167ff # Parent 932a465537ef8462c480dc664b1503e248db1bef HTTP/2: fixed handling of output HEADERS frames. The HEADERS frame is always represented by more than one buffer since b930e598a199, but the handling code hasn't been adjusted. Only the first buffer of HEADERS frame was checked and if it had been sent while others had not, the rest of the frame was dropped, resulting in broken connection. Before b930e598a199, the problem could only be seen in case of HEADERS frame with CONTINUATION. diff -r 932a465537ef -r f72d3129cd35 src/http/v2/ngx_http_v2_filter_module.c --- a/src/http/v2/ngx_http_v2_filter_module.c Fri Nov 13 20:10:50 2015 +0300 +++ b/src/http/v2/ngx_http_v2_filter_module.c Fri Nov 13 20:10:50 2015 +0300 @@ -1054,17 +1054,30 @@ ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame) { - ngx_buf_t *buf; + ngx_chain_t *cl; ngx_http_v2_stream_t *stream; - buf = frame->first->buf; + stream = frame->stream; + cl = frame->first; + + for ( ;; ) { + if (cl->buf->pos != cl->buf->last) { + frame->first = cl; - if (buf->pos != buf->last) { - return NGX_AGAIN; + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, + "http2:%ui HEADERS frame %p was sent partially", + stream->node->id, frame); + + return NGX_AGAIN; + } + + if (cl == frame->last) { + break; + } + + cl = cl->next; } - stream = frame->stream; - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, "http2:%ui HEADERS frame %p was sent", stream->node->id, frame);