summaryrefslogtreecommitdiff
path: root/modules/loggers
diff options
context:
space:
mode:
authorAndré Malo <nd@apache.org>2004-04-10 17:48:52 +0000
committerAndré Malo <nd@apache.org>2004-04-10 17:48:52 +0000
commitc2a3b20beab8c60f9f0a41c711de3c19ca46494a (patch)
treec018368126eb710d88a7f4c5b52bcd3d434adc0b /modules/loggers
parentcba81eaaaa6a1903be45363edf18d0c7ac6675f6 (diff)
downloadhttpd-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.c79
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)