|
|
|
@ -636,28 +636,27 @@ static size_t http_request_parse_reqline(server *srv, connection *con, buffer *h
|
|
|
|
|
return http_request_header_line_invalid(srv, 400, "unknown protocol -> 400");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*(proto - 1) = '\0'; /*(terminate for strchr())*/
|
|
|
|
|
jlen = (size_t)(proto - uri - 1);
|
|
|
|
|
|
|
|
|
|
if (*uri == '/') {
|
|
|
|
|
/* (common case) */
|
|
|
|
|
buffer_copy_string_len(con->request.uri, uri, proto - uri - 1);
|
|
|
|
|
buffer_copy_string_len(con->request.uri, uri, jlen);
|
|
|
|
|
} else if (0 == buffer_caseless_compare(uri, 7, "http://", 7) &&
|
|
|
|
|
NULL != (nuri = strchr(uri + 7, '/'))) {
|
|
|
|
|
NULL != (nuri = memchr(uri + 7, '/', jlen-7))) {
|
|
|
|
|
state->reqline_host = uri + 7;
|
|
|
|
|
state->reqline_hostlen = nuri - state->reqline_host;
|
|
|
|
|
|
|
|
|
|
buffer_copy_string_len(con->request.uri, nuri, proto - nuri - 1);
|
|
|
|
|
} else if (0 == buffer_caseless_compare(uri, 8, "https://", 8) &&
|
|
|
|
|
NULL != (nuri = strchr(uri + 8, '/'))) {
|
|
|
|
|
NULL != (nuri = memchr(uri + 8, '/', jlen-8))) {
|
|
|
|
|
state->reqline_host = uri + 8;
|
|
|
|
|
state->reqline_hostlen = nuri - state->reqline_host;
|
|
|
|
|
|
|
|
|
|
buffer_copy_string_len(con->request.uri, nuri, proto - nuri - 1);
|
|
|
|
|
} else if (!http_header_strict
|
|
|
|
|
|| (HTTP_METHOD_CONNECT == con->request.http_method && (uri[0] == ':' || light_isdigit(uri[0])))
|
|
|
|
|
|| (HTTP_METHOD_OPTIONS == con->request.http_method && uri[0] == '*' && uri[1] == '\0')) {
|
|
|
|
|
/* everything looks good so far */
|
|
|
|
|
buffer_copy_string_len(con->request.uri, uri, proto - uri - 1);
|
|
|
|
|
|| (HTTP_METHOD_OPTIONS == con->request.http_method && uri[0] == '*' && 1 == jlen)) {
|
|
|
|
|
buffer_copy_string_len(con->request.uri, uri, jlen);
|
|
|
|
|
} else {
|
|
|
|
|
return http_request_header_line_invalid(srv, 400, "request-URI parse error -> 400");
|
|
|
|
|
}
|
|
|
|
|