Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #9089 -- Correctly handle list values in MultiValueDict instanc…

…es when passed to django.utils.http.urlencode. Thanks, kratorius, guettli and obeattie.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16064 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit f4be8bd53d13c9ecb7f31998f89a2def11111efb 1 parent 7d11c30
@jezdez jezdez authored
Showing with 34 additions and 1 deletion.
  1. +4 −1 django/utils/http.py
  2. +30 −0 tests/regressiontests/utils/http.py
View
5 django/utils/http.py
@@ -6,6 +6,7 @@
import urlparse
from email.Utils import formatdate
+from django.utils.datastructures import MultiValueDict
from django.utils.encoding import smart_str, force_unicode
from django.utils.functional import allow_lazy
@@ -49,7 +50,9 @@ def urlencode(query, doseq=0):
unicode strings. The parameters are first case to UTF-8 encoded strings and
then encoded as per normal.
"""
- if hasattr(query, 'items'):
+ if isinstance(query, MultiValueDict):
+ query = query.lists()
+ elif hasattr(query, 'items'):
query = query.items()
return urllib.urlencode(
[(smart_str(k),
View
30 tests/regressiontests/utils/http.py
@@ -1,5 +1,6 @@
from django.utils import http
from django.utils import unittest
+from django.utils.datastructures import MultiValueDict
class TestUtilsHttp(unittest.TestCase):
@@ -21,3 +22,32 @@ def test_same_origin_false(self):
self.assertFalse(http.same_origin('http://foo.com', 'http://foo.com.evil.com'))
# Different port
self.assertFalse(http.same_origin('http://foo.com:8000', 'http://foo.com:8001'))
+
+ def test_urlencode(self):
+ # 2-tuples (the norm)
+ result = http.urlencode((('a', 1), ('b', 2), ('c', 3)))
+ self.assertEqual(result, 'a=1&b=2&c=3')
+ # A dictionary
+ result = http.urlencode({ 'a': 1, 'b': 2, 'c': 3})
+ acceptable_results = [
+ # Need to allow all of these as dictionaries have to be treated as
+ # unordered
+ 'a=1&b=2&c=3',
+ 'a=1&c=3&b=2',
+ 'b=2&a=1&c=3',
+ 'b=2&c=3&a=1',
+ 'c=3&a=1&b=2',
+ 'c=3&b=2&a=1'
+ ]
+ self.assertTrue(result in acceptable_results)
+ # A MultiValueDict
+ result = http.urlencode(MultiValueDict({
+ 'name': ['Adrian', 'Simon'],
+ 'position': ['Developer']
+ }), doseq=True)
+ acceptable_results = [
+ # MultiValueDicts are similarly unordered
+ 'name=Adrian&name=Simon&position=Developer',
+ 'position=Developer&name=Adrian&name=Simon'
+ ]
+ self.assertTrue(result in acceptable_results)
Please sign in to comment.
Something went wrong with that request. Please try again.