Hi all,
This patch adds a new format code which allow the user to log HTTP
request header or header fields before they are adapted.
The existing "http::>h" format code logs HTTP request headers after
adaptation.
The new format code is the "http::>hv".
This is a Measurement Factory project.
Regards,
Christos
=== modified file 'src/AccessLogEntry.h'
--- src/AccessLogEntry.h 2009-12-22 01:12:53 +0000
+++ src/AccessLogEntry.h 2010-01-12 18:54:44 +0000
@@ -47,7 +47,11 @@
{
public:
- AccessLogEntry() : url(NULL) , reply(NULL), request(NULL) {}
+ AccessLogEntry() : url(NULL) , reply(NULL), request(NULL),
+#if USE_ADAPTATION
+ virgin_request(NULL)
+#endif
+ {}
const char *url;
@@ -134,6 +138,10 @@
public:
Headers() : request(NULL),
+#if USE_ADAPTATION
+ virgin_request(NULL),
+#endif
+
#if ICAP_CLIENT
icap(NULL),
#endif
@@ -141,6 +149,11 @@
char *request;
+#if USE_ADAPTATION
+ char *virgin_request;
+#endif
+
+
#if ICAP_CLIENT
char * icap; ///< last matching ICAP response header.
#endif
@@ -160,6 +173,10 @@
HierarchyLogEntry hier;
HttpReply *reply;
HttpRequest *request;
+#if USE_ADAPTATION
+ HttpRequest *virgin_request;
+#endif
+
#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-02 04:32:46 +0000
+++ src/cf.data.pre 2010-01-12 18:55:43 +0000
@@ -2547,7 +2547,7 @@
when multiple ICAP transactions per HTTP
transaction are supported.
- If adaptation is enabled the following two codes become available:
+ If adaptation is enabled the following codes become available:
adapt::sum_trs Summed adaptation transaction response
times recorded as a comma-separated list in
@@ -2567,6 +2567,10 @@
together. Instead, all transaction response
times are recorded individually.
+ http::>hv The original (non adapted) HTTP request header.
+ Optional header name argument on the format
+ header[:[separator]element]
+
You can prefix adapt::*_trs format codes with adaptation
service name in curly braces to record response time(s) specific
to that service. For example: %{my_service}adapt::sum_trs
=== modified file 'src/client_side.cc'
--- src/client_side.cc 2010-01-01 21:26:45 +0000
+++ src/client_side.cc 2010-01-12 18:54:44 +0000
@@ -463,6 +463,16 @@
request->header.packInto(&p);
aLogEntry->headers.request = xstrdup(mb.buf);
+#if USE_ADAPTATION
+ if (aLogEntry->virgin_request) {
+ packerClean(&p);
+ mb.reset();
+ packerToMemInit(&p, &mb);
+ aLogEntry->virgin_request->header.packInto(&p);
+ aLogEntry->headers.virgin_request = xstrdup(mb.buf);
+ }
+#endif
+
#if ICAP_CLIENT
packerClean(&p);
mb.reset();
=== modified file 'src/client_side_request.cc'
--- src/client_side_request.cc 2009-12-11 23:37:30 +0000
+++ src/client_side_request.cc 2010-01-12 18:54:44 +0000
@@ -1264,6 +1264,9 @@
#if USE_ADAPTATION
if (!calloutContext->adaptation_acl_check_done) {
calloutContext->adaptation_acl_check_done = true;
+ /*Save the original request for logging purposes*/
+ calloutContext->http->al.virgin_request = HTTPMSGLOCK(request);
+
if (Adaptation::AccessCheck::Start(
Adaptation::methodReqmod, Adaptation::pointPreCache,
request, NULL, adaptationAclCheckDoneWrapper, calloutContext))
=== 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-12 18:55:13 +0000
@@ -359,6 +359,12 @@
LFT_REQUEST_HEADER_ELEM,
LFT_REQUEST_ALL_HEADERS,
+#if USE_ADAPTATION
+ LFT_VIRGIN_REQUEST_HEADER,
+ LFT_VIRGIN_REQUEST_HEADER_ELEM,
+ LFT_VIRGIN_REQUEST_ALL_HEADERS,
+#endif
+
LFT_REPLY_HEADER,
LFT_REPLY_HEADER_ELEM,
LFT_REPLY_ALL_HEADERS,
@@ -512,6 +518,8 @@
{"<tt", LFT_TOTAL_SERVER_SIDE_RESPONSE_TIME},
{"dt", LFT_DNS_WAIT_TIME},
+ {">hv", LFT_VIRGIN_REQUEST_HEADER},
+ {">hv", LFT_VIRGIN_REQUEST_ALL_HEADERS},
{">h", LFT_REQUEST_HEADER},
{">h", LFT_REQUEST_ALL_HEADERS},
{"<h", LFT_REPLY_HEADER},
@@ -765,6 +773,19 @@
break;
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER:
+
+ if (al->virgin_request)
+ sb = al->virgin_request->header.getByName(fmt->data.header.header);
+
+ out = sb.termedBuf();
+
+ quote = 1;
+
+ break;
+#endif
+
case LFT_REPLY_HEADER:
if (al->reply)
sb = al->reply->header.getByName(fmt->data.header.header);
@@ -954,6 +975,18 @@
break;
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER_ELEM:
+ if (al->virgin_request)
+ sb = al->virgin_request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator);
+
+ out = sb.termedBuf();
+
+ quote = 1;
+
+ break;
+#endif
+
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 +1004,15 @@
break;
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_ALL_HEADERS:
+ out = al->headers.virgin_request;
+
+ quote = 1;
+
+ break;
+#endif
+
case LFT_REPLY_ALL_HEADERS:
out = al->headers.reply;
@@ -1393,6 +1435,10 @@
case LFT_ICAP_REP_HEADER:
#endif
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER:
+#endif
+
case LFT_REQUEST_HEADER:
case LFT_REPLY_HEADER:
@@ -1415,6 +1461,13 @@
case LFT_REQUEST_HEADER:
lt->type = LFT_REQUEST_HEADER_ELEM;
break;
+
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER:
+ lt->type = LFT_VIRGIN_REQUEST_HEADER_ELEM;
+ break;
+#endif
+
case LFT_REPLY_HEADER:
lt->type = LFT_REPLY_HEADER_ELEM;
break;
@@ -1440,6 +1493,13 @@
case LFT_REQUEST_HEADER:
lt->type = LFT_REQUEST_ALL_HEADERS;
break;
+
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER:
+ lt->type = LFT_VIRGIN_REQUEST_ALL_HEADERS;
+ break;
+#endif
+
case LFT_REPLY_HEADER:
lt->type = LFT_REPLY_ALL_HEADERS;
break;
@@ -1553,7 +1613,9 @@
case LFT_ICAP_REP_HEADER_ELEM:
#endif
case LFT_REQUEST_HEADER_ELEM:
-
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER_ELEM:
+#endif
case LFT_REPLY_HEADER_ELEM:
if (t->data.header.separator != ',')
@@ -1567,6 +1629,11 @@
case LFT_REQUEST_HEADER_ELEM:
type = LFT_REQUEST_HEADER_ELEM;
break;
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_HEADER_ELEM:
+ type = LFT_VIRGIN_REQUEST_HEADER_ELEM;
+ break;
+#endif
case LFT_REPLY_HEADER_ELEM:
type = LFT_REPLY_HEADER_ELEM;
break;
@@ -1588,7 +1655,9 @@
break;
case LFT_REQUEST_ALL_HEADERS:
-
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_ALL_HEADERS:
+#endif
case LFT_REPLY_ALL_HEADERS:
#if ICAP_CLIENT
@@ -1601,6 +1670,11 @@
case LFT_REQUEST_ALL_HEADERS:
type = LFT_REQUEST_HEADER;
break;
+#if USE_ADAPTATION
+ case LFT_VIRGIN_REQUEST_ALL_HEADERS:
+ type = LFT_VIRGIN_REQUEST_HEADER;
+ break;
+#endif
case LFT_REPLY_ALL_HEADERS:
type = LFT_REPLY_HEADER;
break;
@@ -2377,6 +2451,11 @@
safe_free(aLogEntry->headers.reply);
safe_free(aLogEntry->cache.authuser);
+#if USE_ADAPTATION
+ safe_free(aLogEntry->headers.virgin_request);
+ HTTPMSGUNLOCK(aLogEntry->virgin_request);
+#endif
+
HTTPMSGUNLOCK(aLogEntry->reply);
HTTPMSGUNLOCK(aLogEntry->request);
#if ICAP_CLIENT