Ticket #3553: 3553.diff

File 3553.diff, 6.4 KB (added by Graham King, 16 years ago)

Uses urllib.unquote_plus for dev server, mod_python and fastcgi, and all the tests pass

  • django/test/client.py

     
    265265        r = {
    266266            'CONTENT_TYPE':    'text/html; charset=utf-8',
    267267            'PATH_INFO':       urllib.unquote(parsed[2]),
     268            'REQUEST_URI':     parsed[2],
    268269            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
    269270            'REQUEST_METHOD': 'GET',
    270271            'wsgi.input':      FakePayload('')
     
    287288            'CONTENT_LENGTH': len(post_data),
    288289            'CONTENT_TYPE':   content_type,
    289290            'PATH_INFO':      urllib.unquote(parsed[2]),
     291            'REQUEST_URI':    parsed[2],
    290292            'QUERY_STRING':   parsed[4],
    291293            'REQUEST_METHOD': 'POST',
    292294            'wsgi.input':     FakePayload(post_data),
     
    303305        r = {
    304306            'CONTENT_TYPE':    'text/html; charset=utf-8',
    305307            'PATH_INFO':       urllib.unquote(parsed[2]),
     308            'REQUEST_URI':     parsed[2],
    306309            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
    307310            'REQUEST_METHOD': 'HEAD',
    308311            'wsgi.input':      FakePayload('')
     
    318321        parsed = urlparse(path)
    319322        r = {
    320323            'PATH_INFO':       urllib.unquote(parsed[2]),
     324            'REQUEST_URI':     parsed[2],
    321325            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
    322326            'REQUEST_METHOD': 'OPTIONS',
    323327            'wsgi.input':      FakePayload('')
     
    340344            'CONTENT_LENGTH': len(post_data),
    341345            'CONTENT_TYPE':   content_type,
    342346            'PATH_INFO':      urllib.unquote(parsed[2]),
     347            'REQUEST_URI':    parsed[2],
    343348            'QUERY_STRING':   urlencode(data, doseq=True) or parsed[4],
    344349            'REQUEST_METHOD': 'PUT',
    345350            'wsgi.input':     FakePayload(post_data),
     
    355360        parsed = urlparse(path)
    356361        r = {
    357362            'PATH_INFO':       urllib.unquote(parsed[2]),
     363            'REQUEST_URI':     parsed[2],
    358364            'QUERY_STRING':    urlencode(data, doseq=True) or parsed[4],
    359365            'REQUEST_METHOD': 'DELETE',
    360366            'wsgi.input':      FakePayload('')
  • django/core/servers/basehttp.py

     
    566566        else:
    567567            path,query = self.path,''
    568568
    569         env['PATH_INFO'] = urllib.unquote(path)
     569        env['PATH_INFO'] = urllib.unquote_plus(path)
    570570        env['QUERY_STRING'] = query
    571571        env['REMOTE_ADDR'] = self.client_address[0]
    572572
  • django/core/handlers/wsgi.py

     
    11from threading import Lock
    22from pprint import pformat
     3import urllib
    34try:
    45    from cStringIO import StringIO
    56except ImportError:
     
    7576class WSGIRequest(http.HttpRequest):
    7677    def __init__(self, environ):
    7778        script_name = base.get_script_name(environ)
    78         path_info = force_unicode(environ.get('PATH_INFO', u'/'))
     79       
     80        real_path = environ.get('REQUEST_URI', u'/').split('?')[0]
     81        path_info = force_unicode( urllib.unquote_plus(real_path) )
    7982        if not path_info or path_info == script_name:
    8083            # Sometimes PATH_INFO exists, but is empty (e.g. accessing
    8184            # the SCRIPT_NAME URL without a trailing slash). We really need to
  • django/core/handlers/modpython.py

     
    11import os
    22from pprint import pformat
     3import urllib
    34
    45from django import http
    56from django.core import signals
     
    2021        # and PATH_INFO values. This causes problems when we compute path_info,
    2122        # below. For now, don't use script names that will be subject to
    2223        # encoding/decoding.
    23         self.path = force_unicode(req.uri)
     24
     25        if req.unparsed_uri:
     26            req_uri = urllib.unquote_plus(req.unparsed_uri.split('?')[0])
     27        else:
     28            req_uri = req.uri
     29           
     30        self.path = force_unicode(req_uri)
    2431        root = req.get_options().get('django.root', '')
    2532        self.django_root = root
    2633        # req.path_info isn't necessarily computed correctly in all
    2734        # circumstances (it's out of mod_python's control a bit), so we use
    28         # req.uri and some string manipulations to get the right value.
    29         if root and req.uri.startswith(root):
    30             self.path_info = force_unicode(req.uri[len(root):])
     35        # req_uri and some string manipulations to get the right value.
     36        if root and req_uri.startswith(root):
     37            self.path_info = force_unicode(req_uri[len(root):])
    3138        else:
    3239            self.path_info = self.path
    3340        if not self.path_info:
  • tests/regressiontests/file_uploads/tests.py

     
    100100            'CONTENT_LENGTH': len(payload),
    101101            'CONTENT_TYPE':   client.MULTIPART_CONTENT,
    102102            'PATH_INFO':      "/file_uploads/echo/",
     103            'REQUEST_URI':    "/file_uploads/echo/",
    103104            'REQUEST_METHOD': 'POST',
    104105            'wsgi.input':     client.FakePayload(payload),
    105106        }
     
    127128            'CONTENT_LENGTH': len(payload),
    128129            'CONTENT_TYPE':   client.MULTIPART_CONTENT,
    129130            'PATH_INFO':      "/file_uploads/echo/",
     131            'REQUEST_URI':    "/file_uploads/echo/",
    130132            'REQUEST_METHOD': 'POST',
    131133            'wsgi.input':     client.FakePayload(payload),
    132134        }
  • tests/regressiontests/requests/tests.py

     
    2525...         return {}
    2626>>> req = Dummy()
    2727>>> req.uri = 'bogus'
     28>>> req.unparsed_uri = 'bogus'
    2829>>> print repr(FakeModPythonRequest(req))
    2930<ModPythonRequest
    3031path:bogus,
Back to Top