Loading django/core/servers/basehttp.py +7 −6 Original line number Diff line number Diff line Loading @@ -306,14 +306,15 @@ class ServerHandler(object): env.setdefault('SERVER_SOFTWARE',self.server_software) def finish_response(self): """Send any iterable data, then close self and the iterable """ Send any iterable data, then close self and the iterable Subclasses intended for use in asynchronous servers will want to redefine this method, such that it sets up callbacks in the event loop to iterate over the data, and to call 'self.close()' once the response is finished. Subclasses intended for use in asynchronous servers will want to redefine this method, such that it sets up callbacks in the event loop to iterate over the data, and to call 'self.close()' once the response is finished. """ if not self.result_is_file() and not self.sendfile(): if not self.result_is_file() or not self.sendfile(): for data in self.result: self.write(data) self.finish_content() Loading tests/regressiontests/builtin_server/__init__.py 0 → 100644 +0 −0 Empty file added. tests/regressiontests/builtin_server/models.py 0 → 100644 +0 −0 Empty file added. tests/regressiontests/builtin_server/tests.py 0 → 100644 +51 −0 Original line number Diff line number Diff line from unittest import TestCase from StringIO import StringIO from django.core.servers.basehttp import ServerHandler # # Tests for #9659: wsgi.file_wrapper in the builtin server. # We need to mock a couple of of handlers and keep track of what # gets called when using a couple kinds of WSGI apps. # class DummyHandler(object): def log_request(*args, **kwargs): pass class FileWrapperHandler(ServerHandler): def __init__(self, *args, **kwargs): ServerHandler.__init__(self, *args, **kwargs) self.request_handler = DummyHandler() self._used_sendfile = False def sendfile(self): self._used_sendfile = True return True def wsgi_app(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return ['Hello World!'] def wsgi_app_file_wrapper(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return environ['wsgi.file_wrapper'](StringIO('foo')) class WSGIFileWrapperTests(TestCase): """ Test that the wsgi.file_wrapper works for the builting server. """ def test_file_wrapper_uses_sendfile(self): env = {'SERVER_PROTOCOL': 'HTTP/1.0'} err = StringIO() handler = FileWrapperHandler(None, StringIO(), err, env) handler.run(wsgi_app_file_wrapper) self.assert_(handler._used_sendfile) def test_file_wrapper_no_sendfile(self): env = {'SERVER_PROTOCOL': 'HTTP/1.0'} err = StringIO() handler = FileWrapperHandler(None, StringIO(), err, env) handler.run(wsgi_app) self.failIf(handler._used_sendfile) self.assertEqual(handler.stdout.getvalue().splitlines()[-1],'Hello World!') Loading
django/core/servers/basehttp.py +7 −6 Original line number Diff line number Diff line Loading @@ -306,14 +306,15 @@ class ServerHandler(object): env.setdefault('SERVER_SOFTWARE',self.server_software) def finish_response(self): """Send any iterable data, then close self and the iterable """ Send any iterable data, then close self and the iterable Subclasses intended for use in asynchronous servers will want to redefine this method, such that it sets up callbacks in the event loop to iterate over the data, and to call 'self.close()' once the response is finished. Subclasses intended for use in asynchronous servers will want to redefine this method, such that it sets up callbacks in the event loop to iterate over the data, and to call 'self.close()' once the response is finished. """ if not self.result_is_file() and not self.sendfile(): if not self.result_is_file() or not self.sendfile(): for data in self.result: self.write(data) self.finish_content() Loading
tests/regressiontests/builtin_server/tests.py 0 → 100644 +51 −0 Original line number Diff line number Diff line from unittest import TestCase from StringIO import StringIO from django.core.servers.basehttp import ServerHandler # # Tests for #9659: wsgi.file_wrapper in the builtin server. # We need to mock a couple of of handlers and keep track of what # gets called when using a couple kinds of WSGI apps. # class DummyHandler(object): def log_request(*args, **kwargs): pass class FileWrapperHandler(ServerHandler): def __init__(self, *args, **kwargs): ServerHandler.__init__(self, *args, **kwargs) self.request_handler = DummyHandler() self._used_sendfile = False def sendfile(self): self._used_sendfile = True return True def wsgi_app(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return ['Hello World!'] def wsgi_app_file_wrapper(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return environ['wsgi.file_wrapper'](StringIO('foo')) class WSGIFileWrapperTests(TestCase): """ Test that the wsgi.file_wrapper works for the builting server. """ def test_file_wrapper_uses_sendfile(self): env = {'SERVER_PROTOCOL': 'HTTP/1.0'} err = StringIO() handler = FileWrapperHandler(None, StringIO(), err, env) handler.run(wsgi_app_file_wrapper) self.assert_(handler._used_sendfile) def test_file_wrapper_no_sendfile(self): env = {'SERVER_PROTOCOL': 'HTTP/1.0'} err = StringIO() handler = FileWrapperHandler(None, StringIO(), err, env) handler.run(wsgi_app) self.failIf(handler._used_sendfile) self.assertEqual(handler.stdout.getvalue().splitlines()[-1],'Hello World!')