{
public:
- AccessLogEntry() : url(NULL) , reply(NULL), request(NULL) {}
+ AccessLogEntry() : url(NULL) , reply(NULL), request(NULL),
+ adapted_request(NULL)
+ {}
const char *url;
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.
} _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
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);
if (!Config.accessList.log || checklist->fastCheck()) {
if (request)
- al.request = HTTPMSGLOCK(request);
+ al.adapted_request = HTTPMSGLOCK(request);
accessLogLog(&al, checklist);
updateCounters();
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,
{"<tt", LFT_TOTAL_SERVER_SIDE_RESPONSE_TIME},
{"dt", LFT_DNS_WAIT_TIME},
+ {">ha", LFT_ADAPTED_REQUEST_HEADER},
+ {">ha", LFT_ADAPTED_REQUEST_ALL_HEADERS},
{">h", LFT_REQUEST_HEADER},
{">h", LFT_REQUEST_ALL_HEADERS},
{"<h", LFT_REPLY_HEADER},
break;
+ case LFT_ADAPTED_REQUEST_HEADER:
+
+ if (al->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);
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);
break;
+ case LFT_ADAPTED_REQUEST_ALL_HEADERS:
+ out = al->headers.adapted_request;
+
+ quote = 1;
+
+ break;
+
case LFT_REPLY_ALL_HEADERS:
out = al->headers.reply;
case LFT_ICAP_REP_HEADER:
#endif
+ case LFT_ADAPTED_REQUEST_HEADER:
+
case LFT_REQUEST_HEADER:
case LFT_REPLY_HEADER:
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;
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;
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 != ',')
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;
break;
case LFT_REQUEST_ALL_HEADERS:
-
+ case LFT_ADAPTED_REQUEST_ALL_HEADERS:
case LFT_REPLY_ALL_HEADERS:
#if ICAP_CLIENT
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;
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