Commit 67f9ad28 authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

[1.0.X] Fixed #9659: fixed `wsgi.file_wrapper` in the builtin server. Thanks,...

[1.0.X] Fixed #9659: fixed `wsgi.file_wrapper` in the builtin server. Thanks, mitsuhiko. Backport of [10690] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10691 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 9b724aea
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -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()
+0 −0

Empty file added.

+0 −0

Empty file added.

+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!')