]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 2536: %H in error page ERR_DNS_FAIL is not filled on HTTPS
authorAmos Jeffries <squid3@treenet.co.nz>
Fri, 17 Apr 2009 09:55:48 +0000 (21:55 +1200)
committerAmos Jeffries <squid3@treenet.co.nz>
Fri, 17 Apr 2009 09:55:48 +0000 (21:55 +1200)
src/errorpage.cc
src/protos.h
src/url.cc

index 02d41d746279b622282d8b9798d55c2e1c9653b8..f1cb105b44ced1b60090c2a254f4024b9aa28608 100644 (file)
@@ -469,7 +469,7 @@ errorSend(int fd, ErrorState * err)
  * to the client socket.
  *
  \note If there is a callback, the callback is responsible for
- *     closeing the FD, otherwise we do it ourseves.
+ *     closing the FD, otherwise we do it ourselves.
  */
 static void
 errorSendComplete(int fd, char *bufnotused, size_t size, comm_err_t errflag, int xerrno, void *data)
@@ -546,7 +546,7 @@ ErrorState::Dump(MemBuf * mb)
     /* - IP stuff */
     str.Printf("ClientIP: %s\r\n", src_addr.NtoA(ntoabuf,MAX_IPSTRLEN));
 
-    if (request && request->hier.host) {
+    if (request && request->hier.host[0] != '\0') {
         str.Printf("ServerIP: %s\r\n", request->hier.host);
     }
 
@@ -668,12 +668,11 @@ ErrorState::Convert(char token)
 
     case 'h':
         mb.Printf("%s", getMyHostname());
-
         break;
 
     case 'H':
         if (request) {
-            if (request->hier.host)
+            if (request->hier.host[0] != '\0') // if non-empty string.
                 p = request->hier.host;
             else
                 p = request->GetHost();
@@ -688,9 +687,9 @@ ErrorState::Convert(char token)
         break;
 
     case 'I':
-        if (request && request->hier.host) {
+        if (request && request->hier.host[0] != '\0') // if non-empty string
             mb.Printf("%s", request->hier.host);
-        else
+        else
             p = "[unknown]";
 
         break;
@@ -795,7 +794,9 @@ ErrorState::Convert(char token)
         break;
 
     case 'U':
-        p = request ? urlCanonicalClean(request) : url ? url : "[no URL]";
+        /* Using the fake-https version of canonical so error pages see https:// */
+        /* even when the url-path cannot be shown as more than '*' */
+        p = request ? urlCanonicalFakeHttps(request) : url ? url : "[no URL]";
         break;
 
     case 'u':
index eb906c5eefa1309ebd226f5bb6754eeafa87e81b..90fa2ea35511555da68da147e2d8a306ba1210e4 100644 (file)
@@ -605,6 +605,8 @@ SQUIDCEXTERN protocol_t urlParseProtocol(const char *, const char *e = NULL);
 SQUIDCEXTERN void urlInitialize(void);
 SQUIDCEXTERN HttpRequest *urlParse(const HttpRequestMethod&, char *, HttpRequest *request = NULL);
 SQUIDCEXTERN const char *urlCanonical(HttpRequest *);
+SQUIDCEXTERN char *urlCanonicalClean(const HttpRequest *);
+SQUIDCEXTERN const char *urlCanonicalFakeHttps(const HttpRequest * request);
 SQUIDCEXTERN bool urlIsRelative(const char *);
 SQUIDCEXTERN char *urlMakeAbsolute(const HttpRequest *, const char *);
 SQUIDCEXTERN char *urlRInternal(const char *host, u_short port, const char *dir, const char *name);
@@ -612,7 +614,6 @@ SQUIDCEXTERN char *urlInternal(const char *dir, const char *name);
 SQUIDCEXTERN int matchDomainName(const char *host, const char *domain);
 SQUIDCEXTERN int urlCheckRequest(const HttpRequest *);
 SQUIDCEXTERN int urlDefaultPort(protocol_t p);
-SQUIDCEXTERN char *urlCanonicalClean(const HttpRequest *);
 SQUIDCEXTERN char *urlHostname(const char *url);
 SQUIDCEXTERN void urlExtMethodConfigure(void);
 
index 5bd687111dde4c919062451965e8288ea1595b4b..2cad9e6fbbefeb402983e8a9c470beadbb5d51f9 100644 (file)
@@ -470,7 +470,7 @@ urlCanonical(HttpRequest * request)
     return (request->canonical = xstrdup(urlbuf));
 }
 
-/** \todo AYJ: Performance: This is an *almost* duplicate of urlCanoncical. But elides the query-string.
+/** \todo AYJ: Performance: This is an *almost* duplicate of urlCanonical. But elides the query-string.
  *        After copying it on in the first place! Would be less code to merge the two with a flag parameter.
  *        and never copy the query-string part in the first place
  */
@@ -536,6 +536,28 @@ urlCanonicalClean(const HttpRequest * request)
     return buf;
 }
 
+/**
+ * Yet another alternative to urlCanonical.
+ * This one addes the https:// parts to METHOD_CONNECT URL
+ * for use in error page outputs.
+ * Luckily we can leverage the others instead of duplicating.
+ */
+const char *
+urlCanonicalFakeHttps(const HttpRequest * request)
+{
+    LOCAL_ARRAY(char, buf, MAX_URL);
+
+    // method CONNECT and port HTTPS
+    if(request->method == METHOD_CONNECT && request->port == 443) {
+        snprintf(buf, MAX_URL, "https://%s/*", request->GetHost());
+        return buf;
+    }
+
+    // else do the normal complete canonical thing.
+    return urlCanonicalClean(request);
+}
+
+
 /*
  * Test if a URL is relative.
  *