Apache provides the function ap_construct_url(). Its purpose is:
char *ap_construct_url (pool *p, const char *uri, const request_rec *r)
This function builds a fully qualified URI string from the path specified
by uri, using the information stored in the request record r to determine
the server name and port. The port number is not included in the string
if it is the same as the default port 80.
For example, imagine that the current request is directed to the virtual
server
www.modperl.com at port 80. Then the following call will return
the string
http://www.modperl.com/ index.html:
char *url = ap_construct_url(r->pool, "/index.html", r);
This may be a solution to issue previously discussed about how to create a full URL for purpose of doing a redirect.
Even if not perfect, should be exposed as req.construct_url(). After all, the Apache folks are more likely to get this correct and maintain it, better than we can do our own version in Python.
req.the_request = GET /~grahamd/authenhandler/?invalidate HTTP/1.1
req.headers_in["host"] = localhost:8080
req.connection.local_addr = ('127.0.0.1', 8080)
For whatever reason though in this one case, it spat out:
http://localhost/~grahamd/authenhandler/login.html
What happened to my port number?
I think it is tied up with fact that request was against a directory and it was doing odd things based on DirectoryIndex value. Ie., Apache was trying multiple alternatives and after first somehow decided to not bother including port properly.
But then, I was trying to use mod_python.util.redirect() in an authenhandler and it looks like the redirect function may actually be buggy. Specifically, mod_python.util.redirect() returns apache.OK when it should actually be returning apache.DONE as it forms a complete response. Because it wasn't returning apache.DONE, Apache kept trying to match files in DirectoryIndex when it should have given up after the first because a redirect response was being returned.
Will have to do some testing and will have to post a distinct issue if it should be changed.