Nicolas Lehuen wrote:
Hi,

Is it me or is it quite tiresome to get the URL that called us, or get the complete URL that would call another function ?

When performing an external redirect (using mod_python.util.redirect for example), we MUST (as per RFC) provide a full URL, not a relative one. Instead of util.redirect(req,'/foo/bar.py'), we should write util.redirect(req,'https://whatever:8443/foo/bar.py').

The problem is, writing this is always tiresome, as it means building a string like this :

def current_url(req):
    req.add_common_vars()
    current_url = []

    # protocol
    if req.subprocess_env.get('HTTPS') == 'on':
        current_url.append('https')
        default_port = 443
    else:
        current_url.append('http')
        default_port = 80
    current_url.append('://')

    # host
    current_url.append(req.hostname)

    # port
    port = req.connection.local_addr[1]
    if port != default_port:
        current_url.append(':')
        current_url.append(str(port))
# URI
    current_url.append(req.uri)
return ''.join(current_url)

So I have two questions :

First question, is there a simpler way to do this ? Ironically, when using mod_rewrite, you get an environment variable named SCRIPT_URI which is precisely what I need (SCRIPT_URL, also added by mod_rewrite, is equivalent to req.uri... Don't ask we why). But relying on it isn't safe since mod_rewrite isn't always used.

I guess you could just assemble the parts from the req.parsed_uri tuple, except that apache doesn't actually fill in parsed_uri. :(

Second question, if there isn't any simpler way to do this, should we add it to mod_python ? Either as a function like above in mod_python.util, or as a member of the request object (named something like url to match the other member named uri, but that's just teasing).

I'm not against it, but for my purposes I think it would be more useful for parsed_uri to just work properly.

And third question (in pure Spanish inquisition style) : why is req.parsed_uri returning me a tuple full of Nones except for the uri and path_info part ?

It comes from apache that way. I sure don't know why though. Maybe we're missing some magic apache call that would fill it in?

Ah, fourth question : why are we (mod_python, mod_rewrite and the CGI environment variables) using the terms "URI" and "URL" to distinguish between a full, absolute resource path and a path relative to the server, whereas the definition of URLs and URIs is very vague and nothing close to this (http://www.w3.org/TR/uri-clarification/#contemporary) ? Shouldn't we save our souls and a lot of saliva by choosing better names ?

Strangely I was reading the cited page just last week, for perhaps the 100th time. I keep hoping I'll find enlightment but alas no. The danger of choosing new names (ie absolute_thingy or relative_thingy) is that we also add another layer of confusion. I'm not saying new names are a bad idea, just that we need to be very careful.

OK, OK, fifth question : we made req.filename and other members writable. But when those attributes are changed, as Graham noted a while ago, the other dependent ones aren't, leading to inconsitencies (for example, if you change req.filename, req.canonical_filename isn't changed). Should we try to solve this and provide clear definition of the various parts of a request for mod_python 3.3 ?

That would make sense. I'm wondering how often people make use of req.canonical_filename (CFN*)? Also, just how would the CFN be adjusted if the user code changes req.filename, since the user is free to put any string in there they want? Maybe CFN just gets changed to the same string. Hopefully Graham will shed some light on this, since it was his use case.

Regards,
Jim

* Because I can't type canonical_filename the same way twice. Stupid fingers.

Reply via email to