Hi!

While the attached ignore-no-cache (from servers) patch worked for
2.5.STABLE3 (and lower), it behaves strange in 2.5.STABLE4 and 2.5.STABLE5
(yes, i know: that's against the RFC, but this is only for a backend use in
this case).
When the patch is applied against 2.5.STABLE3, everything works as aspected.
When using this patch in 2.5.STABLE4/5, the age of each object is covered by
the time set for "read_timout". E.g. If read_timout is 5 seconds, the object
will be considered fresh for 5 seconds and than expire... kind of strange
for me. After playing around with the code for some time, i gave up and now
pleasing for help. Maybe someone can help out.

Happy Eastern to all of you ;)
/thorsten

Common subdirectories: src_orig/auth and src_patched/auth
diff -u src_orig/cache_cf.c src_patched/cache_cf.c
--- src_orig/cache_cf.c Thu Feb  6 06:01:07 2003
+++ src_patched/cache_cf.c      Fri Aug 15 10:53:32 2003
@@ -1797,6 +1797,8 @@
            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");
 #endif
        storeAppendPrintf(entry, "\n");
        head = head->next;
@@ -1816,6 +1818,7 @@
     int override_lastmod = 0;
     int reload_into_ims = 0;
     int ignore_reload = 0;
+    int ignore_no_cache = 0;
 #endif
     int i;
     refresh_t *t;
@@ -1847,6 +1850,8 @@
            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, "reload-into-ims")) {
            reload_into_ims = 1;
            refresh_nocache_hack = 1;
@@ -1888,6 +1893,8 @@
        t->flags.reload_into_ims = 1;
     if (ignore_reload)
        t->flags.ignore_reload = 1;
+    if (ignore_no_cache)
+       t->flags.ignore_no_cache = 1;
 #endif
     t->next = NULL;
     while (*head)
Only in src_patched: cache_cf.c.orig
diff -u src_orig/cf.data.pre src_patched/cf.data.pre
--- src_orig/cf.data.pre        Wed May 21 16:34:38 2003
+++ src_patched/cf.data.pre     Fri Aug 15 10:53:32 2003
@@ -1592,6 +1592,7 @@
                 override-lastmod
                 reload-into-ims
                 ignore-reload
+                ignore-no-cache

                override-expire enforces min age even if the server
                sent a Expires: header. Doing this VIOLATES the HTTP
@@ -1611,6 +1612,11 @@
                this feature could make you liable for problems which
                it causes.

+               ignore-no-cache ignores any ``Pragma: no-cache'' header
+               received from a server. The HTTP RFC never allows the
+               use of this header from a server, only a client, though
+               plenty of servers send it anyway.
+
        Basically a cached object is:

                FRESH if expires < now, else STALE
Only in src_patched: cf.data.pre.orig
Common subdirectories: src_orig/fs and src_patched/fs
diff -u src_orig/http.c src_patched/http.c
--- src_orig/http.c     Sun May 11 19:30:13 2003
+++ src_patched/http.c  Fri Aug 15 10:55:56 2003
@@ -222,8 +222,10 @@
     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_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 +243,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
Only in src_patched: http.c.orig
diff -u src_orig/protos.h src_patched/protos.h
--- src_orig/protos.h   Tue May  6 22:13:02 2003
+++ src_patched/protos.h        Fri Aug 15 10:53:32 2003
@@ -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);
Only in src_patched: protos.h.orig
diff -u src_orig/refresh.c src_patched/refresh.c
--- src_orig/refresh.c  Thu Jul 18 11:22:17 2002
+++ src_patched/refresh.c       Fri Aug 15 10:53:32 2003
@@ -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;
Common subdirectories: src_orig/repl and src_patched/repl
diff -u src_orig/structs.h src_patched/structs.h
--- src_orig/structs.h  Sun May 11 00:17:44 2003
+++ src_patched/structs.h       Fri Aug 15 10:53:32 2003
@@ -1684,6 +1684,7 @@
        unsigned int override_lastmod:1;
        unsigned int reload_into_ims:1;
        unsigned int ignore_reload:1;
+       unsigned int ignore_no_cache:1;
 #endif
     } flags;
 };
Only in src_patched: structs.h.orig

Reply via email to