pc-bugfix1-2.5.STABLE6.diff: fixes almost 6 years old bug in enums.h
(someone double me, please :-)

pc-patch1-2.5.STABLE6.diff: (based on patch by David S. Madole
http://www.omdev.com/squid/squid-2.2.STABLE4.ignore-no-cache.patch )
adds more options to refresh-pattern configuration:
- 'ignore-no-cache' ignores any "Pragma: no-cache" and  "Cache-control:
    no-cache" headers received from a server
- 'ignore-private' ignores any "Cache-control: private" headers
    received from a server
- 'ignore-auth' caches responses to requests with authorization
    irrespective of "Cache-control" headers received from a server

pc-patch2-2.5.STABLE6.diff:  modifies ipcache.c so squid works with
buggy http load balancers based on round robin dns (nonpreserving user
session across different servers in cluster).

regards
Przemek Czerkas


Index: src/enums.h
===================================================================
RCS file: /squid/squid/src/enums.h,v
retrieving revision 1.203.2.10
diff -u -r1.203.2.10 enums.h
--- src/enums.h 4 Feb 2004 17:42:28 -0000       1.203.2.10
+++ src/enums.h 27 Aug 2004 21:22:38 -0000
@@ -217,8 +217,8 @@
     HDR_PROXY_CONNECTION,
     HDR_PUBLIC,
     HDR_RANGE,
-    HDR_REQUEST_RANGE,         /* some clients use this, sigh */
     HDR_REFERER,
+    HDR_REQUEST_RANGE,         /* some clients use this, sigh */
     HDR_RETRY_AFTER,
     HDR_SERVER,
     HDR_SET_COOKIE,



Index: src/cache_cf.c
===================================================================
RCS file: /squid/squid/src/cache_cf.c,v
retrieving revision 1.396.2.17
diff -u -r1.396.2.17 cache_cf.c
--- src/cache_cf.c      29 Apr 2004 23:56:50 -0000      1.396.2.17
+++ src/cache_cf.c      27 Aug 2004 21:22:38 -0000
@@ -1809,6 +1809,12 @@
            storeAppendPrintf(entry, " reload-into-ims");
        if (head->flags.ignore_reload)
            storeAppendPrintf(entry, " ignore-reload");
+       if (head->flags.ignore_no_cache)
+           storeAppendPrintf(entry, " ignore-no-cache");
+       if (head->flags.ignore_private)
+           storeAppendPrintf(entry, " ignore-private");
+       if (head->flags.ignore_auth)
+           storeAppendPrintf(entry, " ignore-auth");
 #endif
        storeAppendPrintf(entry, "\n");
        head = head->next;
@@ -1828,6 +1834,9 @@
     int override_lastmod = 0;
     int reload_into_ims = 0;
     int ignore_reload = 0;
+    int ignore_no_cache = 0;
+    int ignore_private = 0;
+    int ignore_auth = 0;
 #endif
     int i;
     refresh_t *t;
@@ -1859,6 +1868,12 @@
            override_expire = 1;
        else if (!strcmp(token, "override-lastmod"))
            override_lastmod = 1;
+       else if (!strcmp(token, "ignore-no-cache"))
+           ignore_no_cache = 1;
+       else if (!strcmp(token, "ignore-private"))
+           ignore_private = 1;
+       else if (!strcmp(token, "ignore-auth"))
+           ignore_auth = 1;
        else if (!strcmp(token, "reload-into-ims")) {
            reload_into_ims = 1;
            refresh_nocache_hack = 1;
@@ -1900,6 +1915,12 @@
        t->flags.reload_into_ims = 1;
     if (ignore_reload)
        t->flags.ignore_reload = 1;
+    if (ignore_no_cache)
+       t->flags.ignore_no_cache = 1;
+    if (ignore_private)
+       t->flags.ignore_private = 1;
+    if (ignore_auth)
+       t->flags.ignore_auth = 1;
 #endif
     t->next = NULL;
     while (*head)
Index: src/cf.data.pre
===================================================================
RCS file: /squid/squid/src/cf.data.pre,v
retrieving revision 1.245.2.66
diff -u -r1.245.2.66 cf.data.pre
--- src/cf.data.pre     30 Apr 2004 20:40:39 -0000      1.245.2.66
+++ src/cf.data.pre     27 Aug 2004 21:22:38 -0000
@@ -1665,6 +1665,9 @@
                 override-lastmod
                 reload-into-ims
                 ignore-reload
+                ignore-no-cache
+                ignore-private
+                ignore-auth
 
                override-expire enforces min age even if the server
                sent a Expires: header. Doing this VIOLATES the HTTP
@@ -1684,6 +1687,23 @@
                this feature could make you liable for problems which
                it causes.
                
+               ignore-no-cache ignores any ``Pragma: no-cache'' and
+               ``Cache-control: no-cache'' headers received from a server.
+               The HTTP RFC never allows the use of this (Pragma) header 
+               from a server, only a client, though plenty of servers 
+               send it anyway.
+               
+               ignore-private ignores any ``Cache-control: private'' 
+               headers received from a server. Doing this VIOLATES 
+               the HTTP standard. Enabling this feature could make you 
+               liable for problems which it causes.
+               
+               ignore-auth caches responses to requests with authorization,
+               irrespective of ``Cache-control'' headers received from 
+               a server. Doing this VIOLATES the HTTP standard. Enabling
+               this feature could make you liable for problems which
+               it causes.
+               
        Basically a cached object is:
 
                FRESH if expires < now, else STALE
Index: src/http.c
===================================================================
RCS file: /squid/squid/src/http.c,v
retrieving revision 1.384.2.16
diff -u -r1.384.2.16 http.c
--- src/http.c  8 Jun 2004 10:54:07 -0000       1.384.2.16
+++ src/http.c  27 Aug 2004 21:22:38 -0000
@@ -229,10 +229,14 @@
     HttpHeader *hdr = &rep->header;
     const int cc_mask = (rep->cache_control) ? rep->cache_control->mask : 0;
     const char *v;
-    if (EBIT_TEST(cc_mask, CC_PRIVATE))
-       return 0;
-    if (EBIT_TEST(cc_mask, CC_NO_CACHE))
-       return 0;
+    if (EBIT_TEST(cc_mask, CC_PRIVATE)) {
+       const refresh_t *R = refreshLimits(httpState->entry->mem_obj->url);
+       if (R && !R->flags.ignore_private) return 0;
+    }
+    if (EBIT_TEST(cc_mask, CC_NO_CACHE)) {
+       const refresh_t *R = refreshLimits(httpState->entry->mem_obj->url);
+       if (R && !R->flags.ignore_no_cache) return 0;
+    }
     if (EBIT_TEST(cc_mask, CC_NO_STORE))
        return 0;
     if (httpState->request->flags.auth) {
@@ -241,8 +245,10 @@
         * only if a Cache-Control: public reply header is present.
         * RFC 2068, sec 14.9.4
         */
-       if (!EBIT_TEST(cc_mask, CC_PUBLIC))
-           return 0;
+       if (!EBIT_TEST(cc_mask, CC_PUBLIC)) {
+         const refresh_t *R = refreshLimits(httpState->entry->mem_obj->url);
+         if (R && !R->flags.ignore_auth) return 0;
+       }
     }
     /* Pragma: no-cache in _replies_ is not documented in HTTP,
      * but servers like "Active Imaging Webcast/2.0" sure do use it */
@@ -250,8 +256,10 @@
        String s = httpHeaderGetList(hdr, HDR_PRAGMA);
        const int no_cache = strListIsMember(&s, "no-cache", ',');
        stringClean(&s);
-       if (no_cache)
-           return 0;
+       if (no_cache) {
+         const refresh_t *R = refreshLimits(httpState->entry->mem_obj->url);
+         if (R && !R->flags.ignore_no_cache) return 0;
+       }
     }
     /*
      * The "multipart/x-mixed-replace" content type is used for
Index: src/protos.h
===================================================================
RCS file: /squid/squid/src/protos.h,v
retrieving revision 1.420.2.22
diff -u -r1.420.2.22 protos.h
--- src/protos.h        4 Feb 2004 17:42:28 -0000       1.420.2.22
+++ src/protos.h        27 Aug 2004 21:22:38 -0000
@@ -784,6 +784,7 @@
 extern int refreshCheckDigest(const StoreEntry *, time_t delta);
 extern time_t getMaxAge(const char *url);
 extern void refreshInit(void);
+extern const refresh_t *refreshLimits(const char *url);
 
 extern void serverConnectionsClose(void);
 extern void shut_down(int);
Index: src/refresh.c
===================================================================
RCS file: /squid/squid/src/refresh.c,v
retrieving revision 1.56.2.1
diff -u -r1.56.2.1 refresh.c
--- src/refresh.c       18 Jul 2002 09:22:17 -0000      1.56.2.1
+++ src/refresh.c       27 Aug 2004 21:22:38 -0000
@@ -99,14 +99,13 @@
 #define REFRESH_DEFAULT_PCT    0.20
 #define REFRESH_DEFAULT_MAX    (time_t)259200
 
-static const refresh_t *refreshLimits(const char *);
 static const refresh_t *refreshUncompiledPattern(const char *);
 static OBJH refreshStats;
 static int refreshStaleness(const StoreEntry *, time_t, time_t, const refresh_t *, 
stale_flags *);
 
 static refresh_t DefaultRefresh;
 
-static const refresh_t *
+const refresh_t *
 refreshLimits(const char *url)
 {
     const refresh_t *R;
Index: src/structs.h
===================================================================
RCS file: /squid/squid/src/structs.h,v
retrieving revision 1.408.2.24
diff -u -r1.408.2.24 structs.h
--- src/structs.h       18 Apr 2004 23:43:30 -0000      1.408.2.24
+++ src/structs.h       27 Aug 2004 21:22:38 -0000
@@ -1690,6 +1690,9 @@
        unsigned int override_lastmod:1;
        unsigned int reload_into_ims:1;
        unsigned int ignore_reload:1;
+       unsigned int ignore_no_cache:1;
+       unsigned int ignore_private:1;
+       unsigned int ignore_auth:1;
 #endif
     } flags;
 };



Index: src/ipcache.c
===================================================================
RCS file: /squid/squid/src/ipcache.c,v
retrieving revision 1.236.2.3
diff -u -r1.236.2.3 ipcache.c
--- src/ipcache.c       12 Feb 2004 09:32:09 -0000      1.236.2.3
+++ src/ipcache.c       27 Aug 2004 21:22:38 -0000
@@ -313,6 +313,8 @@
     int j;
     int na = 0;
     int ttl = 0;
+    int l = 0;
+    struct in_addr high_addr,tmp_addr;
     const char *name = (const char *) i->hash.key;
     i->expires = squid_curtime + Config.negativeDnsTtl;
     i->flags.negcached = 1;
@@ -332,11 +334,19 @@
        return i;
     }
     assert(answers);
-    for (j = 0, k = 0; k < nr; k++) {
+    high_addr.s_addr = 0;
+    tmp_addr.s_addr = 0;
+    for (k = 0; k < nr; k++) {
        if (answers[k].type != RFC1035_TYPE_A)
            continue;
        if (answers[k].class != RFC1035_CLASS_IN)
            continue;
+       xmemcpy(&tmp_addr, answers[k].rdata, 4);
+       if (tmp_addr.s_addr > high_addr.s_addr) {
+           high_addr.s_addr = tmp_addr.s_addr;
+           l = k;
+           debug(14, 3) ("l: #%d\n",l);
+       }
        na++;
     }
     if (na == 0) {
@@ -344,6 +354,15 @@
        i->error_message = xstrdup("No Address records");
        return i;
     }
+    for (k = 0; k < nr; k++) {
+       if (answers[k].type != RFC1035_TYPE_A)
+           continue;
+       if (answers[k].class != RFC1035_CLASS_IN)
+           continue;
+       if (k != l)
+           answers[k].type = 0;
+    }
+    na = 1;
     i->flags.negcached = 0;
     i->addrs.in_addrs = xcalloc(na, sizeof(struct in_addr));
     i->addrs.bad_mask = xcalloc(na, sizeof(unsigned char));
@@ -367,6 +386,13 @@
        ttl = Config.negativeDnsTtl;
     i->expires = squid_curtime + ttl;
     assert(j == na);
+    for (k = 0; k < nr; k++) {
+       if (answers[k].type != RFC1035_TYPE_A)
+           continue;
+       if (answers[k].class != RFC1035_CLASS_IN)
+           continue;
+        answers[k].type = RFC1035_TYPE_A;
+    }
     return i;
 }
 #endif



Reply via email to