Processing of partially parsed HTTP header.

This is useful for log purposes.
This commit is contained in:
Valentin Bartenev
2018-04-09 19:16:19 +03:00
parent 96927e7d0c
commit eb51264710

View File

@@ -10,6 +10,8 @@
static void nxt_h1p_read_header(nxt_task_t *task, void *obj, void *data);
static void nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data);
static nxt_int_t nxt_h1p_header_process(nxt_h1proto_t *h1p,
nxt_http_request_t *r);
static nxt_int_t nxt_h1p_connection(void *ctx, nxt_http_field_t *field,
uintptr_t data);
static nxt_int_t nxt_h1p_transfer_encoding(void *ctx, nxt_http_field_t *field,
@@ -249,16 +251,6 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
ret = nxt_http_parse_request(&h1p->parser, &c->read->mem);
if (nxt_fast_path(ret == NXT_DONE)) {
r->target.start = h1p->parser.target_start;
r->target.length = h1p->parser.target_end - h1p->parser.target_start;
r->version.start = h1p->parser.version.str;
r->version.length = sizeof(h1p->parser.version.str);
r->method = &h1p->parser.method;
r->path = &h1p->parser.path;
r->args = &h1p->parser.args;
/*
* By default the keepalive mode is disabled in HTTP/1.0 and
* enabled in HTTP/1.1. The mode can be overridden later by
@@ -266,9 +258,7 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
*/
h1p->keepalive = (h1p->parser.version.s.minor != '0');
r->fields = h1p->parser.fields;
ret = nxt_http_fields_process(r->fields, &nxt_h1p_fields_hash, r);
ret = nxt_h1p_header_process(h1p, r);
if (nxt_fast_path(ret == NXT_OK)) {
r->state->ready_handler(task, r, NULL);
@@ -290,6 +280,7 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
if (size <= (size_t) nxt_buf_mem_used_size(&in->mem)
|| h1p->nbuffers >= r->socket_conf->large_header_buffers)
{
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r,
NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE);
return;
@@ -297,6 +288,7 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
b = nxt_buf_mem_alloc(c->mem_pool, size, 0);
if (nxt_slow_path(b == NULL)) {
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r, NXT_HTTP_INTERNAL_SERVER_ERROR);
return;
}
@@ -335,6 +327,7 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
break;
}
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r, status);
return;
@@ -344,6 +337,27 @@ fail:
}
static nxt_int_t
nxt_h1p_header_process(nxt_h1proto_t *h1p, nxt_http_request_t *r)
{
r->target.start = h1p->parser.target_start;
r->target.length = h1p->parser.target_end - h1p->parser.target_start;
if (h1p->parser.version.ui64 != 0) {
r->version.start = h1p->parser.version.str;
r->version.length = sizeof(h1p->parser.version.str);
}
r->method = &h1p->parser.method;
r->path = &h1p->parser.path;
r->args = &h1p->parser.args;
r->fields = h1p->parser.fields;
return nxt_http_fields_process(r->fields, &nxt_h1p_fields_hash, r);
}
static nxt_int_t
nxt_h1p_connection(void *ctx, nxt_http_field_t *field, uintptr_t data)
{
@@ -1007,6 +1021,10 @@ nxt_h1p_conn_close(nxt_task_t *task, void *obj, void *data)
r = h1p->request;
if (r != NULL) {
if (r->fields == NULL) {
(void) nxt_h1p_header_process(h1p, r);
}
nxt_h1p_request_error(task, r);
return;
}