From: Jeff Trawick Date: Mon, 16 May 2005 10:41:42 +0000 (+0000) Subject: Support the suppress-error-charset setting, as with Apache 1.3.x. X-Git-Tag: 2.1.5~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ae218a5bf6ceb6047fd8afc2b2c0d5f39052b2b;p=thirdparty%2Fapache%2Fhttpd.git Support the suppress-error-charset setting, as with Apache 1.3.x. With Apache 1.3.x, it is a bit simpler as the request does not go through ap_make_content_type(). Modules can set custom error responses but not be able to set the charset, so they have to code the charset in the html. Thus, it is useful to preserve 1.3.x behavior exactly. PR: 26467 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@170354 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 660b7484b83..7d4ea1e90ec 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.1.5 [Remove entries to the current 2.0 section below, when backported] + *) Support the suppress-error-charset setting, as with Apache 1.3.x. + PR 31274. [Jeff Trawick] + *) Prevent hangs of child processes when writing to piped loggers at the time of graceful restart. PR 26467. [Jeff Trawick] diff --git a/docs/manual/env.xml b/docs/manual/env.xml index 41875320b48..048f5b1cd73 100644 --- a/docs/manual/env.xml +++ b/docs/manual/env.xml @@ -349,7 +349,7 @@
suppress-error-charset -

Available in versions after 2.0.40

+

Available in versions 2.2 and later

When Apache issues a redirect in response to a client request, the response includes some actual text to be displayed in case diff --git a/include/http_core.h b/include/http_core.h index f20e8a80767..175055d51c0 100644 --- a/include/http_core.h +++ b/include/http_core.h @@ -332,6 +332,9 @@ typedef struct { char **response_code_strings; /* from ap_custom_response(), not from * ErrorDocument */ + /* Should addition of charset= be suppressed for this request? + */ + int suppress_charset; } core_request_config; /* Standard entries that are guaranteed to be accessible via diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index 9e2f18f2deb..d4b0429f52d 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -1157,7 +1157,19 @@ AP_DECLARE(void) ap_send_error_response(request_rec *r, int recursive_error) r->content_languages = NULL; r->content_encoding = NULL; r->clength = 0; - ap_set_content_type(r, "text/html; charset=iso-8859-1"); + + if (apr_table_get(r->subprocess_env, + "suppress-error-charset") != NULL) { + core_request_config *request_conf = + ap_get_module_config(r->request_config, &core_module); + request_conf->suppress_charset = 1; /* avoid adding default + * charset later + */ + ap_set_content_type(r, "text/html"); + } + else { + ap_set_content_type(r, "text/html; charset=iso-8859-1"); + } if ((status == HTTP_METHOD_NOT_ALLOWED) || (status == HTTP_NOT_IMPLEMENTED)) { diff --git a/server/protocol.c b/server/protocol.c index 2ef84380036..60b1a9c139d 100644 --- a/server/protocol.c +++ b/server/protocol.c @@ -106,6 +106,7 @@ AP_DECLARE(const char *)ap_make_content_type(request_rec *r, const char *type) core_dir_config *conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module); + core_request_config *request_conf; apr_size_t type_len; if (!type) { @@ -116,6 +117,12 @@ AP_DECLARE(const char *)ap_make_content_type(request_rec *r, const char *type) return type; } + request_conf = + ap_get_module_config(r->request_config, &core_module); + if (request_conf->suppress_charset) { + return type; + } + type_len = strlen(type); if (apr_strmatch(charset_pattern, type, type_len) != NULL) {