HTTP/2: reduced difference to HTTP/1.x in reading request body.

Particularly, this eliminates difference in behavior for requests without body
and deduplicates code.

Prodded by Piotr Sikora.
This commit is contained in:
Valentin Bartenev 2017-04-24 14:17:13 +03:00
parent d35c83a325
commit 55b37eff8f
3 changed files with 18 additions and 33 deletions

View File

@ -46,13 +46,6 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
return NGX_OK;
}
#if (NGX_HTTP_V2)
if (r->stream) {
rc = ngx_http_v2_read_request_body(r, post_handler);
goto done;
}
#endif
if (ngx_http_test_expect(r) != NGX_OK) {
rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
goto done;
@ -85,6 +78,13 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
return NGX_OK;
}
#if (NGX_HTTP_V2)
if (r->stream) {
rc = ngx_http_v2_read_request_body(r);
goto done;
}
#endif
preread = r->header_in->last - r->header_in->pos;
if (preread) {
@ -805,7 +805,11 @@ ngx_http_test_expect(ngx_http_request_t *r)
if (r->expect_tested
|| r->headers_in.expect == NULL
|| r->http_version < NGX_HTTP_VERSION_11)
|| r->http_version < NGX_HTTP_VERSION_11
#if (NGX_HTTP_V2)
|| r->stream != NULL
#endif
)
{
return NGX_OK;
}

View File

@ -3522,8 +3522,7 @@ ngx_http_v2_run_request(ngx_http_request_t *r)
ngx_int_t
ngx_http_v2_read_request_body(ngx_http_request_t *r,
ngx_http_client_body_handler_pt post_handler)
ngx_http_v2_read_request_body(ngx_http_request_t *r)
{
off_t len;
size_t size;
@ -3536,33 +3535,14 @@ ngx_http_v2_read_request_body(ngx_http_request_t *r,
ngx_http_v2_connection_t *h2c;
stream = r->stream;
rb = r->request_body;
if (stream->skip_data) {
r->request_body_no_buffering = 0;
post_handler(r);
rb->post_handler(r);
return NGX_OK;
}
rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t));
if (rb == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
/*
* set by ngx_pcalloc():
*
* rb->bufs = NULL;
* rb->buf = NULL;
* rb->received = 0;
* rb->free = NULL;
* rb->busy = NULL;
*/
rb->rest = 1;
rb->post_handler = post_handler;
r->request_body = rb;
h2scf = ngx_http_get_module_srv_conf(r, ngx_http_v2_module);
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
@ -3612,6 +3592,8 @@ ngx_http_v2_read_request_body(ngx_http_request_t *r,
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
rb->rest = 1;
buf = stream->preread;
if (stream->in_closed) {

View File

@ -264,8 +264,7 @@ ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c,
void ngx_http_v2_init(ngx_event_t *rev);
void ngx_http_v2_request_headers_init(void);
ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r,
ngx_http_client_body_handler_pt post_handler);
ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r);
ngx_int_t ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r);
void ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc);