On Dec 23, 2010, at 9:09 AM, mr.freeze wrote:
> 
> Given this url:
> URL(args=1,vars=dict(v='yes'),anchor='end')
> It produces:
> http://server/app/default/index/1#end?v=yes
> Problem:
> request.vars is empty
> 
> This url:
> http://server/app/default/index/1?v=yes#end
> request.vars is populated and the anchor works
> 
> Shouldn't the anchor be at the end of the query string? I'm running
> the latest trunk.

Yes; that's an error, per RFC 3986.

      URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]


Not only that, but '?' is legal in a fragment identifier, as is '=', so in your 
first example, "end?v=yes" is itself the entire (legal) anchor.

I wouldn't be terribly surprised if some browsers treated this inconsistently, 
but we should be adhering to the RFC here.

The fix looks easy; change:

    if anchor:
        other += '#' + urllib.quote(str(anchor))
    if vars:
        other += '?%s' % m_vars

to:

    if vars:
        other += '?%s' % m_vars
    if anchor:
        other += '#' + urllib.quote(str(anchor))

...and fix the doctest. Though I'm not sure that urllib.quote is right for an 
anchor.

Reply via email to