RFC-compliant object invalidation behaviour.
- Switch the default from not purging if the method is unknown to purging if
the method is unknown.
- When purging URIs sourced from Location and Content-Location headers, make
sure the URL is absolute before a) comparing it to see if hosts match and b)
actually trying to find it in the store.
These changes are based on changes made to squid 2. In particular, the
urlAbsolute function was ported from squid 2. I would appreciate it if people
paid particular attention to urlAbsolute to make sure I'm not doing anything
that would cause problems in squid 3.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: file:///home/benno/squid-work/squid3-repo/trunk/
# testament_sha1: e5013df20b582dbb9a4c9124644e6c521edd48ea
# timestamp: 2008-08-28 15:14:45 +1000
# base_revision_id: [EMAIL PROTECTED]
# 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
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWdyPnY4ABipfgERwcv/////n
/u6////6YAs8fRsrbBkAAERqmgFbVWUa1EDTCSSAqfqn4p6NJmRTM1R4U9NMo9Q2pp6TIAGj1BkH
qHMJoyNDQyGEaGQ00aADEZMgGEAwHMJoyNDQyGEaGQ00aADEZMgGEAwCREQJTwmlPU8YTVP0U8p6
nqNHpP1NTQZAaYj1PUNGjyhzCaMjQ0MhhGhkNNGgAxGTIBhAMAkiBACaAEDUyamwUnqegj1PUZpP
CEGmj1MRUAVRCqJoaBpMGMbTTGHsMqE+SDvYRA014QoiIQ1DfvaNGnXOvmF+fFN+GR92I2DfaW4s
tpN16bJBjyXWTt8Xq9d+dbwrxMUjXNkXPF8Sc0BNkEg89sdbSJPKY+OiMbW812XAAQcAuGNjbBpD
YNDGm0oGaKv+9IdSfUxn8LhWNgR7bXsiLWdswsurnS7Q4wYm2wbbw7gNWiMLDKatEE6nda7JIrBp
3XZxzTE1Mw7b5MIITp1u66xzM6+54tK9e4FSvw5F9KvXriyOaDsslnmhemSYxvXtkehMHh36z9i2
2Zb2W5xZpzKj2wUoz0UVCwY2fWqbYhUbctZPKD7O+gVBmwMeamWVVtAIbv1rlfaUCmR+dqXimImG
kdNWMyZhShi47Mhg37VaMpmNbVZ13BZPJqBB453S9FmhbF5m1oCE6UGIKIJN5p8mdkoTWtTJRWjN
WbFjN9VR3FTmlsiKzDlqvux1Hx6ENrz/bc0dEPbyd8fct2lz8kZGSsnRwegoxbO7qzTBHJA8sxUZ
Fg7qv7N5zmVZJ/E9ROc5SlgsWqxaZ5EHRj+hw4/luxNhWqR9Z80Is3eLAYPENKZVpB5B/IYZVLFg
CMPOvpn4nzgmFcfOURiBo5vR6vCVlZfqrYYcxSfcoCR9KVq8iLL5jsPnTJZdTNQNX3AMwxr2fQip
AmNZ8iDm4l53GQBRKqO6RBQTDin6STCp1xVbhXSXpVSvGC0q4qWFLgcFvLaDpKT/4ttQlKBXk1Gh
ju9xuKFhpMRlPtqZBr2eJ+yUIGtIkywYgRgZIG+9Wl0XKYE1QF4m2ulRnPDRLg0XHVQplFmVxIuF
wsByoLzVWWlYK11jP+sjrvGkFCZbAmZgTwFURN1o5YlrWVmFUhzgsr0AVpQpQEwxcbCuYqxTJjbK
hQe0irSokQiWBp1iYvB0glpcVJGQnQW9MywYuP22nWCx5GIwtBeJwrvWktKtBjIWgrVLFp4EYsRc
cYU0QVBzGD3SmRI67YmaVpgYGogXG7wLqNouujeVzZmxgER5YsbxiQpSpSonQasahUVQpxGjYOUG
E8ouYCkDkDoWnf3C/8bS23BygbNppiJNzJOdxIkbVxJAsJSK4XWFYeQ4ql1YF5AmWDkCZmby8wVc
TiVmOPLqXb2AmF0mVjW4d5ko8R0MORExyIP0GONhqOq4HNpccYtIaq0ocjcleV3lxMoYDG06y45F
koPUCsisyJvJjk3eSa8ZKY2RdO4mGbmRMiBaX3Fw1phRKGDYPKYYShBIIuCVpJ0C7BRJQJEC8oiq
8e9bcjsVZRYBbdcwmskVDqRkaMiqqaKgGL2zTQYCrpLSJWXjlQ5YbFsy9GxaDBkZDYmCWQCc4vEk
q9mHYG1w142kafILYMS9I0ejgGetscBDqWG+0+UGoXSfAuIGpKRDSbtRxnWLaaSSwgKXEHSqDqMA
tULyALWl9B4DPaj/TgrA2AwwzMN+V6/0vkH52ksfl8idsbPf8THLFZJjpVRPcuZWxDZ+sys9yGZM
EAPiaj5FXFhX3cqzUaWNtEfgsA27jYV50u0H4fGZIy1JYN+mo5jcaw6ufhlJS26t88pW//mAiO8L
uKxMM3zB2J6CSRLnfzrUeUeVht49LaUad/oFkm2g4h1n+7tkMyRestX0H8CgKwzNRIlCc5EcxeIT
mXQewdpOvz0HwBelVPWxTEvSbCIwDeG1B8OJ7ffjfEVHQjnKjE50Iq5wMWM0BEReJ0sfY28nf/H7
rtJM9p0FOoc5GooQKHUOcSJYZCDQbDgk2mU6z0DX5EECYOCzeS8tCReNeo5ulDIb6kBkuoGFib2P
cdAtRvDYc64mZtMkEFUX9bmkFoOs6+C/mwdxNZ2DzL1/ZLBLECtZWLbC5iDYGvO/atBbi5IgP+sQ
gEEI2F+00VFprK0uqI24sS3lC0tAiVAFZE3FxtORoMDza9SDtE/atfMePxjDg/58g42XvIKdi1Sr
GaMlUEuFusNC2FhLGE/xao8jsmuI3iLMJha2hmgsiWQQQbT3KS0/ihHI7u/xUeg3nnGONZcWOI3/
XE7SKXJY7EogL07Jg4mEvqGEJkwzHK1RTHCZ8MYzA90DuS1BsExmwEu9clFg1kRmaEUxiPnqYIWd
M23E0MkQIbDqOHAnxKwoVkiZUazuOs6xXitBbg0hhRUhcDkZhljMECCpVpXXFoGTINd7lFQN4FzL
A4nnLplqCSCYYJiM2Xr++wVUz9LcO/iXCookoHGqMe2acIK+hR4eGtsBVdrEXElDGESx9ne17G3D
lc5jF7+sFeFehNr9im5Bv0DH9jA448ZCOJCwZhB4nkwIY2aDZAi7nmXYhHJnUpkaZ9QuAF8lCvIg
zcpqBXrhQcrbA+IazgMVpFeCUHWla0Imj7OXN1wqFuBfQczXnnQ3eKZLFSMDEGqHVWYtVaGgl3nI
vIreYQNRRCLBhvIT4UsQWBKM0baUlTBzAvMqyAVMYsDYMloQyCJ3oRYl8AURGk2EQF0AKz5l0IsE
WzE9aHF8E7gqJ0u8vS7Nwa0rwF66veSA7UtfSLqrAzCKcMEeTCD1kBH4SQWIMWyTo6/owD6ClLqV
DXL0iRPQ+r5eOo2lsxk4q0ZjMZQJeHgzd/QRF6a9QH2kcjxLDypa/HVoJa0ZmYMWI80O2zysWNfK
NJHUCYGgR1AQ3j2EHQUMJDWxu505UqbkHqLQr6pqUGfsGS9S4nDj0MaAB9Y5qVlQRJRn8pxVkLWV
VnhOs0FoahpSsq4N4B5cyzNYI/dFg0xiabBjAtQxUzq2wR0pipfagYNhGpQpFPQ+74ZPSAU47FP1
gtx8cFYUBkdCH6A5tvXal5lDu49v3cyIi3i1Aj7HDABkcjzLQF3sVYXMMGlLwEaE6wQwSQU04HPg
o1E34bFYwjXp3f3xLI4lFWMOkEmS5FgOo2PIMQIpUFOreVhMptMALSCJFSUQLUrrQgEV5JXkAkA4
ioTqwD3hENiUk6ZpjDhWwGJ6UZLPBEw1ZEVIFf4T9YHASrcRcu0uFBGUOpHVgerlgOKxtD75hZg1
lKIdhxhlNZ7Uql3C2bmFBbIIRXfrx5OVnV6fRivtqrtEXmkzTnGgvGR96kWJaR/tUtRrkkw92iDI
c6yvIFxYz8YOh+Qgh/+LuSKcKEhuR87HAA==