# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: benno@jeamland.net-20080828051217-kqnfk5s2huacfgn3 # target_branch: file:///home/benno/squid-work/squid3-repo/trunk/ # testament_sha1: e5013df20b582dbb9a4c9124644e6c521edd48ea # timestamp: 2008-08-28 15:14:45 +1000 # base_revision_id: squid3@treenet.co.nz-20080827130136-\ # 58a98r50hgyj5e27 # # Begin patch === modified file 'src/HttpRequestMethod.cc' --- src/HttpRequestMethod.cc 2008-06-20 04:43:01 +0000 +++ src/HttpRequestMethod.cc 2008-08-28 05:12:17 +0000 @@ -246,7 +246,7 @@ /* all others */ case METHOD_OTHER: default: - return false; // be conservative: we do not know some methods specs + return true; // RFC says to purge if we don't know the method } return false; // not reached === modified file 'src/Server.cc' --- src/Server.cc 2008-07-22 12:33:41 +0000 +++ src/Server.cc 2008-08-28 05:12:17 +0000 @@ -402,11 +402,20 @@ // purges entries that match the value of a given HTTP [response] header static void -purgeEntriesByHeader(const char *reqUrl, HttpMsg *rep, http_hdr_type hdr) +purgeEntriesByHeader(const HttpRequest *req, const char *reqUrl, HttpMsg *rep, http_hdr_type hdr) { - if (const char *url = rep->header.getStr(hdr)) - if (sameUrlHosts(reqUrl, url)) // prevent purging DoS, per RFC 2616 + if (const char *url = rep->header.getStr(hdr)) { + const char *absUrl = urlAbsolute(req, url); + if (absUrl != NULL) { + url = absUrl; + } + if (sameUrlHosts(reqUrl, url)) { // prevent purging DoS, per RFC 2616 purgeEntriesByUrl(url); + } + if (absUrl != NULL) { + xfree((void *)absUrl); + } + } } // some HTTP methods should purge matching cache entries @@ -425,8 +434,8 @@ const char *reqUrl = urlCanonical(request); debugs(88, 5, "maybe purging due to " << RequestMethodStr(request->method) << ' ' << reqUrl); purgeEntriesByUrl(reqUrl); - purgeEntriesByHeader(reqUrl, theFinalReply, HDR_LOCATION); - purgeEntriesByHeader(reqUrl, theFinalReply, HDR_CONTENT_LOCATION); + purgeEntriesByHeader(request, reqUrl, theFinalReply, HDR_LOCATION); + purgeEntriesByHeader(request, reqUrl, theFinalReply, HDR_CONTENT_LOCATION); } // called (usually by kids) when we have final (possibly adapted) reply headers === modified file 'src/protos.h' --- src/protos.h 2008-07-17 12:38:06 +0000 +++ src/protos.h 2008-08-28 05:12:17 +0000 @@ -638,6 +638,7 @@ SQUIDCEXTERN void urlInitialize(void); SQUIDCEXTERN HttpRequest *urlParse(const HttpRequestMethod&, char *, HttpRequest *request = NULL); SQUIDCEXTERN const char *urlCanonical(HttpRequest *); +SQUIDCEXTERN const char *urlAbsolute(const HttpRequest *, const char *); SQUIDCEXTERN char *urlRInternal(const char *host, u_short port, const char *dir, const char *name); SQUIDCEXTERN char *urlInternal(const char *dir, const char *name); SQUIDCEXTERN int matchDomainName(const char *host, const char *domain); === modified file 'src/url.cc' --- src/url.cc 2008-04-10 11:29:39 +0000 +++ src/url.cc 2008-08-28 05:12:17 +0000 @@ -532,6 +532,70 @@ return buf; } +const char * +urlAbsolute(const HttpRequest * req, const char *relUrl) +{ + LOCAL_ARRAY(char, portbuf, 32); + LOCAL_ARRAY(char, urlbuf, MAX_URL); + char *path, *last_slash; + + if (relUrl == NULL) { + return (NULL); + } + if (req->method.id() == METHOD_CONNECT) { + return (NULL); + } + if (strchr(relUrl, ':') != NULL) { + return (NULL); + } + if (req->protocol == PROTO_URN) { + snprintf(urlbuf, MAX_URL, "urn:%s", req->urlpath.buf()); + } else { + portbuf[0] = '\0'; + if (req->port != urlDefaultPort(req->protocol)) { + snprintf(portbuf, 32, ":%d", req->port); + } + if (relUrl[0] == '/') { + snprintf(urlbuf, MAX_URL, "%s://%s%s%s%s%s", + ProtocolStr[req->protocol], + req->login, + *req->login ? "@" : null_string, + req->GetHost(), + portbuf, + relUrl + ); + } else { + path = xstrdup(req->urlpath.buf()); + last_slash = strrchr(path, '/'); + if (last_slash == NULL) { + snprintf(urlbuf, MAX_URL, "%s://%s%s%s%s/%s", + ProtocolStr[req->protocol], + req->login, + *req->login ? "@" : null_string, + req->GetHost(), + portbuf, + relUrl + ); + } else { + last_slash++; + *last_slash = '\0'; + snprintf(urlbuf, MAX_URL, "%s://%s%s%s%s%s%s", + ProtocolStr[req->protocol], + req->login, + *req->login ? "@" : null_string, + req->GetHost(), + portbuf, + path, + relUrl + ); + } + xfree(path); + } + } + + return (xstrdup(urlbuf)); +} + /* * matchDomainName() compares a hostname with a domainname according * to the following rules: # Begin bundle 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 c6yvIFxYz8YOh+Qgh/+LuSKcKEhuR87HAA==