HTTP parser: allowing tabs in field values as per RFC 7230.

This commit is contained in:
Valentin Bartenev
2018-03-15 21:07:57 +03:00
parent 3d2f85d9ca
commit 0b628bfe48
2 changed files with 45 additions and 13 deletions

View File

@@ -629,26 +629,34 @@ nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,
p += rp->field_value.length; p += rp->field_value.length;
p = nxt_http_lookup_field_end(p, end); for ( ;; ) {
p = nxt_http_lookup_field_end(p, end);
if (nxt_slow_path(p == end)) { if (nxt_slow_path(p == end)) {
*pos = start; *pos = start;
len = p - start; len = p - start;
if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_VALUE)) { if (nxt_slow_path(len > NXT_HTTP_MAX_FIELD_VALUE)) {
return NXT_HTTP_PARSE_TOO_LARGE_FIELD; return NXT_HTTP_PARSE_TOO_LARGE_FIELD;
}
rp->field_value.length = len;
rp->handler = &nxt_http_parse_field_value;
return NXT_AGAIN;
} }
rp->field_value.length = len; ch = *p;
rp->handler = &nxt_http_parse_field_value;
return NXT_AGAIN;
}
ch = *p; if (nxt_fast_path(ch == '\r' || ch == '\n')) {
break;
}
if (nxt_slow_path(ch != '\r' && ch != '\n')) { if (ch != '\t') {
return NXT_HTTP_PARSE_INVALID; return NXT_HTTP_PARSE_INVALID;
}
p++;
} }
*pos = p; *pos = p;

View File

@@ -268,6 +268,18 @@ static nxt_http_parse_test_case_t nxt_http_test_cases[] = {
NXT_HTTP_PARSE_INVALID, NXT_HTTP_PARSE_INVALID,
NULL, { NULL } NULL, { NULL }
}, },
{
nxt_string("GET / HTTP/1.1\r\n"
"Ho\nst: example.com\r\n\r\n"),
NXT_HTTP_PARSE_INVALID,
NULL, { NULL }
},
{
nxt_string("GET / HTTP/1.1\r\n"
"Host : example.com\r\n\r\n"),
NXT_HTTP_PARSE_INVALID,
NULL, { NULL }
},
{ {
nxt_string("GET / HTTP/1.1\r\n" nxt_string("GET / HTTP/1.1\r\n"
"Host: exa\0mple.com\r\n\r\n"), "Host: exa\0mple.com\r\n\r\n"),
@@ -298,6 +310,18 @@ static nxt_http_parse_test_case_t nxt_http_test_cases[] = {
NXT_DONE, NXT_DONE,
NULL, { NULL } NULL, { NULL }
}, },
{
nxt_string("GET / HTTP/1.1\r\n"
"Host: exa\nmple.com\r\n\r\n"),
NXT_HTTP_PARSE_INVALID,
NULL, { NULL }
},
{
nxt_string("GET / HTTP/1.1\r\n"
"Host: exa\tmple.com\r\n\r\n"),
NXT_DONE,
NULL, { NULL }
},
{ {
nxt_string("GET / HTTP/1.1\r\n" nxt_string("GET / HTTP/1.1\r\n"
"X-Unknown-Header: value\r\n" "X-Unknown-Header: value\r\n"