From: Yann Ylavic Date: Tue, 10 Jun 2025 10:58:15 +0000 (+0000) Subject: avoid ap_set_content_type when processing a _Request_Header set|edit|unset Content... X-Git-Tag: 2.4.64-rc1-candidate~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6764774d51f3dcb07e79779c64a463d3c112b53f;p=thirdparty%2Fapache%2Fhttpd.git avoid ap_set_content_type when processing a _Request_Header set|edit|unset Content-Type. identified by ylavic Merges r1820750 from trunk Submitted by: covener Reviewed by: covener, rpluem, jorton git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1926323 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index b7bd605542..8fac45be5c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,11 @@ -*- coding: utf-8 -*- Changes with Apache 2.4.64 + *) 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] + *) mod_ssl: Remove warning over potential uninitialised value for ssl protocol prior to protocol selection. [Graham Leggett] diff --git a/modules/metadata/mod_headers.c b/modules/metadata/mod_headers.c index 4838bd6cd0..57da3fc538 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;