diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2019-02-08 19:38:43 -0500 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2019-02-08 22:49:46 -0500 |
commit | 25185d1de0e152e4d4461b856c7d537ea12e2ef5 (patch) | |
tree | 1558690199fd665de2e709ef343eac1cb5d1dad2 | |
parent | 7493d628b901864038f5a96b3018a91a59072c89 (diff) | |
download | lighttpd-git-25185d1de0e152e4d4461b856c7d537ea12e2ef5.tar.gz |
[core] pass req hdrs buffer to http_request_parse
-rw-r--r-- | src/base.h | 2 | ||||
-rw-r--r-- | src/connections.c | 3 | ||||
-rw-r--r-- | src/request.c | 46 | ||||
-rw-r--r-- | src/request.h | 2 | ||||
-rw-r--r-- | src/t/test_request.c | 7 |
5 files changed, 28 insertions, 32 deletions
@@ -247,8 +247,6 @@ struct connection { buffer *dst_addr_buf; /* request */ - buffer *parse_request; - request request; request_uri uri; physical physical; diff --git a/src/connections.c b/src/connections.c index b76d2008..ac032555 100644 --- a/src/connections.c +++ b/src/connections.c @@ -545,7 +545,6 @@ static connection *connection_init(server *srv) { con->bytes_read = 0; con->bytes_header = 0; con->loops_per_request = 0; - con->parse_request = con->request.request; /* for http_request_parse() */ #define CLEAN(x) \ con->x = buffer_init(); @@ -798,7 +797,7 @@ static void connection_read_header(server *srv, connection *con) { save = buffer_init_buffer(con->request.request); } - if (0 != http_request_parse(srv, con)) { + if (0 != http_request_parse(srv, con, con->request.request)) { con->keep_alive = 0; con->request.content_length = 0; diff --git a/src/request.c b/src/request.c index 5ee02339..13ec2046 100644 --- a/src/request.c +++ b/src/request.c @@ -570,7 +570,8 @@ static int parse_single_header(server *srv, connection *con, parse_header_state return 1; } -static size_t http_request_parse_reqline(server *srv, connection *con, parse_header_state *state) { +static size_t http_request_parse_reqline(server *srv, connection *con, buffer *hdrs, parse_header_state *state) { + char * const ptr = hdrs->ptr; char *uri = NULL, *proto = NULL, *method = NULL; int line = 0; @@ -590,11 +591,11 @@ static size_t http_request_parse_reqline(server *srv, connection *con, parse_hea * * <method> <uri> <protocol>\r\n * */ - ilen = buffer_string_length(con->parse_request); + ilen = buffer_string_length(hdrs); for (i = 0, first = 0; i < ilen && line == 0; i++) { - switch(con->parse_request->ptr[i]) { + switch(ptr[i]) { case '\r': - if (con->parse_request->ptr[i+1] != '\n') break; + if (ptr[i+1] != '\n') break; /* fall through */ case '\n': { @@ -602,17 +603,17 @@ static size_t http_request_parse_reqline(server *srv, connection *con, parse_hea char *nuri = NULL; size_t j, jlen; - buffer_copy_string_len(con->request.request_line, con->parse_request->ptr, i); + buffer_copy_string_len(con->request.request_line, ptr, i); /* \r\n -> \0\0 */ - if (con->parse_request->ptr[i] == '\r') { - con->parse_request->ptr[i] = '\0'; + if (ptr[i] == '\r') { + ptr[i] = '\0'; ++i; } else if (http_header_strict) { /* '\n' */ http_request_missing_CR_before_LF(srv, con); return 0; } - con->parse_request->ptr[i] = '\0'; + ptr[i] = '\0'; if (request_line_stage != 2) { if (srv->srvconf.log_request_header_on_error) { @@ -621,7 +622,7 @@ static size_t http_request_parse_reqline(server *srv, connection *con, parse_hea return 0; } - proto = con->parse_request->ptr + first; + proto = ptr + first; *(uri - 1) = '\0'; *(proto - 1) = '\0'; @@ -765,12 +766,12 @@ static size_t http_request_parse_reqline(server *srv, connection *con, parse_hea switch(request_line_stage) { case 0: /* GET|POST|... */ - method = con->parse_request->ptr + first; + method = ptr + first; first = i + 1; break; case 1: /* /foobar/... */ - uri = con->parse_request->ptr + first; + uri = ptr + first; first = i + 1; break; default: @@ -808,7 +809,8 @@ static size_t http_request_parse_reqline(server *srv, connection *con, parse_hea return i; } -int http_request_parse(server *srv, connection *con) { +int http_request_parse(server *srv, connection *con, buffer *hdrs) { + char * const ptr = hdrs->ptr; char *value = NULL; size_t i, first, ilen; const unsigned int http_header_strict = (con->conf.http_parseopts & HTTP_PARSEOPT_HEADER_STRICT); @@ -816,19 +818,19 @@ int http_request_parse(server *srv, connection *con) { parse_header_state state; init_parse_header_state(&state); - i = first = http_request_parse_reqline(srv, con, &state); + i = first = http_request_parse_reqline(srv, con, hdrs, &state); if (0 == i) goto failure; - if (con->parse_request->ptr[i] == ' ' || con->parse_request->ptr[i] == '\t') { + if (ptr[i] == ' ' || ptr[i] == '\t') { if (srv->srvconf.log_request_header_on_error) { log_error_write(srv, __FILE__, __LINE__, "s", "WS at the start of first line -> 400"); } goto failure; } - ilen = buffer_string_length(con->parse_request); + ilen = buffer_string_length(hdrs); for (int is_key = 1, key_len = 0, done = 0; i <= ilen && !done; ++i) { - char *cur = con->parse_request->ptr + i; + char *cur = ptr + i; if (is_key) { /** @@ -853,7 +855,7 @@ int http_request_parse(server *srv, connection *con) { is_key = 0; key_len = i - first; value = cur + 1; - i = cur - con->parse_request->ptr; + i = cur - ptr; break; case '(': case ')': @@ -877,10 +879,10 @@ int http_request_parse(server *srv, connection *con) { } goto failure; case '\r': - if (con->parse_request->ptr[i+1] == '\n' && i == first) { + if (ptr[i+1] == '\n' && i == first) { /* End of Header */ - con->parse_request->ptr[i] = '\0'; - con->parse_request->ptr[i+1] = '\0'; + ptr[i] = '\0'; + ptr[i+1] = '\0'; i++; @@ -898,7 +900,7 @@ int http_request_parse(server *srv, connection *con) { http_request_missing_CR_before_LF(srv, con); goto failure; } else if (i == first) { - con->parse_request->ptr[i] = '\0'; + ptr[i] = '\0'; done = 1; break; } @@ -949,7 +951,7 @@ int http_request_parse(server *srv, connection *con) { /* End of Headerline */ *cur = '\0'; /*(for if value is further parsed and '\0' is expected at end of string)*/ - if (!parse_single_header(srv, con, &state, con->parse_request->ptr + first, key_len, value, cur - value)) { + if (!parse_single_header(srv, con, &state, ptr + first, key_len, value, cur - value)) { /* parse_single_header should already have logged it */ goto failure; } diff --git a/src/request.h b/src/request.h index ac5f1a14..e178f643 100644 --- a/src/request.h +++ b/src/request.h @@ -5,7 +5,7 @@ #include "base_decls.h" #include "buffer.h" -int http_request_parse(server *srv, connection *con); +int http_request_parse(server *srv, connection *con, buffer *hdrs); int http_request_host_normalize(buffer *b, int scheme_port); int http_request_host_policy(connection *con, buffer *b, const buffer *scheme); diff --git a/src/t/test_request.c b/src/t/test_request.c index 374427b9..bc7645cb 100644 --- a/src/t/test_request.c +++ b/src/t/test_request.c @@ -20,7 +20,6 @@ static void test_request_connection_reset(connection *con) con->header_len = 0; con->http_status = 0; buffer_reset(con->proto); - buffer_reset(con->parse_request); buffer_reset(con->request.request); buffer_reset(con->request.request_line); buffer_reset(con->request.orig_uri); @@ -31,8 +30,8 @@ static void test_request_connection_reset(connection *con) static void run_http_request_parse(server *srv, connection *con, int line, int status, const char *desc, const char *req, size_t reqlen) { test_request_connection_reset(con); - buffer_copy_string_len(con->parse_request, req, reqlen); - http_request_parse(srv, con); + buffer_copy_string_len(con->request.request, req, reqlen); + http_request_parse(srv, con, con->request.request); if (con->http_status != status) { fprintf(stderr, "%s.%d: %s() failed: expected '%d', got '%d' for test %s\n", @@ -462,7 +461,6 @@ int main (void) memset(&con, 0, sizeof(connection)); con.proto = buffer_init(); - con.parse_request = buffer_init(); con.request.request = buffer_init(); con.request.request_line = buffer_init(); con.request.orig_uri = buffer_init(); @@ -476,7 +474,6 @@ int main (void) test_request_http_request_parse(&srv, &con); buffer_free(con.proto); - buffer_free(con.parse_request); buffer_free(con.request.request); buffer_free(con.request.request_line); buffer_free(con.request.orig_uri); |