mirror of
https://github.com/nginx/nginx.git
synced 2024-12-23 15:40:03 -06:00
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.
This commit is contained in:
parent
8323cd693b
commit
548e31f608
@ -1054,16 +1054,29 @@ static ngx_int_t
|
|||||||
ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,
|
ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,
|
||||||
ngx_http_v2_out_frame_t *frame)
|
ngx_http_v2_out_frame_t *frame)
|
||||||
{
|
{
|
||||||
ngx_buf_t *buf;
|
ngx_chain_t *cl;
|
||||||
ngx_http_v2_stream_t *stream;
|
ngx_http_v2_stream_t *stream;
|
||||||
|
|
||||||
buf = frame->first->buf;
|
|
||||||
|
|
||||||
if (buf->pos != buf->last) {
|
|
||||||
return NGX_AGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream = frame->stream;
|
stream = frame->stream;
|
||||||
|
cl = frame->first;
|
||||||
|
|
||||||
|
for ( ;; ) {
|
||||||
|
if (cl->buf->pos != cl->buf->last) {
|
||||||
|
frame->first = cl;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
|
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
|
||||||
"http2:%ui HEADERS frame %p was sent",
|
"http2:%ui HEADERS frame %p was sent",
|
||||||
|
Loading…
Reference in New Issue
Block a user