Processing of partially parsed HTTP header.
This is useful for log purposes.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user