=== modified file 'src/AccessLogEntry.h' --- src/AccessLogEntry.h 2009-12-22 01:12:53 +0000 +++ src/AccessLogEntry.h 2010-01-27 21:36:21 +0000 @@ -47,7 +47,9 @@ { public: - AccessLogEntry() : url(NULL) , reply(NULL), request(NULL) {} + AccessLogEntry() : url(NULL) , reply(NULL), request(NULL), + adapted_request(NULL) + {} const char *url; @@ -134,12 +136,17 @@ public: Headers() : request(NULL), + adapted_request(NULL), + #if ICAP_CLIENT icap(NULL), #endif reply(NULL) {} - char *request; + char *request; //< virgin HTTP request headers + + char *adapted_request; //< HTTP request headers after adaptation and redirection + #if ICAP_CLIENT char * icap; ///< last matching ICAP response header. @@ -159,7 +166,9 @@ } _private; HierarchyLogEntry hier; HttpReply *reply; - HttpRequest *request; + HttpRequest *request; //< virgin HTTP request + HttpRequest *adapted_request; //< HTTP request after adaptation and redirection + #if ICAP_CLIENT /** \brief This subclass holds log info for ICAP part of request === modified file 'src/cf.data.pre' --- src/cf.data.pre 2010-01-21 12:48:36 +0000 +++ src/cf.data.pre 2010-01-27 21:41:41 +0000 @@ -2495,8 +2495,10 @@ HTTP cache related format codes: - [http::]>h Request header. Optional header name argument + [http::]>h Virgin request header. Optional header name argument on the format header[:[separator]element] + [http::]>ha The HTTP request headers after adaptation and redirection. + Optional header name argument as for >h [http::]h [http::]un User name === modified file 'src/client_side.cc' --- src/client_side.cc 2010-01-13 01:13:17 +0000 +++ src/client_side.cc 2010-01-27 21:00:28 +0000 @@ -461,7 +461,17 @@ mb.init(); packerToMemInit(&p, &mb); request->header.packInto(&p); - aLogEntry->headers.request = xstrdup(mb.buf); + //This is the request after adaptation or redirection + aLogEntry->headers.adapted_request = xstrdup(mb.buf); + + // the virgin request is saved to aLogEntry->request + if (aLogEntry->request) { + packerClean(&p); + mb.reset(); + packerToMemInit(&p, &mb); + aLogEntry->request->header.packInto(&p); + aLogEntry->headers.request = xstrdup(mb.buf); + } #if ICAP_CLIENT packerClean(&p); @@ -559,7 +569,7 @@ if (!Config.accessList.log || checklist->fastCheck()) { if (request) - al.request = HTTPMSGLOCK(request); + al.adapted_request = HTTPMSGLOCK(request); accessLogLog(&al, checklist); updateCounters(); === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2010-01-22 01:13:11 +0000 +++ src/client_side_request.cc 2010-01-27 21:02:01 +0000 @@ -1256,6 +1256,10 @@ { assert(calloutContext); + /*Save the original request for logging purposes*/ + if (!calloutContext->http->al.request) + calloutContext->http->al.request = HTTPMSGLOCK(request); + if (!calloutContext->http_access_done) { debugs(83, 3, HERE << "Doing calloutContext->clientAccessCheck()"); calloutContext->http_access_done = true; === modified file 'src/log/access_log.cc' --- src/log/access_log.cc 2009-12-22 01:12:53 +0000 +++ src/log/access_log.cc 2010-01-27 21:09:18 +0000 @@ -359,6 +359,10 @@ LFT_REQUEST_HEADER_ELEM, LFT_REQUEST_ALL_HEADERS, + LFT_ADAPTED_REQUEST_HEADER, + LFT_ADAPTED_REQUEST_HEADER_ELEM, + LFT_ADAPTED_REQUEST_ALL_HEADERS, + LFT_REPLY_HEADER, LFT_REPLY_HEADER_ELEM, LFT_REPLY_ALL_HEADERS, @@ -512,6 +516,8 @@ {"ha", LFT_ADAPTED_REQUEST_HEADER}, + {">ha", LFT_ADAPTED_REQUEST_ALL_HEADERS}, {">h", LFT_REQUEST_HEADER}, {">h", LFT_REQUEST_ALL_HEADERS}, {"request) + sb = al->adapted_request->header.getByName(fmt->data.header.header); + + out = sb.termedBuf(); + + quote = 1; + + break; + case LFT_REPLY_HEADER: if (al->reply) sb = al->reply->header.getByName(fmt->data.header.header); @@ -954,6 +971,16 @@ break; + case LFT_ADAPTED_REQUEST_HEADER_ELEM: + if (al->adapted_request) + sb = al->adapted_request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); + + out = sb.termedBuf(); + + quote = 1; + + break; + case LFT_REPLY_HEADER_ELEM: if (al->reply) sb = al->reply->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator); @@ -971,6 +998,13 @@ break; + case LFT_ADAPTED_REQUEST_ALL_HEADERS: + out = al->headers.adapted_request; + + quote = 1; + + break; + case LFT_REPLY_ALL_HEADERS: out = al->headers.reply; @@ -1393,6 +1427,8 @@ case LFT_ICAP_REP_HEADER: #endif + case LFT_ADAPTED_REQUEST_HEADER: + case LFT_REQUEST_HEADER: case LFT_REPLY_HEADER: @@ -1415,6 +1451,11 @@ case LFT_REQUEST_HEADER: lt->type = LFT_REQUEST_HEADER_ELEM; break; + + case LFT_ADAPTED_REQUEST_HEADER: + lt->type = LFT_ADAPTED_REQUEST_HEADER_ELEM; + break; + case LFT_REPLY_HEADER: lt->type = LFT_REPLY_HEADER_ELEM; break; @@ -1440,6 +1481,11 @@ case LFT_REQUEST_HEADER: lt->type = LFT_REQUEST_ALL_HEADERS; break; + + case LFT_ADAPTED_REQUEST_HEADER: + lt->type = LFT_ADAPTED_REQUEST_ALL_HEADERS; + break; + case LFT_REPLY_HEADER: lt->type = LFT_REPLY_ALL_HEADERS; break; @@ -1553,7 +1599,7 @@ case LFT_ICAP_REP_HEADER_ELEM: #endif case LFT_REQUEST_HEADER_ELEM: - + case LFT_ADAPTED_REQUEST_HEADER_ELEM: case LFT_REPLY_HEADER_ELEM: if (t->data.header.separator != ',') @@ -1567,6 +1613,9 @@ case LFT_REQUEST_HEADER_ELEM: type = LFT_REQUEST_HEADER_ELEM; break; + case LFT_ADAPTED_REQUEST_HEADER_ELEM: + type = LFT_ADAPTED_REQUEST_HEADER_ELEM; + break; case LFT_REPLY_HEADER_ELEM: type = LFT_REPLY_HEADER_ELEM; break; @@ -1588,7 +1637,7 @@ break; case LFT_REQUEST_ALL_HEADERS: - + case LFT_ADAPTED_REQUEST_ALL_HEADERS: case LFT_REPLY_ALL_HEADERS: #if ICAP_CLIENT @@ -1601,6 +1650,9 @@ case LFT_REQUEST_ALL_HEADERS: type = LFT_REQUEST_HEADER; break; + case LFT_ADAPTED_REQUEST_ALL_HEADERS: + type = LFT_ADAPTED_REQUEST_HEADER; + break; case LFT_REPLY_ALL_HEADERS: type = LFT_REPLY_HEADER; break; @@ -2377,6 +2429,9 @@ safe_free(aLogEntry->headers.reply); safe_free(aLogEntry->cache.authuser); + safe_free(aLogEntry->headers.adapted_request); + HTTPMSGUNLOCK(aLogEntry->adapted_request); + HTTPMSGUNLOCK(aLogEntry->reply); HTTPMSGUNLOCK(aLogEntry->request); #if ICAP_CLIENT