diff --git a/changes-entries/1820750.txt b/changes-entries/1820750.txt new file mode 100644 index 00000000000..a0adca8728d --- /dev/null +++ b/changes-entries/1820750.txt @@ -0,0 +1,4 @@ + *) mod_headers: 'RequestHeader set|edit|edit_r Content-Type X' could + inadvertently modify the Content-Type _response_ header. Applies to + Content-Type only and likely to only affect static file responses. + [Eric Covener] diff --git a/modules/metadata/mod_headers.c b/modules/metadata/mod_headers.c index 4838bd6cd0d..57da3fc538d 100644 --- a/modules/metadata/mod_headers.c +++ b/modules/metadata/mod_headers.c @@ -782,14 +782,16 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers, } break; case hdr_set: - if (!ap_cstr_casecmp(hdr->header, "Content-Type")) { + if (r->headers_in != headers && + !ap_cstr_casecmp(hdr->header, "Content-Type")) { ap_set_content_type_ex(r, process_tags(hdr, r), 1); } apr_table_setn(headers, hdr->header, process_tags(hdr, r)); break; case hdr_setifempty: if (NULL == apr_table_get(headers, hdr->header)) { - if (!ap_cstr_casecmp(hdr->header, "Content-Type")) { + if (r->headers_in != headers && + !ap_cstr_casecmp(hdr->header, "Content-Type")) { ap_set_content_type_ex(r, process_tags(hdr, r), 1); } apr_table_setn(headers, hdr->header, process_tags(hdr, r)); @@ -797,6 +799,10 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers, break; case hdr_unset: apr_table_unset(headers, hdr->header); + if (r->headers_in != headers && + !ap_cstr_casecmp(hdr->header, "Content-Type")) { + ap_set_content_type(r, NULL); + } break; case hdr_echo: v.r = r; @@ -809,7 +815,7 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers, const char *repl = process_regexp(hdr, r->content_type, r); if (repl == NULL) return 0; - ap_set_content_type_ex(r, repl, 1); + if (r->headers_in != headers) ap_set_content_type_ex(r, repl, 1); } if (apr_table_get(headers, hdr->header)) { edit_do ed;