diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 19b287af87a..a7004f2c2fe 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -14,9 +14,8 @@ import socket import sys import traceback try: - from urllib.parse import unquote, urljoin + from urllib.parse import urljoin except ImportError: # Python 2 - from urllib import unquote from urlparse import urljoin from django.utils.six.moves import socketserver from wsgiref import simple_server @@ -139,37 +138,6 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): self.style = color_style() super(WSGIRequestHandler, self).__init__(*args, **kwargs) - def get_environ(self): - env = self.server.base_environ.copy() - env['SERVER_PROTOCOL'] = self.request_version - env['REQUEST_METHOD'] = self.command - if '?' in self.path: - path,query = self.path.split('?',1) - else: - path,query = self.path,'' - - env['PATH_INFO'] = unquote(path) - env['QUERY_STRING'] = query - env['REMOTE_ADDR'] = self.client_address[0] - env['CONTENT_TYPE'] = self.headers.get('content-type', 'text/plain') - - length = self.headers.get('content-length') - if length: - env['CONTENT_LENGTH'] = length - - for key, value in self.headers.items(): - key = key.replace('-','_').upper() - value = value.strip() - if key in env: - # Skip content length, type, etc. - continue - if 'HTTP_' + key in env: - # Comma-separate multiple headers - env['HTTP_' + key] += ',' + value - else: - env['HTTP_' + key] = value - return env - def log_message(self, format, *args): # Don't bother logging requests for admin images or the favicon. if (self.path.startswith(self.admin_static_prefix) diff --git a/tests/regressiontests/servers/tests.py b/tests/regressiontests/servers/tests.py index c90c785a6ed..f54e34ce285 100644 --- a/tests/regressiontests/servers/tests.py +++ b/tests/regressiontests/servers/tests.py @@ -1,6 +1,9 @@ +# -*- encoding: utf-8 -*- """ Tests for django.core.servers. """ +from __future__ import unicode_literals + import os try: from urllib.request import urlopen, HTTPError @@ -11,6 +14,7 @@ from django.core.exceptions import ImproperlyConfigured from django.test import LiveServerTestCase from django.core.servers.basehttp import WSGIServerException from django.test.utils import override_settings +from django.utils.http import urlencode from .models import Person @@ -134,6 +138,10 @@ class LiveServerViews(LiveServerBase): f = self.urlopen('/media/example_media_file.txt') self.assertEqual(f.read().rstrip(b'\r\n'), b'example media file') + def test_environ(self): + f = self.urlopen('/environ_view/?%s' % urlencode({'q': 'ั‚ะตัั‚'})) + self.assertIn(b"QUERY_STRING: 'q=%D1%82%D0%B5%D1%81%D1%82'", f.read()) + class LiveServerDatabase(LiveServerBase): diff --git a/tests/regressiontests/servers/urls.py b/tests/regressiontests/servers/urls.py index c8ca1ac7a42..a857c45f95f 100644 --- a/tests/regressiontests/servers/urls.py +++ b/tests/regressiontests/servers/urls.py @@ -9,4 +9,5 @@ urlpatterns = patterns('', url(r'^example_view/$', views.example_view), url(r'^model_view/$', views.model_view), url(r'^create_model_instance/$', views.create_model_instance), -) \ No newline at end of file + url(r'^environ_view/$', views.environ_view), +) diff --git a/tests/regressiontests/servers/views.py b/tests/regressiontests/servers/views.py index 94a4f2d9ef6..00baf4b5ac6 100644 --- a/tests/regressiontests/servers/views.py +++ b/tests/regressiontests/servers/views.py @@ -14,4 +14,8 @@ def model_view(request): def create_model_instance(request): person = Person(name='emily') person.save() - return HttpResponse('') \ No newline at end of file + return HttpResponse('') + + +def environ_view(request): + return HttpResponse("\n".join(["%s: %r" % (k, v) for k, v in request.environ.items()]))