From: William A. Rowe Jr Date: Mon, 31 Dec 2007 01:13:43 +0000 (+0000) Subject: Introduce the ProxyFtpDirCharset directive, allowing the administrator X-Git-Tag: 2.3.0~1075 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e5661d3734b2fdab68a5f827733a92330fe71465;p=apache Introduce the ProxyFtpDirCharset directive, allowing the administrator to identify a default, or specific servers or paths which list their contents in other-than ISO-8859-1 charset (e.g. utf-8). Submitted by: Ruediger Pluem git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@607638 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index e2ac4a79a4..e9a5795260 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,10 @@ Changes with Apache 2.3.0 Prevent crash in balancer manager if invalid balancer name is passed as parameter. Reported by SecurityReason. [Ruediger Pluem] + *) Introduce the ProxyFtpDirCharset directive, allowing the administrator + to identify a default, or specific servers or paths which list their + contents in other-than ISO-8859-1 charset (e.g. utf-8). [Ruediger Pluem] + *) mod_dav: Fix evaluation of If-Match * and If-None-Match * conditionals. PR 38034 [Paritosh Shah ] diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index bd342a50d2..c9e933b7eb 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -372,6 +372,22 @@ response + +ProxyFtpDirCharset +Define the character set for proxied FTP listings +ProxyFtpDirCharset character set +ProxyFtpDirCharset ISO-8859-1 +server configvirtual host +directory +Available in Apache 2.2.7 and later + + +

The ProxyFtpDirCharset directive defines the + character set to be set for FTP directory listings in HTML generated by + mod_proxy_ftp.

+
+
+ ProxyMatch Container for directives applied to regular-expression-matched diff --git a/include/ap_mmn.h b/include/ap_mmn.h index ad19c22745..d47b48fd28 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -146,6 +146,7 @@ * 20071108.4 (2.3.0-dev) Add ap_proxy_ssl_connection_cleanup * 20071108.5 (2.3.0-dev) Add *scpool to proxy_conn_rec structure * 20071108.6 (2.3.0-dev) Add *r and need_flush to proxy_conn_rec structure + * 20071108.7 (2.3.0-dev) Add *ftp_directory_charset to proxy_dir_conf */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ @@ -153,7 +154,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20071108 #endif -#define MODULE_MAGIC_NUMBER_MINOR 6 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 7 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 626cbd56e7..6bb9237793 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -1120,6 +1120,9 @@ static void *merge_proxy_dir_config(apr_pool_t *p, void *basev, void *addv) new->cookie_domain_str = base->cookie_domain_str; new->interpolate_env = (add->interpolate_env == -1) ? base->interpolate_env : add->interpolate_env; + new->ftp_directory_charset = add->ftp_directory_charset ? + add->ftp_directory_charset : + base->ftp_directory_charset; return new; } @@ -1834,6 +1837,15 @@ static const char * return NULL; } +static const char* set_ftp_directory_charset(cmd_parms *cmd, void *dconf, + const char *arg) +{ + proxy_dir_conf *conf = dconf; + + conf->ftp_directory_charset = arg; + return NULL; +} + static void ap_add_per_proxy_conf(server_rec *s, ap_conf_vector_t *dir_config) { proxy_server_conf *sconf = ap_get_module_config(s->module_config, @@ -2044,6 +2056,8 @@ static const command_rec proxy_cmds[] = "Configure Status: proxy status to one of: on | off | full"), AP_INIT_RAW_ARGS("ProxySet", set_proxy_param, NULL, RSRC_CONF|ACCESS_CONF, "A balancer or worker name with list of params"), + AP_INIT_TAKE1("ProxyFtpDirCharset", set_ftp_directory_charset, NULL, + RSRC_CONF|ACCESS_CONF, "Define the character set for proxied FTP listings"), {NULL} }; diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 9a6a6eb10b..34eafab44b 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -214,6 +214,7 @@ typedef struct { const apr_strmatch_pattern* cookie_path_str; const apr_strmatch_pattern* cookie_domain_str; int interpolate_env; + const char *ftp_directory_charset; } proxy_dir_conf; /* if we interpolate env vars per-request, we'll need a per-request diff --git a/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c index 277a017941..01aa9c52aa 100644 --- a/modules/proxy/mod_proxy_ftp.c +++ b/modules/proxy/mod_proxy_ftp.c @@ -1691,7 +1691,13 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, /* set content-type */ if (dirlisting) { - ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + proxy_dir_conf *dconf = ap_get_module_config(r->per_dir_config, + &proxy_module); + + ap_set_content_type(r, apr_pstrcat(p, "text/html;charset=", + dconf->ftp_directory_charset ? + dconf->ftp_directory_charset : + "ISO-8859-1", NULL)); } else { if (r->content_type) {