You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2013/05/08 16:06:48 UTC

svn commit: r1480283 - in /httpd/httpd/trunk/modules/cache: cache_storage.c cache_storage.h mod_cache.c

Author: minfrin
Date: Wed May  8 14:06:48 2013
New Revision: 1480283

URL: http://svn.apache.org/r1480283
Log:
Ensure that Warning headers are correctly handled as per RFC2616.

Modified:
    httpd/httpd/trunk/modules/cache/cache_storage.c
    httpd/httpd/trunk/modules/cache/cache_storage.h
    httpd/httpd/trunk/modules/cache/mod_cache.c

Modified: httpd/httpd/trunk/modules/cache/cache_storage.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_storage.c?rev=1480283&r1=1480282&r2=1480283&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_storage.c (original)
+++ httpd/httpd/trunk/modules/cache/cache_storage.c Wed May  8 14:06:48 2013
@@ -113,9 +113,30 @@ int cache_create_entity(cache_request_re
     return DECLINED;
 }
 
+static int filter_header_do(void *v, const char *key, const char *val)
+{
+    if ((*key == 'W' || *key == 'w') && !strcasecmp(key, "Warning")
+            && *val == '1') {
+        /* any stored Warning headers with warn-code 1xx (see section
+         * 14.46) MUST be deleted from the cache entry and the forwarded
+         * response.
+         */
+    }
+    else {
+        apr_table_addn(v, key, val);
+    }
+    return 1;
+}
 static int remove_header_do(void *v, const char *key, const char *val)
 {
-    apr_table_unset(v, key);
+    if ((*key == 'W' || *key == 'w') && !strcasecmp(key, "Warning")) {
+        /* any stored Warning headers with warn-code 2xx MUST be retained
+         * in the cache entry and the forwarded response.
+         */
+    }
+    else {
+        apr_table_unset(v, key);
+    }
     return 1;
 }
 static int add_header_do(void *v, const char *key, const char *val)
@@ -130,20 +151,25 @@ static int add_header_do(void *v, const 
  *
  * To complicate this, a header may be duplicated in either table. Should a
  * header exist in the top table, all matching headers will be removed from
- * the bottom table before the headers are combined.
+ * the bottom table before the headers are combined. The Warning headers are
+ * handled specially. Warnings are added rather than being replaced, while
+ * in the case of revalidation 1xx Warnings are stripped.
  *
  * The Content-Type and Last-Modified headers are then re-parsed and inserted
  * into the request.
  */
 void cache_accept_headers(cache_handle_t *h, request_rec *r, apr_table_t *top,
-        apr_table_t *bottom)
+        apr_table_t *bottom, int revalidation)
 {
     const char *v;
 
-    if (r->headers_out != bottom) {
+    if (revalidation) {
+        r->headers_out = apr_table_make(r->pool, 10);
+        apr_table_do(filter_header_do, r->headers_out, bottom, NULL);
+    }
+    else if (r->headers_out != bottom) {
         r->headers_out = apr_table_copy(r->pool, bottom);
     }
-
     apr_table_do(remove_header_do, r->headers_out, top, NULL);
     apr_table_do(add_header_do, r->headers_out, top, NULL);
 
@@ -372,7 +398,7 @@ int cache_select(cache_request_rec *cach
             }
 
             /* Okay, this response looks okay.  Merge in our stuff and go. */
-            cache_accept_headers(h, r, h->resp_hdrs, r->headers_out);
+            cache_accept_headers(h, r, h->resp_hdrs, r->headers_out, 0);
 
             cache->handle = h;
             return OK;

Modified: httpd/httpd/trunk/modules/cache/cache_storage.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_storage.h?rev=1480283&r1=1480282&r2=1480283&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/cache_storage.h (original)
+++ httpd/httpd/trunk/modules/cache/cache_storage.h Wed May  8 14:06:48 2013
@@ -63,9 +63,10 @@ apr_status_t cache_generate_key_default(
  * @param r request_rec
  * @param top headers to be applied
  * @param bottom headers to be overwritten
+ * @param revalidation true if revalidation is taking place
  */
 void cache_accept_headers(cache_handle_t *h, request_rec *r, apr_table_t *top,
-        apr_table_t *bottom);
+        apr_table_t *bottom, int revalidation);
 
 #ifdef __cplusplus
 }

Modified: httpd/httpd/trunk/modules/cache/mod_cache.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_cache.c?rev=1480283&r1=1480282&r2=1480283&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/cache/mod_cache.c (original)
+++ httpd/httpd/trunk/modules/cache/mod_cache.c Wed May  8 14:06:48 2013
@@ -1190,7 +1190,7 @@ static apr_status_t cache_save_filter(ap
         /* Merge in our cached headers.  However, keep any updated values. */
         /* take output, overlay on top of cached */
         cache_accept_headers(cache->handle, r, r->headers_out,
-                cache->handle->resp_hdrs);
+                cache->handle->resp_hdrs, 1);
 
         status = ap_meets_conditions(r);
         if (status != OK) {
@@ -1469,7 +1469,7 @@ static apr_status_t cache_save_filter(ap
         /* Merge in our cached headers.  However, keep any updated values. */
         /* take output, overlay on top of cached */
         cache_accept_headers(cache->handle, r, r->headers_out,
-                cache->handle->resp_hdrs);
+                cache->handle->resp_hdrs, 1);
     }
 
     /* Write away header information to cache. It is possible that we are