Resubmit this patch, including changes based on comments by various people.

- Mention RFC text in relation to changing the default behaviour in relation
  to unknown HTTP methods.
- Use safe_free instead of xfree.
- Rework urlAbsolute to use snprintf in a slightly better way.  Snprintf is now
  used to construct the initial portion of the url and the rest is added on
  using POSIX string routines.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [EMAIL PROTECTED]
# target_branch: file:///home/benno/squid-work/squid3-repo/trunk/
# testament_sha1: 6257cd4613889a7d9f3f683d84fa1c9c2d700f45
# timestamp: 2008-09-01 12:40:00 +1000
# base_revision_id: [EMAIL PROTECTED]
#   ejhnqdep2qm6qz0h
# 
# Begin patch
=== modified file 'src/HttpRequestMethod.cc'
--- src/HttpRequestMethod.cc	2008-06-20 04:43:01 +0000
+++ src/HttpRequestMethod.cc	2008-08-29 00:56:35 +0000
@@ -243,11 +243,16 @@
         case METHOD_PURGE:
             return true;
 
-        /* all others */
+        /*
+         * RFC 2616 sayeth, in section 13.10, final paragraph:
+         * A cache that passes through requests for methods it does not
+         * understand SHOULD invalidate any entities referred to by the
+         * Request-URI.
+         */
         case METHOD_OTHER:
         default:
-            return false; // be conservative: we do not know some methods specs
+            return true;
 	}
 
-    return false; // not reached
+    return true; // not reached, but just in case
 }

=== modified file 'src/Server.cc'
--- src/Server.cc	2008-07-22 12:33:41 +0000
+++ src/Server.cc	2008-09-01 02:36:52 +0000
@@ -402,11 +402,24 @@
 
 // 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
-            purgeEntriesByUrl(url);
+    const char *url, *absUrl;
+    
+    if ((url = rep->header.getStr(hdr)) != NULL) {
+	    absUrl = urlAbsolute(req, url);
+	    if (absUrl != NULL) {
+	        url = absUrl;
+	    }
+	    if (absUrl != NULL) { // if the URL was relative, it is by nature the same host
+            purgeEntriesByUrl(url);
+	    } else if (sameUrlHosts(reqUrl, url)) { // prevent purging DoS, per RFC 2616 13.10, second last paragraph
+            purgeEntriesByUrl(url);
+        }
+        if (absUrl != NULL) {
+            safe_free(absUrl);
+        }
+    }
 }
 
 // some HTTP methods should purge matching cache entries
@@ -425,8 +438,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-09-01 02:36:52 +0000
@@ -532,6 +532,68 @@
     return buf;
 }
 
+const char *
+urlAbsolute(const HttpRequest * req, const char *relUrl)
+{
+    char urlbuf[MAX_URL];
+    const char *path, *last_slash;
+    size_t urllen, pathlen;
+
+    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 {
+    	if (req->port != urlDefaultPort(req->protocol)) {
+    	    urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s:%d",
+        		ProtocolStr[req->protocol],
+        		req->login,
+        		*req->login ? "@" : null_string,
+        		req->GetHost(),
+        		req->port
+    	    );
+    	} else {
+    	    urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s",
+        		ProtocolStr[req->protocol],
+        		req->login,
+        		*req->login ? "@" : null_string,
+        		req->GetHost()
+    	    );	    
+    	}
+	
+    	if (relUrl[0] == '/') {
+    	    strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+    	} else {
+    	    path = req->urlpath.buf();
+    	    last_slash = strrchr(path, '/');
+    	    if (last_slash == NULL) {
+        		urlbuf[urllen++] = '/';
+        		strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+    	    } else {
+        		last_slash++;
+        		pathlen = last_slash - path;
+        		if (pathlen > MAX_URL - urllen - 1) {
+        		    pathlen = MAX_URL - urllen - 1;
+        		}
+        		strncpy(&urlbuf[urllen], path, pathlen);
+        		urllen += pathlen;
+        		if (urllen + 1 < MAX_URL) {
+        		    strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+        		}
+    	    }
+    	}
+    }
+
+    return (xstrdup(urlbuf));
+}
+
 /*
  * matchDomainName() compares a hostname with a domainname according
  * to the following rules:

# Begin bundle
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
ANSBp6+KUVj2Vsqj7xdyRThQkEbRNl0=

Reply via email to