summaryrefslogtreecommitdiff
path: root/modules/filters
diff options
context:
space:
mode:
authorEvgeny Kotkov <kotkov@apache.org>2018-10-09 12:16:08 +0000
committerEvgeny Kotkov <kotkov@apache.org>2018-10-09 12:16:08 +0000
commitd6589774a66ad528e302dac34fe0a99e52a41508 (patch)
tree1bec5bbdea95bc92079f22d56d01b3c1667a8565 /modules/filters
parent165ee80c6a9c1088af560a17a256e1a9eb32ab9e (diff)
downloadhttpd-d6589774a66ad528e302dac34fe0a99e52a41508.tar.gz
mod_brotli, mod_deflate: Restore the separate handling of 304 Not Modified
responses allowing these modules to properly set or fix-up the response headers such as Vary or ETag. This change follows up on r1837056 that disabled that special handling and thus resulted in a potential violation of RFC7232, 4.1: The server generating a 304 response MUST generate any of the following header fields that would have been sent in a 200 (OK) response to the same request: Cache-Control, Content-Location, Date, ETag, Expires, and Vary.) References: https://lists.apache.org/thread.html/f5733ca6743757e8aa8b58a0cd9e27680971551c2a20f5606c66507e@%3Cdev.httpd.apache.org%3E https://tools.ietf.org/html/rfc7232#section-4.1 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1843242 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/filters')
-rw-r--r--modules/filters/mod_brotli.c8
-rw-r--r--modules/filters/mod_deflate.c18
2 files changed, 16 insertions, 10 deletions
diff --git a/modules/filters/mod_brotli.c b/modules/filters/mod_brotli.c
index 024f6b760e..56717e7b8d 100644
--- a/modules/filters/mod_brotli.c
+++ b/modules/filters/mod_brotli.c
@@ -346,12 +346,14 @@ static apr_status_t compress_filter(ap_filter_t *f, apr_bucket_brigade *bb)
const char *accepts;
/* Only work on main request, not subrequests, that are not
- * responses with no content (204/304), and are not tagged with the
+ * a 204 response with no content, and are not tagged with the
* no-brotli env variable, and are not a partial response to
* a Range request.
+ *
+ * Note that responding to 304 is handled separately to set
+ * the required headers (such as ETag) per RFC7232, 4.1.
*/
- if (r->main
- || AP_STATUS_IS_HEADER_ONLY(r->status)
+ if (r->main || r->status == HTTP_NO_CONTENT
|| apr_table_get(r->subprocess_env, "no-brotli")
|| apr_table_get(r->headers_out, "Content-Range")) {
ap_remove_output_filter(f);
diff --git a/modules/filters/mod_deflate.c b/modules/filters/mod_deflate.c
index 6bf3a842d3..de3709dcab 100644
--- a/modules/filters/mod_deflate.c
+++ b/modules/filters/mod_deflate.c
@@ -642,19 +642,21 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
/*
* Only work on main request, not subrequests,
- * that are not responses with no content (204/304),
+ * that are not a 204 response with no content
* and are not tagged with the no-gzip env variable
* and not a partial response to a Range request.
+ *
+ * Note that responding to 304 is handled separately to
+ * set the required headers (such as ETag) per RFC7232, 4.1.
*/
- if ((r->main != NULL) ||
- AP_STATUS_IS_HEADER_ONLY(r->status) ||
+ if ((r->main != NULL) || (r->status == HTTP_NO_CONTENT) ||
apr_table_get(r->subprocess_env, "no-gzip") ||
apr_table_get(r->headers_out, "Content-Range")
) {
if (APLOG_R_IS_LEVEL(r, APLOG_TRACE1)) {
const char *reason =
(r->main != NULL) ? "subrequest" :
- AP_STATUS_IS_HEADER_ONLY(r->status) ? "no content" :
+ (r->status == HTTP_NO_CONTENT) ? "no content" :
apr_table_get(r->subprocess_env, "no-gzip") ? "no-gzip" :
"content-range";
ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
@@ -1531,12 +1533,14 @@ static apr_status_t inflate_out_filter(ap_filter_t *f,
/*
* Only work on main request, not subrequests,
- * that are not responses with no content (204/304),
+ * that are not a 204 response with no content
* and not a partial response to a Range request,
* and only when Content-Encoding ends in gzip.
+ *
+ * Note that responding to 304 is handled separately to
+ * set the required headers (such as ETag) per RFC7232, 4.1.
*/
- if (!ap_is_initial_req(r) ||
- AP_STATUS_IS_HEADER_ONLY(r->status) ||
+ if (!ap_is_initial_req(r) || (r->status == HTTP_NO_CONTENT) ||
(apr_table_get(r->headers_out, "Content-Range") != NULL) ||
(check_gzip(r, r->headers_out, r->err_headers_out) == 0)
) {