mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.6.x] Fixed #20530 -- Properly decoded non-ASCII query strings on Python 3.
Thanks mitsuhiko for the report. Backport of65b6eff3and adaptation of8aaca65from master.
This commit is contained in:
		| @@ -132,7 +132,10 @@ class WSGIRequest(http.HttpRequest): | |||||||
|     def _get_get(self): |     def _get_get(self): | ||||||
|         if not hasattr(self, '_get'): |         if not hasattr(self, '_get'): | ||||||
|             # The WSGI spec says 'QUERY_STRING' may be absent. |             # The WSGI spec says 'QUERY_STRING' may be absent. | ||||||
|             self._get = http.QueryDict(self.environ.get('QUERY_STRING', ''), encoding=self._encoding) |             raw_query_string = self.environ.get('QUERY_STRING', str('')) | ||||||
|  |             if six.PY3: | ||||||
|  |                 raw_query_string = raw_query_string.encode('iso-8859-1').decode('utf-8') | ||||||
|  |             self._get = http.QueryDict(raw_query_string, encoding=self._encoding) | ||||||
|         return self._get |         return self._get | ||||||
|  |  | ||||||
|     def _set_get(self, get): |     def _set_get(self, get): | ||||||
|   | |||||||
| @@ -41,6 +41,16 @@ class HandlerTests(TestCase): | |||||||
|         response = handler(environ, lambda *a, **k: None) |         response = handler(environ, lambda *a, **k: None) | ||||||
|         self.assertEqual(response.status_code, 400) |         self.assertEqual(response.status_code, 400) | ||||||
|  |  | ||||||
|  |     def test_non_ascii_query_string(self): | ||||||
|  |         """Test that non-ASCII query strings are properly decoded (#20530).""" | ||||||
|  |         environ = RequestFactory().get('/').environ | ||||||
|  |         raw_query_string = 'want=café' | ||||||
|  |         if six.PY3: | ||||||
|  |             raw_query_string = raw_query_string.encode('utf-8').decode('iso-8859-1') | ||||||
|  |         environ['QUERY_STRING'] = raw_query_string | ||||||
|  |         request = WSGIRequest(environ) | ||||||
|  |         self.assertEqual(request.GET['want'], "café") | ||||||
|  |  | ||||||
|     def test_non_ascii_cookie(self): |     def test_non_ascii_cookie(self): | ||||||
|         """Test that non-ASCII cookies set in JavaScript are properly decoded (#20557).""" |         """Test that non-ASCII cookies set in JavaScript are properly decoded (#20557).""" | ||||||
|         environ = RequestFactory().get('/').environ |         environ = RequestFactory().get('/').environ | ||||||
| @@ -49,6 +59,9 @@ class HandlerTests(TestCase): | |||||||
|             raw_cookie = raw_cookie.encode('utf-8').decode('iso-8859-1') |             raw_cookie = raw_cookie.encode('utf-8').decode('iso-8859-1') | ||||||
|         environ['HTTP_COOKIE'] = raw_cookie |         environ['HTTP_COOKIE'] = raw_cookie | ||||||
|         request = WSGIRequest(environ) |         request = WSGIRequest(environ) | ||||||
|  |         # If would be nicer if request.COOKIES returned unicode values. | ||||||
|  |         # However the current cookie parser doesn't do this and fixing it is | ||||||
|  |         # much more work than fixing #20557. Feel free to remove force_str()! | ||||||
|         self.assertEqual(request.COOKIES['want'], force_str("café")) |         self.assertEqual(request.COOKIES['want'], force_str("café")) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user