Kaydet (Commit) e6065c7b authored tarafından Claude Paroz's avatar Claude Paroz

Fixed #25619 -- Made runserver serve with HTTP 1.1 protocol

Thanks Tim Graham for the review.
üst 007d4e03
...@@ -78,6 +78,8 @@ class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer): ...@@ -78,6 +78,8 @@ class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer):
class ServerHandler(simple_server.ServerHandler): class ServerHandler(simple_server.ServerHandler):
http_version = '1.1'
def handle_error(self): def handle_error(self):
# Ignore broken pipe errors, otherwise pass on # Ignore broken pipe errors, otherwise pass on
if not is_broken_pipe_error(): if not is_broken_pipe_error():
...@@ -85,6 +87,8 @@ class ServerHandler(simple_server.ServerHandler): ...@@ -85,6 +87,8 @@ class ServerHandler(simple_server.ServerHandler):
class WSGIRequestHandler(simple_server.WSGIRequestHandler): class WSGIRequestHandler(simple_server.WSGIRequestHandler):
protocol_version = 'HTTP/1.1'
def address_string(self): def address_string(self):
# Short-circuit parent method to not call socket.getfqdn # Short-circuit parent method to not call socket.getfqdn
return self.client_address[0] return self.client_address[0]
...@@ -131,8 +135,14 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler): ...@@ -131,8 +135,14 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler):
return super().get_environ() return super().get_environ()
def handle(self): def handle(self):
"""Copy of WSGIRequestHandler, but with different ServerHandler""" """Handle multiple requests if necessary."""
self.close_connection = 1
self.handle_one_request()
while not self.close_connection:
self.handle_one_request()
def handle_one_request(self):
"""Copy of WSGIRequestHandler.handle() but with different ServerHandler"""
self.raw_requestline = self.rfile.readline(65537) self.raw_requestline = self.rfile.readline(65537)
if len(self.raw_requestline) > 65536: if len(self.raw_requestline) > 65536:
self.requestline = '' self.requestline = ''
......
...@@ -173,7 +173,7 @@ Models ...@@ -173,7 +173,7 @@ Models
Requests and Responses Requests and Responses
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
* ... * The :djadmin:`runserver` Web server supports HTTP 1.1.
Serialization Serialization
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
......
...@@ -4,11 +4,13 @@ Tests for django.core.servers. ...@@ -4,11 +4,13 @@ Tests for django.core.servers.
import errno import errno
import os import os
import socket import socket
from http.client import HTTPConnection
from urllib.error import HTTPError from urllib.error import HTTPError
from urllib.parse import urlencode from urllib.parse import urlencode
from urllib.request import urlopen from urllib.request import urlopen
from django.test import LiveServerTestCase, override_settings from django.test import LiveServerTestCase, override_settings
from django.test.utils import captured_stdout
from .models import Person from .models import Person
...@@ -50,6 +52,20 @@ class LiveServerAddress(LiveServerBase): ...@@ -50,6 +52,20 @@ class LiveServerAddress(LiveServerBase):
class LiveServerViews(LiveServerBase): class LiveServerViews(LiveServerBase):
def test_protocol(self):
"""Launched server serves with HTTP 1.1."""
with captured_stdout() as debug_output:
conn = HTTPConnection(LiveServerViews.server_thread.host, LiveServerViews.server_thread.port)
try:
conn.set_debuglevel(1)
conn.request('GET', '/example_view/', headers={"Connection": "keep-alive"})
conn.getresponse().read()
conn.request('GET', '/example_view/', headers={"Connection": "close"})
conn.getresponse()
finally:
conn.close()
self.assertEqual(debug_output.getvalue().count("reply: 'HTTP/1.1 200 OK"), 2)
def test_404(self): def test_404(self):
with self.assertRaises(HTTPError) as err: with self.assertRaises(HTTPError) as err:
self.urlopen('/') self.urlopen('/')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment