Skip to content

Path is always set to "/" using unicode wsgi protocol under Python 3 #1350

Description

Originally reported by: Lars Gustäbel (Bitbucket: gustaebel, GitHub: gustaebel)


I am using a cherrypy server with wsgi_version = ("u", 0) under Python 3, and found a bug in _cherrypy.cptree.Tree.call().

The problematic code is the following:

#!python

env1x = environ
if environ.get(ntou('wsgi.version')) == (ntou('u'), 0):
    env1x = _cpwsgi.downgrade_wsgi_ux_to_1x(environ)
path = httputil.urljoin(env1x.get('SCRIPT_NAME', ''),
                        env1x.get('PATH_INFO', ''))
sn = self.script_name(path or "/")

The unicode environment is converted to bytes (in Python 3) in order to assemble the path from SCRIPT_NAME and PATH_INFO. The problem is that after this conversion all keys are bytes objects, so both env1x.get() calls fail and return the empty string. This in turn leads to httputil.urljoin() returning the empty string which is then replaced by "/" in the script_name() call.

So, whatever url you pass to Tree.call() they all get converted to "/". My solution to this problem is to test for py3k before downgrade_wsgi_ux_to_1x(). A patch is attached.

#!python

if py3k:
    if environ.get(ntou('wsgi.version')) == (ntou('u'), 0):
        env1x = _cpwsgi.downgrade_wsgi_ux_to_1x(environ)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions