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_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 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, static nxt_int_t nxt_h1p_connection(void *ctx, nxt_http_field_t *field,
uintptr_t data); uintptr_t data);
static nxt_int_t nxt_h1p_transfer_encoding(void *ctx, nxt_http_field_t *field, 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); ret = nxt_http_parse_request(&h1p->parser, &c->read->mem);
if (nxt_fast_path(ret == NXT_DONE)) { 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 * By default the keepalive mode is disabled in HTTP/1.0 and
* enabled in HTTP/1.1. The mode can be overridden later by * 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'); h1p->keepalive = (h1p->parser.version.s.minor != '0');
r->fields = h1p->parser.fields; ret = nxt_h1p_header_process(h1p, r);
ret = nxt_http_fields_process(r->fields, &nxt_h1p_fields_hash, r);
if (nxt_fast_path(ret == NXT_OK)) { if (nxt_fast_path(ret == NXT_OK)) {
r->state->ready_handler(task, r, NULL); 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) if (size <= (size_t) nxt_buf_mem_used_size(&in->mem)
|| h1p->nbuffers >= r->socket_conf->large_header_buffers) || h1p->nbuffers >= r->socket_conf->large_header_buffers)
{ {
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r, nxt_http_request_error(task, r,
NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE); NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE);
return; 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); b = nxt_buf_mem_alloc(c->mem_pool, size, 0);
if (nxt_slow_path(b == NULL)) { if (nxt_slow_path(b == NULL)) {
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r, NXT_HTTP_INTERNAL_SERVER_ERROR); nxt_http_request_error(task, r, NXT_HTTP_INTERNAL_SERVER_ERROR);
return; return;
} }
@@ -335,6 +327,7 @@ nxt_h1p_header_parse(nxt_task_t *task, void *obj, void *data)
break; break;
} }
(void) nxt_h1p_header_process(h1p, r);
nxt_http_request_error(task, r, status); nxt_http_request_error(task, r, status);
return; 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 static nxt_int_t
nxt_h1p_connection(void *ctx, nxt_http_field_t *field, uintptr_t data) 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; r = h1p->request;
if (r != NULL) { if (r != NULL) {
if (r->fields == NULL) {
(void) nxt_h1p_header_process(h1p, r);
}
nxt_h1p_request_error(task, r); nxt_h1p_request_error(task, r);
return; return;
} }