summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorColm MacCarthaigh <colm@apache.org>2006-01-27 00:20:28 +0000
committerColm MacCarthaigh <colm@apache.org>2006-01-27 00:20:28 +0000
commit91a1e172f9fcc8f6eaaf65b090501df1afc5110d (patch)
tree58687a994e1a2f22174be7a94b933f1ad089094c /modules
parentc8a47de45805283f1ab8b604a2cdbaf85d41d928 (diff)
downloadhttpd-91a1e172f9fcc8f6eaaf65b090501df1afc5110d.tar.gz
Merge r103331 from trunk:
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 Submitted by: nd git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.0.x@372669 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules')
-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 a04699955f..8187f14e92 100644
--- a/modules/loggers/mod_log_config.c
+++ b/modules/loggers/mod_log_config.c
@@ -407,16 +407,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)