Exemplo n.º 1
0
    def test_cannot_send_headers_after_eof(self):
        req = self.make_request('GET', '/')
        resp = StreamResponse(req)

        resp.send_headers()
        resp.write_eof()
        with self.assertRaises(RuntimeError):
            resp.send_headers()
Exemplo n.º 2
0
    def test_cannot_send_headers_after_eof(self):
        req = self.make_request('GET', '/')
        resp = StreamResponse(req)

        resp.send_headers()
        resp.write_eof()
        with self.assertRaises(RuntimeError):
            resp.send_headers()
Exemplo n.º 3
0
    def test_cannot_write_eof_twice(self):
        resp = StreamResponse()
        resp.start(self.make_request('GET', '/'))

        resp.write(b'data')
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.assertTrue(self.writer.write.called)

        self.writer.write.reset_mock()
        self.loop.run_until_complete(resp.write_eof())
        self.assertFalse(self.writer.write.called)
Exemplo n.º 4
0
    def test_cannot_write_eof_twice(self):
        resp = StreamResponse()
        self.loop.run_until_complete(resp.prepare(self.make_request("GET", "/")))

        resp.write(b"data")
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.assertTrue(self.writer.write.called)

        self.writer.write.reset_mock()
        self.loop.run_until_complete(resp.write_eof())
        self.assertFalse(self.writer.write.called)
Exemplo n.º 5
0
    def test_cannot_write_eof_twice(self):
        resp = StreamResponse()
        resp.start(self.make_request('GET', '/'))

        resp.write(b'data')
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.assertTrue(self.writer.write.called)

        self.writer.write.reset_mock()
        self.loop.run_until_complete(resp.write_eof())
        self.assertFalse(self.writer.write.called)
Exemplo n.º 6
0
def test_cannot_write_eof_twice():
    resp = StreamResponse()
    writer = mock.Mock()
    yield from resp.prepare(make_request('GET', '/', writer=writer))

    resp.write(b'data')
    writer.drain.return_value = ()
    yield from resp.write_eof()
    assert writer.write.called

    writer.write.reset_mock()
    yield from resp.write_eof()
    assert not writer.write.called
Exemplo n.º 7
0
def test_cannot_write_eof_twice():
    resp = StreamResponse()
    writer = mock.Mock()
    yield from resp.prepare(make_request('GET', '/', writer=writer))

    resp.write(b'data')
    writer.drain.return_value = ()
    yield from resp.write_eof()
    assert writer.write.called

    writer.write.reset_mock()
    yield from resp.write_eof()
    assert not writer.write.called
Exemplo n.º 8
0
def test_cannot_write_eof_twice():
    resp = StreamResponse()
    writer = mock.Mock()
    resp_impl = yield from resp.prepare(make_request('GET', '/'))
    resp_impl.write = mock.Mock()
    resp_impl.write_eof = mock.Mock()
    resp_impl.write_eof.return_value = ()

    resp.write(b'data')
    assert resp_impl.write.called

    yield from resp.write_eof()

    resp_impl.write.reset_mock()
    yield from resp.write_eof()
    assert not writer.write.called
Exemplo n.º 9
0
def test_cannot_write_eof_twice():
    resp = StreamResponse()
    writer = mock.Mock()
    resp_impl = yield from resp.prepare(make_request('GET', '/'))
    resp_impl.write = mock.Mock()
    resp_impl.write_eof = mock.Mock()
    resp_impl.write_eof.return_value = ()

    resp.write(b'data')
    assert resp_impl.write.called

    yield from resp.write_eof()

    resp_impl.write.reset_mock()
    yield from resp.write_eof()
    assert not writer.write.called
Exemplo n.º 10
0
def hello(request):
    resp = StreamResponse(request)
    name = request.match_info.get('name', 'Anonimous')
    answer = ('Hello, ' + name).encode('utf8')
    resp.content_length = len(answer)
    resp.send_headers()
    resp.write(answer)
    yield from resp.write_eof()
    return resp
Exemplo n.º 11
0
def hello(request):
    resp = StreamResponse()
    name = request.match_info.get('name', 'Anonymous')
    answer = ('Hello, ' + name).encode('utf8')
    resp.content_length = len(answer)
    resp.start(request)
    resp.write(answer)
    yield from resp.write_eof()
    return resp
Exemplo n.º 12
0
def test___repr___after_eof():
    resp = StreamResponse()
    yield from resp.prepare(make_request('GET', '/'))

    assert resp.prepared

    resp.write(b'data')
    yield from resp.write_eof()
    assert not resp.prepared
    resp_repr = repr(resp)
    assert resp_repr == '<StreamResponse OK eof>'
Exemplo n.º 13
0
def test___repr___after_eof():
    resp = StreamResponse()
    yield from resp.prepare(make_request('GET', '/'))

    assert resp.prepared

    resp.write(b'data')
    yield from resp.write_eof()
    assert not resp.prepared
    resp_repr = repr(resp)
    assert resp_repr == '<StreamResponse OK eof>'
