Could we try this... This does change, slightly, On
under 1.3 to be aware of the connection port number
and to use that in preference over the default
port.

Also, this exposes a bug, I think, in 2.0/2.1.
parsed_uri.port is valid iff parsed_uri.port_str != NULL.
Currently, we are testing just to see if parsed_uri.port
itself isn't 0.

This patch is for 1.3.29...

Index: src/main/http_core.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_core.c,v
retrieving revision 1.326
diff -u -r1.326 http_core.c
--- src/main/http_core.c 19 Oct 2003 13:20:57 -0000 1.326
+++ src/main/http_core.c 12 Nov 2003 19:07:12 -0000
@@ -826,16 +826,27 @@
API_EXPORT(unsigned) ap_get_server_port(const request_rec *r)
{
unsigned port;
+ unsigned cport = ntohs(r->connection->local_addr.sin_port);
core_dir_config *d =
(core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module);


-    port = r->server->port ? r->server->port : ap_default_port(r);
-
     if (d->use_canonical_name == USE_CANONICAL_NAME_OFF
-       || d->use_canonical_name == USE_CANONICAL_NAME_DNS) {
-        return r->hostname ? ntohs(r->connection->local_addr.sin_port)
-                          : port;
+        || 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 :
+          cport ? cport :
+            r->server->port ? r->server->port :
+              ap_default_port(r);
+    } else { /* d->use_canonical_name == USE_CANONICAL_NAME_ON */
+        port = r->server->port ? r->server->port :
+          cport ? cport :
+            ap_default_port(r);
     }
+
     /* default */
     return port;
 }



Reply via email to