summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/nxt_h1proto.c14
-rw-r--r--src/nxt_http.h1
-rw-r--r--src/nxt_http_parse.c14
-rw-r--r--src/nxt_http_parse.h1
-rw-r--r--src/nxt_http_variables.c31
-rw-r--r--test/test_access_log.py8
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')