]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Compliance: handle HTTP OPTIONS and TRACE requests with asterisk URIs.
authorAlex Rousskov <rousskov@measurement-factory.com>
Tue, 31 Aug 2010 23:46:24 +0000 (17:46 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Tue, 31 Aug 2010 23:46:24 +0000 (17:46 -0600)
Handle '*' URIs in urlParse(). This allows Squid properly respond to
OPTIONS and TRACE requests with '*' URIs and Max-Forwards value of
zero. Forwarding such requests is out of this change scope and still
does not work because the upstream host and port are not set.

Co-Advisor test cases:
  test_case/rfc2616/options-bodyless-asterisk
  test_case/rfc2616/maxForwardsZero-OPTIONS-asterisk
  test_case/rfc2616/maxForwardsZero-TRACE-asterisk

src/url.cc

index 455c99305b9317d04e27421135edcef3a514a0b2..9f14d64aeb26cd94bc892328b5a86c73de1db7be 100644 (file)
 #include "URLScheme.h"
 #include "rfc1738.h"
 
+static HttpRequest *urlParseFinish(const HttpRequestMethod& method,
+                                   const protocol_t protocol,
+                                   const char *const urlpath,
+                                   const char *const host,
+                                   const char *const login,
+                                   const int port,
+                                   HttpRequest *request);
 static HttpRequest *urnParse(const HttpRequestMethod& method, char *urn);
 static const char valid_hostname_chars_u[] =
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -222,6 +229,11 @@ urlParse(const HttpRequestMethod& method, char *url, HttpRequest *request)
             if (sscanf(url, "%[^:]:%d", host, &port) < 1)
                 return NULL;
 
+    } else if ((method == METHOD_OPTIONS || method == METHOD_TRACE) &&
+               strcmp(url, "*") == 0) {
+        protocol = PROTO_HTTP;
+        port = urlDefaultPort(protocol);
+        return urlParseFinish(method, protocol, url, host, login, port, request);
     } else if (!strncmp(url, "urn:", 4)) {
         return urnParse(method, url);
     } else {
@@ -402,6 +414,23 @@ urlParse(const HttpRequestMethod& method, char *url, HttpRequest *request)
         }
     }
 
+    return urlParseFinish(method, protocol, urlpath, host, login, port, request);
+}
+
+/**
+ * Update request with parsed URI data.  If the request arg is
+ * non-NULL, put parsed values there instead of allocating a new
+ * HttpRequest.
+ */
+static HttpRequest *
+urlParseFinish(const HttpRequestMethod& method,
+               const protocol_t protocol,
+               const char *const urlpath,
+               const char *const host,
+               const char *const login,
+               const int port,
+               HttpRequest *request)
+{
     if (NULL == request)
         request = new HttpRequest(method, protocol, urlpath);
     else {
@@ -767,8 +796,8 @@ urlCheckRequest(const HttpRequest * r)
     if (r->method == METHOD_CONNECT)
         return 1;
 
-    if (r->method == METHOD_TRACE)
-        return 1;
+    if (r->method == METHOD_OPTIONS || r->method == METHOD_TRACE)
+        return (r->max_forwards == 0 || r->urlpath != "*");
 
     if (r->method == METHOD_PURGE)
         return 1;