diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2019-02-08 01:00:48 -0500 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2019-02-08 22:49:46 -0500 |
commit | d7ad5819e6c80170ad03cc790a4f18d4f40e91a4 (patch) | |
tree | 98e2064a0b6195086683dc7a6b3d7f1170d79001 /src/connections.c | |
parent | a620f80b77be952011ae326b4609f2f3fb7684b0 (diff) | |
download | lighttpd-git-d7ad5819e6c80170ad03cc790a4f18d4f40e91a4.tar.gz |
[core] copy request only if might need for logging
copy request header only if we may need to log it upon error
Diffstat (limited to 'src/connections.c')
-rw-r--r-- | src/connections.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/src/connections.c b/src/connections.c index 05e64e73..4ae98823 100644 --- a/src/connections.c +++ b/src/connections.c @@ -2,6 +2,7 @@ #include "base.h" #include "buffer.h" +#include "burl.h" /* HTTP_PARSEOPT_HEADER_STRICT */ #include "log.h" #include "connections.h" #include "fdevent.h" @@ -671,16 +672,12 @@ static int connection_reset(server *srv, connection *con) { CLEAN(request.uri); CLEAN(request.request_line); CLEAN(request.pathinfo); - CLEAN(request.request); /* CLEAN(request.orig_uri); */ /* CLEAN(uri.path); */ CLEAN(uri.path_raw); /* CLEAN(uri.query); */ - - CLEAN(parse_request); - #undef CLEAN buffer_clear(con->uri.scheme); @@ -717,6 +714,7 @@ static void connection_read_header(server *srv, connection *con) { chunk *c; size_t hlen = 0; int le = 0; + buffer *save; for (c = cq->first; c; c = c->next) { size_t clen = buffer_string_length(c->mem) - c->offset; @@ -762,6 +760,28 @@ static void connection_read_header(server *srv, connection *con) { chunkqueue_remove_finished_chunks(cq); + /* skip past \r\n or \n after previous POST request when keep-alive */ + if (con->request_count > 1) { + char * const s = con->request.request->ptr; + #ifdef __COVERITY__ + if (buffer_string_length(con->request.request) < 2) { + return; + } + #endif + if (s[0] == '\r' && s[1] == '\n') { + size_t len = buffer_string_length(con->request.request); + memmove(s, s+2, len-2); + buffer_string_set_length(con->request.request, len-2); + } + else if (s[0] == '\n') { + if (!(con->conf.http_parseopts & HTTP_PARSEOPT_HEADER_STRICT)) { + size_t len = buffer_string_length(con->request.request); + memmove(s, s+1, len-1); + buffer_string_set_length(con->request.request, len-1); + } + } + } + if (con->conf.log_request_header) { log_error_write(srv, __FILE__, __LINE__, "sdsdSb", "fd:", con->fd, @@ -774,16 +794,27 @@ static void connection_read_header(server *srv, connection *con) { buffer_reset(con->uri.query); buffer_reset(con->request.orig_uri); + save = con->parse_request; + con->parse_request = con->request.request; /* for http_request_parse() */ + if (srv->srvconf.log_request_header_on_error) { + /* copy request only if we may need to log it upon error */ + buffer_copy_buffer(save, con->request.request); + } + if (0 != http_request_parse(srv, con)) { con->keep_alive = 0; con->request.content_length = 0; if (srv->srvconf.log_request_header_on_error) { log_error_write(srv, __FILE__, __LINE__, "Sb", - "request-header:\n", con->request.request); + "request-header:\n", save); } } + con->parse_request = save; + buffer_reset(save); + buffer_reset(con->request.request); + connection_set_state(srv, con, CON_STATE_REQUEST_END); } |