HTTP parser: fixed parsing of field values ending with space.
This closes #82 issue on GitHub.
This commit is contained in:
@@ -606,7 +606,7 @@ static nxt_int_t
|
|||||||
nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,
|
nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,
|
||||||
u_char *end)
|
u_char *end)
|
||||||
{
|
{
|
||||||
u_char *p, ch;
|
u_char *p, *start, ch;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
p = *pos;
|
p = *pos;
|
||||||
@@ -625,14 +625,16 @@ nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,
|
|||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pos = p;
|
start = p;
|
||||||
|
|
||||||
p += rp->field_value.length;
|
p += rp->field_value.length;
|
||||||
|
|
||||||
p = nxt_http_lookup_field_end(p, end);
|
p = nxt_http_lookup_field_end(p, end);
|
||||||
|
|
||||||
if (nxt_slow_path(p == end)) {
|
if (nxt_slow_path(p == end)) {
|
||||||
len = p - *pos;
|
*pos = 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;
|
||||||
@@ -649,22 +651,22 @@ nxt_http_parse_field_value(nxt_http_request_parse_t *rp, u_char **pos,
|
|||||||
return NXT_HTTP_PARSE_INVALID;
|
return NXT_HTTP_PARSE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nxt_fast_path(p != *pos)) {
|
*pos = p;
|
||||||
|
|
||||||
|
if (nxt_fast_path(p != start)) {
|
||||||
while (p[-1] == ' ') {
|
while (p[-1] == ' ') {
|
||||||
p--;
|
p--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
len = p - *pos;
|
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->field_value.length = len;
|
||||||
rp->field_value.start = *pos;
|
rp->field_value.start = start;
|
||||||
|
|
||||||
*pos = p;
|
|
||||||
|
|
||||||
return nxt_http_parse_field_end(rp, pos, end);
|
return nxt_http_parse_field_end(rp, pos, end);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,6 +226,12 @@ 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:example.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"
|
||||||
"Host:\r\n\r\n"),
|
"Host:\r\n\r\n"),
|
||||||
|
|||||||
Reference in New Issue
Block a user