diff -up httpd-2.4.12/modules/loggers/mod_log_config.c.orig httpd-2.4.12/modules/loggers/mod_log_config.c --- httpd-2.4.12/modules/loggers/mod_log_config.c.orig 2014-08-22 20:18:08.000000000 +0200 +++ httpd-2.4.12/modules/loggers/mod_log_config.c 2015-03-15 00:16:52.448752117 +0100 @@ -368,14 +368,17 @@ static const char *log_request_file(requ { return ap_escape_logitem(r->pool, r->filename); } + static const char *log_request_uri(request_rec *r, char *a) { return ap_escape_logitem(r->pool, r->uri); } + static const char *log_request_method(request_rec *r, char *a) { return ap_escape_logitem(r->pool, r->method); } + static const char *log_log_id(request_rec *r, char *a) { if (a && !strcmp(a, "c")) { @@ -385,16 +388,19 @@ static const char *log_log_id(request_re return r->log_id ? r->log_id : "-"; } } + static const char *log_request_protocol(request_rec *r, char *a) { return ap_escape_logitem(r->pool, r->protocol); } + static const char *log_request_query(request_rec *r, char *a) { return (r->args) ? apr_pstrcat(r->pool, "?", ap_escape_logitem(r->pool, r->args), NULL) : ""; } + static const char *log_status(request_rec *r, char *a) { return pfmt(r->pool, r->status); @@ -425,21 +431,10 @@ static const char *log_bytes_sent(reques } } - -static const char *log_header_in(request_rec *r, char *a) -{ - return ap_escape_logitem(r->pool, apr_table_get(r->headers_in, a)); -} - -static const char *log_trailer_in(request_rec *r, char *a) -{ - return ap_escape_logitem(r->pool, apr_table_get(r->trailers_in, a)); -} - - static APR_INLINE char *find_multiple_headers(apr_pool_t *pool, const apr_table_t *table, - const char *key) + const char *key, + int match_wildcard) { const apr_array_header_t *elts; const apr_table_entry_t *t_elt; @@ -447,7 +442,9 @@ static APR_INLINE char *find_multiple_he apr_size_t len; struct sle { struct sle *next; + const char *key; const char *value; + apr_size_t keylen; apr_size_t len; } *result_list, *rp; @@ -463,7 +460,8 @@ static APR_INLINE char *find_multiple_he result_list = rp = NULL; do { - if (!strcasecmp(t_elt->key, key)) { + if (!strcasecmp(t_elt->key, key) || + (match_wildcard && !ap_strcasecmp_match(t_elt->key, key))) { if (!result_list) { result_list = rp = apr_palloc(pool, sizeof(*rp)); } @@ -476,6 +474,12 @@ static APR_INLINE char *find_multiple_he rp->value = t_elt->val; rp->len = strlen(rp->value); + if (match_wildcard) { + rp->key = t_elt->key; + rp->keylen = strlen(rp->key); + len += rp->keylen + 2; /* ": " */ + } + len += rp->len; } ++t_elt; @@ -491,6 +495,12 @@ static APR_INLINE char *find_multiple_he *cp++ = ','; *cp++ = ' '; } + if (match_wildcard) { + memcpy(cp, rp->key, rp->keylen); + cp += rp->keylen; + *cp++ = ':'; + *cp++ = ' '; + } memcpy(cp, rp->value, rp->len); cp += rp->len; rp = rp->next; @@ -503,15 +513,36 @@ static APR_INLINE char *find_multiple_he return NULL; } +static const char *log_header_in(request_rec *r, char *a) +{ + const char *cp = NULL; + int is_wildcard = ap_is_matchexp(a); + + if (is_wildcard) { + cp = find_multiple_headers(r->pool, r->headers_in, a, is_wildcard); + } + else { + cp = apr_table_get(r->headers_in, a); + } + + return ap_escape_logitem(r->pool, cp); +} + +static const char *log_trailer_in(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, apr_table_get(r->trailers_in, a)); +} + static const char *log_header_out(request_rec *r, char *a) { const char *cp = NULL; + int is_wildcard = ap_is_matchexp(a); if (!strcasecmp(a, "Content-type") && r->content_type) { cp = ap_field_noparam(r->pool, r->content_type); } - else if (!strcasecmp(a, "Set-Cookie")) { - cp = find_multiple_headers(r->pool, r->headers_out, a); + else if (!strcasecmp(a, "Set-Cookie") || is_wildcard) { + cp = find_multiple_headers(r->pool, r->headers_out, a, is_wildcard); } else { cp = apr_table_get(r->headers_out, a); @@ -529,6 +560,7 @@ static const char *log_note(request_rec { return ap_escape_logitem(r->pool, apr_table_get(r->notes, a)); } + static const char *log_env_var(request_rec *r, char *a) { return ap_escape_logitem(r->pool, apr_table_get(r->subprocess_env, a));