diff options
author | André Malo <nd@apache.org> | 2004-04-10 17:48:52 +0000 |
---|---|---|
committer | André Malo <nd@apache.org> | 2004-04-10 17:48:52 +0000 |
commit | c2a3b20beab8c60f9f0a41c711de3c19ca46494a (patch) | |
tree | c018368126eb710d88a7f4c5b52bcd3d434adc0b /modules/loggers | |
parent | cba81eaaaa6a1903be45363edf18d0c7ac6675f6 (diff) | |
download | httpd-c2a3b20beab8c60f9f0a41c711de3c19ca46494a.tar.gz |
cleanup log_header_out function:
- no need to ask r->err_headers_out, because it's already merged with
r->headers_out at this stage
- allow multiple headers like Set-Cookie to be logged properly
PR: 27787
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@103331 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/loggers')
-rw-r--r-- | modules/loggers/mod_log_config.c | 79 |
1 files changed, 75 insertions, 4 deletions
diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index 74673bbbf7..5c02503585 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -403,16 +403,87 @@ 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 APR_INLINE char *find_multiple_headers(apr_pool_t *pool, + const apr_table_t *table, + const char *key) +{ + const apr_array_header_t *elts; + const apr_table_entry_t *t_elt; + const apr_table_entry_t *t_end; + apr_size_t len; + struct sle { + struct sle *next; + const char *value; + apr_size_t len; + } *result_list, *rp; + + elts = apr_table_elts(table); + + if (!elts->nelts) { + return NULL; + } + + t_elt = (const apr_table_entry_t *)elts->elts; + t_end = t_elt + elts->nelts; + len = 1; /* \0 */ + result_list = rp = NULL; + + do { + if (!strcasecmp(t_elt->key, key)) { + if (!result_list) { + result_list = rp = apr_palloc(pool, sizeof(*rp)); + } + else { + rp = rp->next = apr_palloc(pool, sizeof(*rp)); + len += 2; /* ", " */ + } + + rp->next = NULL; + rp->value = t_elt->val; + rp->len = strlen(rp->value); + + len += rp->len; + } + ++t_elt; + } while (t_elt < t_end); + + if (result_list) { + char *result = apr_palloc(pool, len); + char *cp = result; + + rp = result_list; + while (rp) { + if (rp != result_list) { + *cp++ = ','; + *cp++ = ' '; + } + memcpy(cp, rp->value, rp->len); + cp += rp->len; + rp = rp->next; + } + *cp = '\0'; + + return result; + } + + return NULL; +} + static const char *log_header_out(request_rec *r, char *a) { - const char *cp = apr_table_get(r->headers_out, a); + const char *cp = NULL; + if (!strcasecmp(a, "Content-type") && r->content_type) { cp = ap_field_noparam(r->pool, r->content_type); } - if (cp) { - return ap_escape_logitem(r->pool, cp); + else if (!strcasecmp(a, "Set-Cookie")) { + cp = find_multiple_headers(r->pool, r->headers_out, a); } - return ap_escape_logitem(r->pool, apr_table_get(r->err_headers_out, a)); + else { + cp = apr_table_get(r->headers_out, a); + } + + return ap_escape_logitem(r->pool, cp); } static const char *log_note(request_rec *r, char *a) |