'https', mod_http returns "https" for the ap_hook_http_scheme and
DEFAULT_HTTPS_PORT for ap_hook_default_port. This fixes Redirect
responses to requests for directories without a trailing slash
when httpd runs behind a proxy or offload device that processes
SSL. It also enables support for Subversion in that
configuration. This change is completely backwards compatible
and passes the perl-framework. Minor mmn bump because I add a
field to server_rec.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@399947
13f79535-47bb-0310-9956-
ffa450edef68
Changes with Apache 2.3.0
[Remove entries to the current 2.0 and 2.2 section below, when backported]
+ *) core, mod_http: add optional 'scheme://' prefix to ServerName directive.
+ For 'https', mod_http returns "https" for the ap_hook_http_scheme and
+ DEFAULT_HTTPS_PORT for ap_hook_default_port. This fixes Redirect
+ responses to requests for directories without a trailing slash when
+ httpd runs behind a proxy or offload device that processes SSL. It
+ also enables support for Subversion in that configuration. This change is
+ completely backwards compatible and passes the perl-framework. Minor
+ mmn bump because I add a field to server_rec. [Sander Temme]
+
*) mod_charset_lite: Bypass translation when the source and dest charsets
are the same. [Jeff Trawick]
non-SSL request is processed for an SSL vhost (such as the
"HTTP request received on SSL port" error message when an 400
ErrorDocument is configured, or if using "SSLEngine optional").
- PR 37791. [Rüdiger Plüm, Joe Orton]
+ PR 37791. [Rüdiger Plüm, Joe Orton]
*) SECURITY: CVE-2005-3352 (cve.mitre.org)
mod_imagemap: Escape untrusted referer header before outputting
* 20060110.2 (2.3.0-dev) flush_packets and flush_wait members added to
* proxy_server (minor)
* 20060110.3 (2.3.0-dev) added inreslist member to proxy_conn_rec (minor)
+ * 20060110.4 (2.3.0-dev) Added server_scheme member to server_rec (minor)
*/
#define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20060110
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 3 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 4 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
int limit_req_fieldsize;
/** limit on number of request header fields */
int limit_req_fields;
+
+ /** The server request scheme for redirect responses */
+ const char *server_scheme;
};
typedef struct core_output_filter_ctx {
static const char *http_scheme(const request_rec *r)
{
+ /*
+ * The http module shouldn't return anything other than
+ * "http" (the default) or "https".
+ */
+ if (r->server->server_scheme &&
+ (strcmp(r->server->server_scheme, "https") == 0))
+ return "https";
+
return "http";
}
static apr_port_t http_port(const request_rec *r)
{
+ if (r->server->server_scheme &&
+ (strcmp(r->server->server_scheme, "https") == 0))
+ return DEFAULT_HTTPS_PORT;
+
return DEFAULT_HTTP_PORT;
}
s->process = main_server->process;
s->server_admin = NULL;
s->server_hostname = NULL;
+ s->server_scheme = NULL;
s->error_fname = NULL;
s->timeout = 0;
s->keep_alive_timeout = 0;
s->port = 0;
s->server_admin = DEFAULT_ADMIN;
s->server_hostname = NULL;
+ s->server_scheme = NULL;
s->error_fname = DEFAULT_ERRORLOG;
s->loglevel = DEFAULT_LOGLEVEL;
s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE;
return NULL;
}
+/*
+ * The ServerName directive takes one argument with format
+ * [scheme://]fully-qualified-domain-name[:port], for instance
+ * ServerName www.example.com
+ * ServerName www.example.com:80
+ * ServerName https://www.example.com:443
+ */
+
static const char *server_hostname_port(cmd_parms *cmd, void *dummy, const char *arg)
{
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
- const char *portstr;
+ core_server_config *conf;
+ const char *portstr, *part;
+ char *scheme;
int port;
if (err != NULL) {
return err;
}
- portstr = ap_strchr_c(arg, ':');
+ part = ap_strstr_c(arg, "://");
+
+ if (part) {
+ scheme = apr_pstrndup(cmd->pool, arg, part - arg);
+ ap_str_tolower(scheme);
+ cmd->server->server_scheme = (const char *)scheme;
+ part += 3;
+ } else {
+ part = arg;
+ }
+
+ portstr = ap_strchr_c(part, ':');
if (portstr) {
- cmd->server->server_hostname = apr_pstrndup(cmd->pool, arg,
- portstr - arg);
+ cmd->server->server_hostname = apr_pstrndup(cmd->pool, part,
+ portstr - part);
portstr++;
port = atoi(portstr);
if (port <= 0 || port >= 65536) { /* 65536 == 1<<16 */
}
}
else {
- cmd->server->server_hostname = apr_pstrdup(cmd->pool, arg);
+ cmd->server->server_hostname = apr_pstrdup(cmd->pool, part);
port = 0;
}