]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/squid/squid-3.5-14073.patch
squid: Update to 3.5.20 with latest patches (14067-14075)
[people/pmueller/ipfire-2.x.git] / src / patches / squid / squid-3.5-14073.patch
diff --git a/src/patches/squid/squid-3.5-14073.patch b/src/patches/squid/squid-3.5-14073.patch
new file mode 100644 (file)
index 0000000..b7915a4
--- /dev/null
@@ -0,0 +1,151 @@
+------------------------------------------------------------
+revno: 14073
+revision-id: squid3@treenet.co.nz-20160817051037-p0kaj2iw2u4u8iqj
+parent: squid3@treenet.co.nz-20160817025828-s4102klt2ei25tsm
+fixes bug: http://bugs.squid-cache.org/show_bug.cgi?id=4563
+committer: Amos Jeffries <squid3@treenet.co.nz>
+branch nick: 3.5
+timestamp: Wed 2016-08-17 17:10:37 +1200
+message:
+  Bug 4563: duplicate code in httpMakeVaryMark
+------------------------------------------------------------
+# Bazaar merge directive format 2 (Bazaar 0.90)
+# revision_id: squid3@treenet.co.nz-20160817051037-p0kaj2iw2u4u8iqj
+# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5
+# testament_sha1: bba9a17715b8759e9d70db2c75f70f3c6152ae8a
+# timestamp: 2016-08-17 05:50:53 +0000
+# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5
+# base_revision_id: squid3@treenet.co.nz-20160817025828-\
+#   s4102klt2ei25tsm
+# 
+# Begin patch
+=== modified file 'src/http.cc'
+--- src/http.cc        2016-04-01 06:15:31 +0000
++++ src/http.cc        2016-08-17 05:10:37 +0000
+@@ -572,6 +572,38 @@
+     /* NOTREACHED */
+ }
++/// assemble a variant key (vary-mark) from the given Vary header and HTTP request
++static void
++assembleVaryKey(String &vary, SBuf &vstr, const HttpRequest &request)
++{
++    static const SBuf asterisk("*");
++    const char *pos = nullptr;
++    const char *item = nullptr;
++    int ilen = 0;
++
++    while (strListGetItem(&vary, ',', &item, &ilen, &pos)) {
++        SBuf name(item, ilen);
++        if (name == asterisk) {
++            vstr.clear();
++            break;
++        }
++        name.toLower();
++        if (!vstr.isEmpty())
++            vstr.append(", ", 2);
++        vstr.append(name);
++        String hdr(request.header.getByName(name.c_str()));
++        const char *value = hdr.termedBuf();
++        if (value) {
++            value = rfc1738_escape_part(value);
++            vstr.append("=\"", 2);
++            vstr.append(value);
++            vstr.append("\"", 1);
++        }
++
++        hdr.clean();
++    }
++}
++
+ /*
+  * For Vary, store the relevant request headers as
+  * virtual headers in the reply
+@@ -580,81 +612,16 @@
+ SBuf
+ httpMakeVaryMark(HttpRequest * request, HttpReply const * reply)
+ {
+-    String vary, hdr;
+-    const char *pos = NULL;
+-    const char *item;
+-    const char *value;
+-    int ilen;
+     SBuf vstr;
+-    static const SBuf asterisk("*");
++    String vary;
+     vary = reply->header.getList(HDR_VARY);
+-
+-    while (strListGetItem(&vary, ',', &item, &ilen, &pos)) {
+-        char *name = (char *)xmalloc(ilen + 1);
+-        xstrncpy(name, item, ilen + 1);
+-        Tolower(name);
+-
+-        if (strcmp(name, "*") == 0) {
+-            /* Can not handle "Vary: *" withtout ETag support */
+-            safe_free(name);
+-            vstr.clear();
+-            break;
+-        }
+-
+-        if (!vstr.isEmpty())
+-            vstr.append(", ", 2);
+-        vstr.append(name);
+-        hdr = request->header.getByName(name);
+-        safe_free(name);
+-        value = hdr.termedBuf();
+-
+-        if (value) {
+-            value = rfc1738_escape_part(value);
+-            vstr.append("=\"", 2);
+-            vstr.append(value);
+-            vstr.append("\"", 1);
+-        }
+-
+-        hdr.clean();
+-    }
+-
++    assembleVaryKey(vary, vstr, *request);
++
++#if X_ACCELERATOR_VARY
+     vary.clean();
+-#if X_ACCELERATOR_VARY
+-
+-    pos = NULL;
+     vary = reply->header.getList(HDR_X_ACCELERATOR_VARY);
+-
+-    while (strListGetItem(&vary, ',', &item, &ilen, &pos)) {
+-        char *name = (char *)xmalloc(ilen + 1);
+-        xstrncpy(name, item, ilen + 1);
+-        Tolower(name);
+-
+-        if (strcmp(name, "*") == 0) {
+-            /* Can not handle "Vary: *" withtout ETag support */
+-            safe_free(name);
+-            vstr.clear();
+-            break;
+-        }
+-
+-        if (!vstr.isEmpty())
+-            vstr.append(", ", 2);
+-        vstr.append(name);
+-        hdr = request->header.getByName(name);
+-        safe_free(name);
+-        value = hdr.termedBuf();
+-
+-        if (value) {
+-            value = rfc1738_escape_part(value);
+-            vstr.append("=\"", 2);
+-            vstr.append(value);
+-            vstr.append("\"", 1);
+-        }
+-
+-        hdr.clean();
+-    }
+-
+-    vary.clean();
++    assembleVaryKey(vary, vstr, *request);
+ #endif
+     debugs(11, 3, vstr);
+