You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ni...@apache.org on 2007/12/28 13:03:21 UTC
svn commit: r607219 - in /httpd/httpd/trunk: CHANGES
modules/filters/mod_deflate.c
Author: niq
Date: Fri Dec 28 04:03:20 2007
New Revision: 607219
URL: http://svn.apache.org/viewvc?rev=607219&view=rev
Log:
PR 39727: Fixup ETag handling in mod deflate (updated following extensive
discussion on-list).
This is not a full-and-final fix, because we don't ourselves do anything
useful with these ETags. But at least we're no longer screwing up clients.
Modified:
httpd/httpd/trunk/CHANGES
httpd/httpd/trunk/modules/filters/mod_deflate.c
Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=607219&r1=607218&r2=607219&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri Dec 28 04:03:20 2007
@@ -2,6 +2,9 @@
Changes with Apache 2.3.0
[ When backported to 2.2.x, remove entry from this file ]
+ *) mod_deflate: Transform ETag when transforming the entity.
+ PR 39727 [Henrik Nordstrom <hno squid-cache.org>, Nick Kew]
+
*) mod_ldap: Set character set for status page to ISO-8859-1 to avoid
UTF-7 XSS vulnerabilities of certain browsers. [Joe Orton]
@@ -60,10 +63,6 @@
*) mpm winnt: fix null pointer dereference
PR 42572 [Davi Arnaut]
-
- *) mod_deflate: Don't leave a strong ETag in place while transforming
- the entity.
- PR 39727 [Nick Kew]
*) core: reinstate location walk to fix config for subrequests
PR 41960 [Jose Kahan <jose w3.org>]
Modified: httpd/httpd/trunk/modules/filters/mod_deflate.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/filters/mod_deflate.c?rev=607219&r1=607218&r2=607219&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/filters/mod_deflate.c (original)
+++ httpd/httpd/trunk/modules/filters/mod_deflate.c Fri Dec 28 04:03:20 2007
@@ -373,25 +373,20 @@
return APR_SUCCESS;
}
/* PR 39727: we're screwing up our clients if we leave a strong ETag
- * header while transforming content. A minimal fix that makes us
- * protocol-compliant is to make it a weak ETag. Whether we can
- * use this ourselves (e.g. in mod_cache) is a different issue.
+ * header while transforming content. Henrik Nordstrom suggests
+ * appending ";gzip".
*
- * Henrik Nordstrom suggests instead appending ";gzip", commenting:
- * "This should allows for easy bidirectional mapping, simplifying most
- * conditionals as no transformation of the entity body is needed to find
- * the etag, and the simple format makes it easier to trace should any
- * misunderstandings occur."
- *
- * We might consider such a strategy in future if we implement support
- * for such a scheme.
+ * Pending a more thorough review of our Etag handling, let's just
+ * implement his suggestion. It fixes the bug, or at least turns it
+ * from a showstopper to an inefficiency. And it breaks nothing that
+ * wasn't already broken.
*/
-static void deflate_check_etag(request_rec *r)
+static void deflate_check_etag(request_rec *r, const char *transform)
{
const char *etag = apr_table_get(r->headers_out, "ETag");
if (etag && (((etag[0] != 'W') && (etag[0] !='w')) || (etag[1] != '/'))) {
apr_table_set(r->headers_out, "ETag",
- apr_pstrcat(r->pool, "W/", etag, NULL));
+ apr_pstrcat(r->pool, etag, "-", transform, NULL));
}
}
static apr_status_t deflate_out_filter(ap_filter_t *f,
@@ -591,7 +586,7 @@
}
apr_table_unset(r->headers_out, "Content-Length");
apr_table_unset(r->headers_out, "Content-MD5");
- deflate_check_etag(r);
+ deflate_check_etag(r, "gzip");
/* initialize deflate output buffer */
ctx->stream.next_out = ctx->buffer;
@@ -1084,7 +1079,7 @@
/* these are unlikely to be set anyway, but ... */
apr_table_unset(r->headers_out, "Content-Length");
apr_table_unset(r->headers_out, "Content-MD5");
- deflate_check_etag(r);
+ deflate_check_etag(r, "gunzip");
/* initialize inflate output buffer */
ctx->stream.next_out = ctx->buffer;