diff options
-rw-r--r-- | src/connections.c | 5 | ||||
-rw-r--r-- | src/log.c | 29 | ||||
-rw-r--r-- | src/log.h | 4 | ||||
-rw-r--r-- | src/mod_fastcgi.c | 4 | ||||
-rw-r--r-- | src/request.c | 4 | ||||
-rw-r--r-- | src/response.c | 3 |
6 files changed, 26 insertions, 23 deletions
diff --git a/src/connections.c b/src/connections.c index 8044b831..58021d3c 100644 --- a/src/connections.c +++ b/src/connections.c @@ -772,9 +772,8 @@ static int connection_handle_read_state(connection * const con) { r->rqst_header_len = header_len; if (r->conf.log_request_header) - log_error(r->conf.errh, __FILE__, __LINE__, - "fd: %d request-len: %d\n%.*s", con->fd, - (int)header_len, (int)header_len, hdrs); + log_error_multiline(r->conf.errh, __FILE__, __LINE__, + hdrs, header_len, "fd:%d rqst: ", con->fd); http_request_headers_process(r, hdrs, hoff, con->proto_default_port); chunkqueue_mark_written(cq, r->rqst_header_len); connection_set_state(r, CON_STATE_REQUEST_END); @@ -247,13 +247,14 @@ log_perror (log_error_st * const errh, void -log_error_multiline_buffer (log_error_st * const restrict errh, - const char * const restrict filename, - const unsigned int line, - const buffer * const restrict multiline, - const char * const restrict fmt, ...) +log_error_multiline (log_error_st * const restrict errh, + const char * const restrict filename, + const unsigned int line, + const char * const restrict multiline, + const size_t len, + const char * const restrict fmt, ...) { - if (multiline->used < 2) return; + if (0 == len) return; const int errnum = errno; buffer * const b = &errh->b; @@ -264,17 +265,19 @@ log_error_multiline_buffer (log_error_st * const restrict errh, log_buffer_vprintf(b, fmt, ap); va_end(ap); - const size_t prefix_len = buffer_clen(b); - const char * const end = multiline->ptr + multiline->used - 2; - const char *pos = multiline->ptr-1, *current_line; - do { - pos = strchr(current_line = pos+1, '\n'); + const uint32_t prefix_len = buffer_clen(b); + const char * const end = multiline + len; + for (const char *pos = multiline; pos < end; ++pos) { + const char * const current_line = pos; + pos = strchr(pos, '\n'); if (!pos) pos = end; + size_t n = (size_t)(pos - current_line); + if (n && current_line[n-1] == '\r') --n; /*(skip "\r\n")*/ buffer_truncate(b, prefix_len); - log_buffer_append_encoded(b, current_line, pos - current_line); + log_buffer_append_encoded(b, current_line, n); log_write(errh, b); - } while (pos < end); + } errno = errnum; } @@ -42,7 +42,7 @@ __attribute_format__((__printf__, 4, 5)) void log_perror(log_error_st *errh, const char *filename, unsigned int line, const char *fmt, ...); __attribute_cold__ -__attribute_format__((__printf__, 5, 6)) -void log_error_multiline_buffer(log_error_st *errh, const char *filename, unsigned int line, const buffer *multiline, const char *fmt, ...); +__attribute_format__((__printf__, 6, 7)) +void log_error_multiline(log_error_st *errh, const char *filename, unsigned int line, const char * restrict multiline, const size_t len, const char *fmt, ...); #endif diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c index 189b02c8..aae72a6d 100644 --- a/src/mod_fastcgi.c +++ b/src/mod_fastcgi.c @@ -462,8 +462,8 @@ static handler_t fcgi_recv_parse(request_st * const r, struct http_response_opts buffer * const tb = r->tmp_buf; buffer_clear(tb); fastcgi_get_packet_body(tb, hctx, &packet); - log_error_multiline_buffer(r->conf.errh, __FILE__, __LINE__, tb, - "FastCGI-stderr:"); + log_error_multiline(r->conf.errh, __FILE__, __LINE__, + BUF_PTR_LEN(tb), "FastCGI-stderr:"); } break; case FCGI_END_REQUEST: diff --git a/src/request.c b/src/request.c index 95a82221..8366986c 100644 --- a/src/request.c +++ b/src/request.c @@ -1266,8 +1266,8 @@ http_request_headers_process (request_st * const restrict r, char * const restri if (r->conf.log_request_header_on_error) { /*(http_request_parse_headers() modifies hdrs only to * undo line-wrapping in-place using spaces)*/ - log_error(r->conf.errh, __FILE__, __LINE__, - "request-header:\n%.*s", (int)r->rqst_header_len, hdrs); + log_error_multiline(r->conf.errh, __FILE__, __LINE__, + hdrs, r->rqst_header_len, "rqst: "); } } } diff --git a/src/response.c b/src/response.c index 1f0a69cd..bb2bbb04 100644 --- a/src/response.c +++ b/src/response.c @@ -161,7 +161,8 @@ http_response_write_header (request_st * const r) r->resp_header_len = buffer_clen(b); if (r->conf.log_response_header) { - log_error(r->conf.errh,__FILE__,__LINE__,"Response-Header:\n%s",b->ptr); + log_error_multiline(r->conf.errh, __FILE__, __LINE__, + BUF_PTR_LEN(b), "fd:%d resp: ", r->con->fd); } chunkqueue_prepend_buffer_commit(cq); |