From: Jim Jagielski
Date: Tue, 15 Nov 2005 19:39:15 +0000 (+0000)
Subject: Fold in the UseCanonicalPhysicalPort code, along with the
X-Git-Tag: 2.1.10~16
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61d978167d946843e552c54e16a9afc8fa118a86;p=thirdparty%2Fapache%2Fhttpd.git
Fold in the UseCanonicalPhysicalPort code, along with the
docs changes (just source currently)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@344416 13f79535-47bb-0310-9956-ffa450edef68
---
diff --git a/CHANGES b/CHANGES
index 63e2a522d43..a7ebcfb8818 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
-*- coding: utf-8 -*-
Changes with Apache 2.1.10
+ *) Add in new UseCanonicalPhysicalPort directive, which controls
+ whether or not Apache will ever use the actual physical port
+ when constructing the canonical port number. [Jim Jagielski]
+
*) mod_dav: Fix a null pointer dereference in an error code path during the
handling of MKCOL.
[Ruediger Pluem, Ghassan Misherghi ]
diff --git a/docs/manual/mod/core.xml b/docs/manual/mod/core.xml
index 99372b62a37..d8f5c0de96c 100644
--- a/docs/manual/mod/core.xml
+++ b/docs/manual/mod/core.xml
@@ -2742,7 +2742,8 @@ itself
Host:
header to match this virtual host.
See the description of the
- UseCanonicalName directive for
+ UseCanonicalName and
+ UseCanonicalPhysicalPortdirectives for
settings which determine whether self-referential URL's (e.g., by the
mod_dir module) will refer to the
specified port, or to the port number given in the client's request.
@@ -2754,6 +2755,7 @@ itself
Apache virtual host
documentation
UseCanonicalName
+UseCanonicalPhysicalPort
NameVirtualHost
ServerAlias
@@ -3121,6 +3123,54 @@ port
then it should be just fine.
+UseCanonicalPhysicalPort
+ServerName
+Listen
+
+
+
+UseCanonicalPhysicalPort
+Configures how the server determines its own name and
+port
+UseCanonicalPhysicalPort On|Off
+UseCanonicalPhysicalPort Off
+server configvirtual host
+directory
+
+
+ In many situations Apache must construct a self-referential
+ URL -- that is, a URL that refers back to the same server. With
+ UseCanonicalPhysicalPort On
Apache will, when
+ constructing the canonical port for the server to honor
+ the UseCanonicalName directive,
+ provide the actual physical port number being used by this request
+ as a potential port. With UseCanonicalPhysicalPort Off
+ Apache will not ever use the actual physical port number, instead
+ relying on all configured information to construct a valid port number.
+
+ Note
+ The ordering of when the physical port is used is as follows:
+ UseCanonicalName On
+
+ - Port provided in
Servername
+ - Physical port
+ - Default port
+
+ UseCanonicalName Off | DNS
+
+ - Parsed port from
Host:
header
+ - Physical port
+ - Port provided in
Servername
+ - Default port
+
+
+
+ With UseCanonicalPhysicalPort Off
, the
+ physical ports are removed from the ordering.
+
+
+
+UseCanonicalName
ServerName
Listen
diff --git a/docs/manual/server-wide.xml b/docs/manual/server-wide.xml
index 57c31f48a54..c78ca4052be 100644
--- a/docs/manual/server-wide.xml
+++ b/docs/manual/server-wide.xml
@@ -40,6 +40,7 @@ the basic operations of the server.
ServerSignature
ServerTokens
UseCanonicalName
+ UseCanonicalPhysicalPort
@@ -50,8 +51,9 @@ the basic operations of the server.
ServerTokens directive
sets the value of the Server HTTP response header field.
- The ServerName and
- UseCanonicalName
+
The ServerName,
+ UseCanonicalName and
+ UseCanonicalPhysicalPort
directives are used by the server to determine how to construct
self-referential URLs. For example, when a client requests a
directory, but does not include the trailing slash in the
diff --git a/include/ap_mmn.h b/include/ap_mmn.h
index 443449e9e3f..0fafcab7038 100644
--- a/include/ap_mmn.h
+++ b/include/ap_mmn.h
@@ -106,12 +106,13 @@
* 20050708.0 (2.1.7-dev) Bump MODULE_MAGIC_COOKIE to "AP22"!
* 20050708.1 (2.1.7-dev) add proxy request_status hook (minor)
* 20051006.0 (2.1.8-dev) NET_TIME filter eliminated
+ * 20051115.0 (2.1.10-dev) Added use_canonical_phys_port to core_dir_config
*/
#define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20051006
+#define MODULE_MAGIC_NUMBER_MAJOR 20051115
#endif
#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */
diff --git a/include/http_core.h b/include/http_core.h
index 9060cb7a4e6..62f9e95e409 100644
--- a/include/http_core.h
+++ b/include/http_core.h
@@ -549,6 +549,12 @@ typedef struct {
unsigned int enable_sendfile : 2; /* files in this dir can be mmap'ed */
unsigned int allow_encoded_slashes : 1; /* URLs may contain %2f w/o being
* pitched indiscriminately */
+
+#define USE_CANONICAL_PHYS_PORT_OFF (0)
+#define USE_CANONICAL_PHYS_PORT_ON (1)
+#define USE_CANONICAL_PHYS_PORT_UNSET (2)
+ unsigned use_canonical_phys_port : 2;
+
} core_dir_config;
/* Per-server core configuration */
diff --git a/server/core.c b/server/core.c
index 1a6bff63435..8138d83f7ab 100644
--- a/server/core.c
+++ b/server/core.c
@@ -115,6 +115,7 @@ static void *create_core_dir_config(apr_pool_t *a, char *dir)
conf->accept_path_info = 3;
conf->use_canonical_name = USE_CANONICAL_NAME_UNSET;
+ conf->use_canonical_phys_port = USE_CANONICAL_PHYS_PORT_UNSET;
conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET;
conf->satisfy = apr_palloc(a, sizeof(*conf->satisfy) * METHODS);
@@ -315,6 +316,10 @@ static void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv)
conf->use_canonical_name = new->use_canonical_name;
}
+ if (new->use_canonical_phys_port != USE_CANONICAL_PHYS_PORT_UNSET) {
+ conf->use_canonical_phys_port = new->use_canonical_phys_port;
+ }
+
#ifdef RLIMIT_CPU
if (new->limit_cpu) {
conf->limit_cpu = new->limit_cpu;
@@ -888,9 +893,7 @@ AP_DECLARE(const char *) ap_get_remote_logname(request_rec *r)
/* There are two options regarding what the "name" of a server is. The
* "canonical" name as defined by ServerName and Port, or the "client's
- * name" as supplied by a possible Host: header or full URI. We never
- * trust the port passed in the client's headers, we always use the
- * port of the actual socket.
+ * name" as supplied by a possible Host: header or full URI.
*
* The DNS option to UseCanonicalName causes this routine to do a
* reverse lookup on the local IP address of the connection and use
@@ -903,30 +906,38 @@ AP_DECLARE(const char *) ap_get_server_name(request_rec *r)
{
conn_rec *conn = r->connection;
core_dir_config *d;
+ const char *retval;
d = (core_dir_config *)ap_get_module_config(r->per_dir_config,
&core_module);
- if (d->use_canonical_name == USE_CANONICAL_NAME_ON) {
- return r->server->server_hostname;
- }
-
- if (d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
- if (conn->local_host == NULL) {
- if (apr_getnameinfo(&conn->local_host,
+ switch (d->use_canonical_name) {
+ case USE_CANONICAL_NAME_ON:
+ retval = r->server->server_hostname;
+ break;
+ case USE_CANONICAL_NAME_DNS:
+ if (conn->local_host == NULL) {
+ if (apr_getnameinfo(&conn->local_host,
conn->local_addr, 0) != APR_SUCCESS)
- conn->local_host = apr_pstrdup(conn->pool,
+ conn->local_host = apr_pstrdup(conn->pool,
r->server->server_hostname);
- else {
- ap_str_tolower(conn->local_host);
+ else {
+ ap_str_tolower(conn->local_host);
+ }
}
- }
-
- return conn->local_host;
+ retval = conn->local_host;
+ break;
+ case USE_CANONICAL_NAME_OFF:
+ case USE_CANONICAL_NAME_UNSET:
+ retval = r->hostname ? r->hostname : r->server->server_hostname;
+ break;
+ default:
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "ap_get_server_name: Invalid UCN Option somehow");
+ retval = "localhost";
+ break;
}
-
- /* default */
- return r->hostname ? r->hostname : r->server->server_hostname;
+ return retval;
}
/*
@@ -952,34 +963,44 @@ AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)
core_dir_config *d =
(core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);
- if (d->use_canonical_name == USE_CANONICAL_NAME_OFF
- || d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
-
- /* With UseCanonicalName off Apache will form self-referential
- * URLs using the hostname and port supplied by the client if
- * any are supplied (otherwise it will use the canonical name).
- */
- port = r->parsed_uri.port_str ? r->parsed_uri.port :
- r->connection->local_addr->port ? r->connection->local_addr->port :
- r->server->port ? r->server->port :
- ap_default_port(r);
- }
- else { /* d->use_canonical_name == USE_CANONICAL_NAME_ON */
-
- /* With UseCanonicalName on (and in all versions prior to 1.3)
- * Apache will use the hostname and port specified in the
- * ServerName directive to construct a canonical name for the
- * server. (If no port was specified in the ServerName
- * directive, Apache uses the port supplied by the client if
- * any is supplied, and finally the default port for the protocol
- * used.
- */
- port = r->server->port ? r->server->port :
- r->connection->local_addr->port ? r->connection->local_addr->port :
- ap_default_port(r);
+ switch (d->use_canonical_name) {
+ case USE_CANONICAL_NAME_OFF:
+ case USE_CANONICAL_NAME_DNS:
+ case USE_CANONICAL_NAME_UNSET:
+ if (d->use_canonical_phys_port == USE_CANONICAL_PHYS_PORT_ON)
+ port = r->parsed_uri.port_str ? r->parsed_uri.port :
+ r->connection->local_addr->port ? r->connection->local_addr->port :
+ r->server->port ? r->server->port :
+ ap_default_port(r);
+ else /* USE_CANONICAL_PHYS_PORT_OFF or USE_CANONICAL_PHYS_PORT_UNSET */
+ port = r->parsed_uri.port_str ? r->parsed_uri.port :
+ r->server->port ? r->server->port :
+ ap_default_port(r);
+ break;
+ case USE_CANONICAL_NAME_ON:
+ /* With UseCanonicalName on (and in all versions prior to 1.3)
+ * Apache will use the hostname and port specified in the
+ * ServerName directive to construct a canonical name for the
+ * server. (If no port was specified in the ServerName
+ * directive, Apache uses the port supplied by the client if
+ * any is supplied, and finally the default port for the protocol
+ * used.
+ */
+ if (d->use_canonical_phys_port == USE_CANONICAL_PHYS_PORT_ON)
+ port = r->server->port ? r->server->port :
+ r->connection->local_addr->port ? r->connection->local_addr->port :
+ ap_default_port(r);
+ else /* USE_CANONICAL_PHYS_PORT_OFF or USE_CANONICAL_PHYS_PORT_UNSET */
+ port = r->server->port ? r->server->port :
+ ap_default_port(r);
+ break;
+ default:
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "ap_get_server_port: Invalid UCN Option somehow");
+ port = ap_default_port(r);
+ break;
}
- /* default */
return port;
}
@@ -2484,6 +2505,29 @@ static const char *set_use_canonical_name(cmd_parms *cmd, void *d_,
return NULL;
}
+static const char *set_use_canonical_phys_port(cmd_parms *cmd, void *d_,
+ const char *arg)
+{
+ core_dir_config *d = d_;
+ const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT);
+
+ if (err != NULL) {
+ return err;
+ }
+
+ if (strcasecmp(arg, "on") == 0) {
+ d->use_canonical_phys_port = USE_CANONICAL_PHYS_PORT_ON;
+ }
+ else if (strcasecmp(arg, "off") == 0) {
+ d->use_canonical_phys_port = USE_CANONICAL_PHYS_PORT_OFF;
+ }
+ else {
+ return "parameter must be 'on' or 'off'";
+ }
+
+ return NULL;
+}
+
static const char *include_config (cmd_parms *cmd, void *dummy,
const char *name)
@@ -3259,6 +3303,9 @@ AP_INIT_FLAG("ContentDigest", set_content_md5, NULL, OR_OPTIONS,
AP_INIT_TAKE1("UseCanonicalName", set_use_canonical_name, NULL,
RSRC_CONF|ACCESS_CONF,
"How to work out the ServerName : Port when constructing URLs"),
+AP_INIT_TAKE1("UseCanonicalPhysicalPort", set_use_canonical_phys_port, NULL,
+ RSRC_CONF|ACCESS_CONF,
+ "Whether to use the physical Port when constructing URLs"),
/* TODO: RlimitFoo should all be part of mod_cgi, not in the core */
/* TODO: ListenBacklog in MPM */
AP_INIT_TAKE1("Include", include_config, NULL,