|
1 | 1 | import unittest
|
2 | 2 | from datetime import datetime
|
3 | 3 |
|
| 4 | +from django.core.exceptions import TooManyFieldsSent |
4 | 5 | from django.test import SimpleTestCase, ignore_warnings
|
5 | 6 | from django.utils.datastructures import MultiValueDict
|
6 | 7 | from django.utils.deprecation import RemovedInDjango30Warning
|
7 | 8 | from django.utils.http import (
|
8 | 9 | base36_to_int, cookie_date, escape_leading_slashes, http_date,
|
9 |
| - int_to_base36, is_safe_url, is_same_domain, parse_etags, parse_http_date, |
10 |
| - quote_etag, urlencode, urlquote, urlquote_plus, urlsafe_base64_decode, |
11 |
| - urlsafe_base64_encode, urlunquote, urlunquote_plus, |
| 10 | + int_to_base36, is_safe_url, is_same_domain, limited_parse_qsl, parse_etags, |
| 11 | + parse_http_date, quote_etag, urlencode, urlquote, urlquote_plus, |
| 12 | + urlsafe_base64_decode, urlsafe_base64_encode, urlunquote, urlunquote_plus, |
12 | 13 | )
|
13 | 14 |
|
14 | 15 |
|
@@ -310,3 +311,47 @@ def test(self):
|
310 | 311 | for url, expected in tests:
|
311 | 312 | with self.subTest(url=url):
|
312 | 313 | self.assertEqual(escape_leading_slashes(url), expected)
|
| 314 | + |
| 315 | + |
| 316 | +# Backport of unit tests for urllib.parse.parse_qsl() from Python 3.8.8. |
| 317 | +# Copyright (C) 2021 Python Software Foundation (see LICENSE.python). |
| 318 | +class ParseQSLBackportTests(unittest.TestCase): |
| 319 | + def test_parse_qsl(self): |
| 320 | + tests = [ |
| 321 | + ('', []), |
| 322 | + ('&', []), |
| 323 | + ('&&', []), |
| 324 | + ('=', [('', '')]), |
| 325 | + ('=a', [('', 'a')]), |
| 326 | + ('a', [('a', '')]), |
| 327 | + ('a=', [('a', '')]), |
| 328 | + ('&a=b', [('a', 'b')]), |
| 329 | + ('a=a+b&b=b+c', [('a', 'a b'), ('b', 'b c')]), |
| 330 | + ('a=1&a=2', [('a', '1'), ('a', '2')]), |
| 331 | + (';a=b', [(';a', 'b')]), |
| 332 | + ('a=a+b;b=b+c', [('a', 'a b;b=b c')]), |
| 333 | + ] |
| 334 | + for original, expected in tests: |
| 335 | + with self.subTest(original): |
| 336 | + result = limited_parse_qsl(original, keep_blank_values=True) |
| 337 | + self.assertEqual(result, expected, 'Error parsing %r' % original) |
| 338 | + expect_without_blanks = [v for v in expected if len(v[1])] |
| 339 | + result = limited_parse_qsl(original, keep_blank_values=False) |
| 340 | + self.assertEqual(result, expect_without_blanks, 'Error parsing %r' % original) |
| 341 | + |
| 342 | + def test_parse_qsl_encoding(self): |
| 343 | + result = limited_parse_qsl('key=\u0141%E9', encoding='latin-1') |
| 344 | + self.assertEqual(result, [('key', '\u0141\xE9')]) |
| 345 | + result = limited_parse_qsl('key=\u0141%C3%A9', encoding='utf-8') |
| 346 | + self.assertEqual(result, [('key', '\u0141\xE9')]) |
| 347 | + result = limited_parse_qsl('key=\u0141%C3%A9', encoding='ascii') |
| 348 | + self.assertEqual(result, [('key', '\u0141\ufffd\ufffd')]) |
| 349 | + result = limited_parse_qsl('key=\u0141%E9-', encoding='ascii') |
| 350 | + self.assertEqual(result, [('key', '\u0141\ufffd-')]) |
| 351 | + result = limited_parse_qsl('key=\u0141%E9-', encoding='ascii', errors='ignore') |
| 352 | + self.assertEqual(result, [('key', '\u0141-')]) |
| 353 | + |
| 354 | + def test_parse_qsl_field_limit(self): |
| 355 | + with self.assertRaises(TooManyFieldsSent): |
| 356 | + limited_parse_qsl('&'.join(['a=a'] * 11), fields_limit=10) |
| 357 | + limited_parse_qsl('&'.join(['a=a'] * 10), fields_limit=10) |
0 commit comments