diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc index 5e817ed..7d02411 100644 --- a/src/HttpRequest.cc +++ b/src/HttpRequest.cc @@ -113,6 +113,7 @@ HttpRequest::init() peer_login = NULL; // not allocated/deallocated by this class peer_domain = NULL; // not allocated/deallocated by this class vary_headers = NULL; + urlgroup = null_string; myportname = null_string; tag = null_string; #if USE_AUTH @@ -161,6 +162,7 @@ HttpRequest::clean() range = NULL; } + urlgroup.clean(); myportname.clean(); tag.clean(); @@ -223,6 +225,7 @@ HttpRequest::clone() const copy->vary_headers = vary_headers ? xstrdup(vary_headers) : NULL; // XXX: what to do with copy->peer_domain? + copy->urlgroup = urlgroup; copy->tag = tag; copy->extacl_log = extacl_log; copy->extacl_message = extacl_message; diff --git a/src/HttpRequest.h b/src/HttpRequest.h index 8b89110..75ae8e6 100644 --- a/src/HttpRequest.h +++ b/src/HttpRequest.h @@ -195,6 +195,8 @@ public: char *peer_domain; /* Configured peer forceddomain */ + String urlgroup; + String myportname; // Internal tag name= value from port this requests arrived in. String tag; /* Internal tag for this request */ diff --git a/src/client_side_request.cc b/src/client_side_request.cc index 1c467d9..00c5bbd 100644 --- a/src/client_side_request.cc +++ b/src/client_side_request.cc @@ -1208,6 +1208,15 @@ ClientRequestContext::clientRedirectDone(char *result) redirect_state = REDIRECT_DONE; if (result) { + if (result[0] == '!') { + char *t = strchr(result+1, '!'); + if (t != NULL) { + old_request->urlgroup.reset(NULL); + old_request->urlgroup.append(result + 1, t - result - 1); + result = t + 1; + } + } + http_status status = (http_status) atoi(result); if (status == HTTP_MOVED_PERMANENTLY @@ -1224,7 +1233,7 @@ ClientRequestContext::clientRedirectDone(char *result) } else { debugs(85, DBG_CRITICAL, "ERROR: URL-rewrite produces invalid " << status << " redirect Location: " << result); } - } else if (strcmp(result, http->uri)) { + } else if (result[0] != 0 && strcmp(result, http->uri)) { // XXX: validate the URL properly *without* generating a whole new request object right here. // XXX: the clone() should be done only AFTER we know the new URL is valid. HttpRequest *new_request = old_request->clone(); diff --git a/src/format/ByteCode.h b/src/format/ByteCode.h index ef25149..557f35e 100644 --- a/src/format/ByteCode.h +++ b/src/format/ByteCode.h @@ -65,6 +65,7 @@ typedef enum { /*LFT_REQUEST_QUERY, */ LFT_REQUEST_VERSION_OLD_2X, LFT_REQUEST_VERSION, + LFT_REQUEST_URLGROUP, /* request header details pre-adaptation */ LFT_REQUEST_HEADER, diff --git a/src/format/Format.cc b/src/format/Format.cc index 1717360..91ca16d 100644 --- a/src/format/Format.cc +++ b/src/format/Format.cc @@ -923,6 +923,12 @@ Format::Format::assemble(MemBuf &mb, const AccessLogEntry::Pointer &al, int logS out = tmp; break; + case LFT_REQUEST_URLGROUP: + if (al->request) + out = al->request->urlgroup.termedBuf(); + quote = 1; + break; + case LFT_SERVER_REQ_METHOD: if (al->adapted_request) { out = al->adapted_request->method.image(); diff --git a/src/format/Token.cc b/src/format/Token.cc index 099dcbe..01fef74 100644 --- a/src/format/Token.cc +++ b/src/format/Token.cc @@ -116,6 +116,7 @@ static TokenTableEntry TokenTable2C[] = { {"rp", LFT_REQUEST_URLPATH_OLD_31}, /* { "rq", LFT_REQUEST_QUERY }, * / / * the query-string, INCLUDING the leading ? */ {"rv", LFT_REQUEST_VERSION}, + {"rG", LFT_REQUEST_URLGROUP}, {"