Exemplo n.º 14
0
    def test_cannot_write_after_eof(self):
        resp = StreamResponse()
        self.loop.run_until_complete(resp.prepare(self.make_request("GET", "/")))

        resp.write(b"data")
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.writer.write.reset_mock()

        with self.assertRaises(RuntimeError):
            resp.write(b"next data")
        self.assertFalse(self.writer.write.called)
Exemplo n.º 15
0
    def test_cannot_write_after_eof(self):
        resp = StreamResponse()
        resp.start(self.make_request('GET', '/'))

        resp.write(b'data')
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.writer.write.reset_mock()

        with self.assertRaises(RuntimeError):
            resp.write(b'next data')
        self.assertFalse(self.writer.write.called)
Exemplo n.º 16
0
    def test_cannot_write_after_eof(self):
        resp = StreamResponse()
        resp.start(self.make_request('GET', '/'))

        resp.write(b'data')
        self.writer.drain.return_value = ()
        self.loop.run_until_complete(resp.write_eof())
        self.writer.write.reset_mock()

        with self.assertRaises(RuntimeError):
            resp.write(b'next data')
        self.assertFalse(self.writer.write.called)
Exemplo n.º 17
0
def test_repr_after_eof():
    resp = StreamResponse()
    writer = mock.Mock()
    yield from resp.prepare(make_request('GET', '/', writer=writer))

    assert resp.prepared

    resp.write(b'data')
    writer.drain.return_value = ()
    yield from resp.write_eof()
    assert not resp.prepared
    resp_repr = repr(resp)
    assert resp_repr == '<StreamResponse OK not started>'
Exemplo n.º 18
0
def test_cannot_write_after_eof():
    resp = StreamResponse()
    writer = mock.Mock()
    yield from resp.prepare(make_request('GET', '/', writer=writer))

    resp.write(b'data')
    writer.drain.return_value = ()
    yield from resp.write_eof()
    writer.write.reset_mock()

    with pytest.raises(RuntimeError):
        resp.write(b'next data')
    assert not writer.write.called
Exemplo n.º 19
0
def test_cannot_write_after_eof():
    resp = StreamResponse()
    writer = mock.Mock()
    yield from resp.prepare(make_request('GET', '/', writer=writer))

    resp.write(b'data')
    writer.drain.return_value = ()
    yield from resp.write_eof()
    writer.write.reset_mock()

    with pytest.raises(RuntimeError):
        resp.write(b'next data')
    assert not writer.write.called
Exemplo n.º 20
0
def test_cannot_write_eof_before_headers():
    resp = StreamResponse()

    with pytest.raises(RuntimeError):
        yield from resp.write_eof()
Exemplo n.º 21
0
class WSGIResponse:

    __slots__ = (
        "_handler",
        "_request",
        "_response",
    )

    def __init__(self, handler, request):
        self._handler = handler
        self._request = request
        # State.
        self._response = None

    def start_response(self, status, headers, exc_info=None):
        if exc_info:
            # Log the error.
            self._request.app.logger.error("Unexpected error",
                                           exc_info=exc_info)
            # Attempt to modify the response.
            try:
                if self._response and self._response.started:
                    raise exc_info[1].with_traceback(exc_info[2])
                self._response = None
            finally:
                exc_info = None
        # Cannot start response twice.
        assert not self._response, "Cannot call start_response() twice"
        # Parse the status.
        assert isinstance(status, str), "Response status should be str"
        status_code, reason = status.split(None, 1)
        status_code = int(status_code)
        # Store the response.
        self._response = StreamResponse(
            status=status_code,
            reason=reason,
        )
        # Store the headers.
        for header_name, header_value in headers:
            assert not is_hop_by_hop(
                header_name), "Hop-by-hop headers are forbidden"
            self._response.headers.add(header_name, header_value)
        # Return the stream writer interface.
        return self.write_threadsafe

    def _write_head(self):
        assert self._response, "Application did not call start_response()"
        if not self._response.started:
            self._response.start(self._request)

    def write(self, data):
        assert isinstance(
            data, (bytes, bytearray, memoryview)), "Data should be bytes"
        self._write_head()
        self._response.write(data)

    @asyncio.coroutine
    def drain(self):
        self._write_head()
        yield from self._response.drain()

    @asyncio.coroutine
    def write_eof(self):
        self._write_head()
        yield from self._response.write_eof()

    def write_threadsafe(self, data):
        with self._handler._lock_for_write():
            self.write(data)
Exemplo n.º 22
0
    def test_cannot_write_eof_before_headers(self):
        resp = StreamResponse()

        with self.assertRaises(RuntimeError):
            self.loop.run_until_complete(resp.write_eof())
Exemplo n.º 23
0
    def test_cannot_write_eof_before_headers(self):
        resp = StreamResponse()

        with self.assertRaises(RuntimeError):
            self.loop.run_until_complete(resp.write_eof())
Exemplo n.º 24
0
def test_cannot_write_eof_before_headers():
    resp = StreamResponse()

    with pytest.raises(RuntimeError):
        yield from resp.write_eof()