diff options
-rw-r--r-- | src/nxt_h1proto.c | 14 | ||||
-rw-r--r-- | src/nxt_http.h | 1 | ||||
-rw-r--r-- | src/nxt_http_parse.c | 14 | ||||
-rw-r--r-- | src/nxt_http_parse.h | 1 | ||||
-rw-r--r-- | src/nxt_http_variables.c | 31 | ||||
-rw-r--r-- | test/test_access_log.py | 8 |
6 files changed, 24 insertions, 45 deletions
diff --git a/src/nxt_h1proto.c b/src/nxt_h1proto.c index 40b10af0..df1f82f9 100644 --- a/src/nxt_h1proto.c +++ b/src/nxt_h1proto.c @@ -577,6 +577,15 @@ nxt_h1p_conn_request_header_parse(nxt_task_t *task, void *obj, void *data) */ h1p->keepalive = (h1p->parser.version.s.minor != '0'); + r->request_line.start = h1p->parser.method.start; + r->request_line.length = h1p->parser.request_line_end + - r->request_line.start; + + if (nxt_slow_path(r->log_route)) { + nxt_log(task, NXT_LOG_NOTICE, "http request line \"%V\"", + &r->request_line); + } + ret = nxt_h1p_header_process(task, h1p, r); if (nxt_fast_path(ret == NXT_OK)) { @@ -654,11 +663,6 @@ nxt_h1p_header_process(nxt_task_t *task, nxt_h1proto_t *h1p, r->path = &h1p->parser.path; r->args = &h1p->parser.args; - if (nxt_slow_path(r->log_route)) { - nxt_log(task, NXT_LOG_NOTICE, "http request line \"%V %V %V\"", - r->method, &r->target, &r->version); - } - r->fields = h1p->parser.fields; ret = nxt_http_fields_process(r->fields, &nxt_h1p_fields_hash, r); diff --git a/src/nxt_http.h b/src/nxt_http.h index ffd3f601..d7bbaf02 100644 --- a/src/nxt_http.h +++ b/src/nxt_http.h @@ -144,6 +144,7 @@ struct nxt_http_request_s { nxt_str_t host; nxt_str_t server_name; + nxt_str_t request_line; nxt_str_t target; nxt_str_t version; nxt_str_t *method; diff --git a/src/nxt_http_parse.c b/src/nxt_http_parse.c index f39d8f67..439993df 100644 --- a/src/nxt_http_parse.c +++ b/src/nxt_http_parse.c @@ -417,23 +417,25 @@ space_after_target: { rp->version.ui64 = ver.ui64; - if (nxt_fast_path(p[9] == '\r')) { - p += 10; + p += 9; + if (nxt_fast_path(*p == '\r')) { - if (nxt_slow_path(p == end)) { + if (nxt_slow_path(p + 1 == end)) { return NXT_AGAIN; } - if (nxt_slow_path(*p != '\n')) { + if (nxt_slow_path(p[1] != '\n')) { return NXT_HTTP_PARSE_INVALID; } - *pos = p + 1; + *pos = p + 2; } else { - *pos = p + 10; + *pos = p + 1; } + rp->request_line_end = p; + if (rp->complex_target != 0 #if 0 || rp->quoted_target != 0 diff --git a/src/nxt_http_parse.h b/src/nxt_http_parse.h index 2b714464..88b10675 100644 --- a/src/nxt_http_parse.h +++ b/src/nxt_http_parse.h @@ -41,6 +41,7 @@ struct nxt_http_request_parse_s { u_char *target_start; u_char *target_end; + u_char *request_line_end; nxt_str_t path; nxt_str_t args; diff --git a/src/nxt_http_variables.c b/src/nxt_http_variables.c index fa0244db..b73d9151 100644 --- a/src/nxt_http_variables.c +++ b/src/nxt_http_variables.c @@ -273,40 +273,11 @@ static nxt_int_t nxt_http_var_request_line(nxt_task_t *task, nxt_str_t *str, void *ctx, uint16_t field) { - size_t length; - u_char *p, *start; nxt_http_request_t *r; r = ctx; - length = r->method->length + 1 + r->target.length + 1 + r->version.length; - - start = nxt_mp_nget(r->mem_pool, length); - if (nxt_slow_path(start == NULL)) { - return NXT_ERROR; - } - - p = start; - - if (r->method->length != 0) { - p = nxt_cpymem(p, r->method->start, r->method->length); - - if (r->target.length != 0) { - *p++ = ' '; - p = nxt_cpymem(p, r->target.start, r->target.length); - - if (r->version.length != 0) { - *p++ = ' '; - p = nxt_cpymem(p, r->version.start, r->version.length); - } - } - - } else { - *p++ = '-'; - } - - str->start = start; - str->length = p - start; + *str = r->request_line; return NXT_OK; } diff --git a/test/test_access_log.py b/test/test_access_log.py index ffaae0b1..c29638a3 100644 --- a/test/test_access_log.py +++ b/test/test_access_log.py @@ -174,7 +174,7 @@ Connection: close time.sleep(1) assert ( - self.wait_for_record(r'"GE" 400 0 "-" "-"') is not None + self.wait_for_record(r'"-" 400 0 "-" "-"') is not None ), 'partial' def test_access_log_partial_2(self): @@ -185,7 +185,7 @@ Connection: close self.http(b"""GET /\n""", raw=True) assert ( - self.wait_for_record(r'"GET /" 400 \d+ "-" "-"') is not None + self.wait_for_record(r'"-" 400 \d+ "-" "-"') is not None ), 'partial 2' def test_access_log_partial_3(self): @@ -198,7 +198,7 @@ Connection: close time.sleep(1) assert ( - self.wait_for_record(r'"GET /" 400 0 "-" "-"') is not None + self.wait_for_record(r'"-" 400 0 "-" "-"') is not None ), 'partial 3' def test_access_log_partial_4(self): @@ -211,7 +211,7 @@ Connection: close time.sleep(1) assert ( - self.wait_for_record(r'"GET / HTTP/1.1" 400 0 "-" "-"') is not None + self.wait_for_record(r'"-" 400 0 "-" "-"') is not None ), 'partial 4' @pytest.mark.skip('not yet') |