def test_using_gzip_if_header_present_and_file_available(loop):
    request = make_mocked_request(
        'GET', URL('http://python.org/logo.png'), headers={
            hdrs.ACCEPT_ENCODING: 'gzip'
        }
    )

    gz_filepath = mock.Mock()
    gz_filepath.open = mock.mock_open()
    gz_filepath.is_file.return_value = True
    gz_filepath.stat.return_value = mock.MagicMock()
    gz_filepath.stat.st_size = 1024

    filepath = mock.Mock()
    filepath.name = 'logo.png'
    filepath.open = mock.mock_open()
    filepath.with_name.return_value = gz_filepath

    file_sender = FileSender()
    file_sender._sendfile = make_mocked_coro(None)

    loop.run_until_complete(file_sender.send(request, filepath))

    assert not filepath.open.called
    assert gz_filepath.open.called
def test__sendfile_cb_return_on_cancelling(loop):
    fake_loop = mock.Mock()
    with mock.patch('aiohttp.file_sender.os') as m_os:
        out_fd = 30
        in_fd = 31
        fut = helpers.create_future(loop)
        fut.cancel()
        file_sender = FileSender()
        file_sender._sendfile_cb(fut, out_fd, in_fd, 0, 100, fake_loop, False)
        assert fut.done()
        assert not fake_loop.add_writer.called
        assert not fake_loop.remove_writer.called
        assert not m_os.sendfile.called
def test_static_handle_eof(loop):
    fake_loop = mock.Mock()
    with mock.patch('aiohttp.file_sender.os') as m_os:
        out_fd = 30
        in_fd = 31
        fut = helpers.create_future(loop)
        m_os.sendfile.return_value = 0
        file_sender = FileSender()
        file_sender._sendfile_cb(fut, out_fd, in_fd, 0, 100, fake_loop, False)
        m_os.sendfile.assert_called_with(out_fd, in_fd, 0, 100)
        assert fut.done()
        assert fut.result() is None
        assert not fake_loop.add_writer.called
        assert not fake_loop.remove_writer.called
def test_static_handle_exception(loop):
    fake_loop = mock.Mock()
    with mock.patch('aiohttp.file_sender.os') as m_os:
        out_fd = 30
        in_fd = 31
        fut = helpers.create_future(loop)
        exc = OSError()
        m_os.sendfile.side_effect = exc
        file_sender = FileSender()
        file_sender._sendfile_cb(fut, out_fd, in_fd, 0, 100, fake_loop, False)
        m_os.sendfile.assert_called_with(out_fd, in_fd, 0, 100)
        assert fut.done()
        assert exc is fut.exception()
        assert not fake_loop.add_writer.called
        assert not fake_loop.remove_writer.called
def test_static_handle_again(loop):
    fake_loop = mock.Mock()
    with mock.patch('aiohttp.file_sender.os') as m_os:
        out_fd = 30
        in_fd = 31
        fut = helpers.create_future(loop)
        m_os.sendfile.side_effect = BlockingIOError()
        file_sender = FileSender()
        file_sender._sendfile_cb(fut, out_fd, in_fd, 0, 100, fake_loop, False)
        m_os.sendfile.assert_called_with(out_fd, in_fd, 0, 100)
        assert not fut.done()
        fake_loop.add_writer.assert_called_with(out_fd,
                                                file_sender._sendfile_cb,
                                                fut, out_fd, in_fd, 0, 100,
                                                fake_loop, True)
        assert not fake_loop.remove_writer.called
Пример #6
0
def test_gzip_if_header_not_present_and_file_not_available(loop):
    request = make_mocked_request(
        'GET', 'http://python.org/logo.png', headers={
        }
    )

    gz_filepath = mock.Mock()
    gz_filepath.open = mock.mock_open()
    gz_filepath.is_file.return_value = False

    filepath = mock.Mock()
    filepath.name = 'logo.png'
    filepath.open = mock.mock_open()
    filepath.with_name.return_value = gz_filepath
    filepath.stat.return_value = mock.MagicMock()
    filepath.stat.st_size = 1024

    file_sender = FileSender()
    file_sender._sendfile = make_mocked_coro(None)

    loop.run_until_complete(file_sender.send(request, filepath))

    assert filepath.open.called
    assert not gz_filepath.open.called
def test_env_nosendfile():
    with mock.patch.dict(os.environ, {'AIOHTTP_NOSENDFILE': '1'}):
        file_sender = FileSender()
        assert file_sender._sendfile == file_sender._sendfile_fallback
Пример #8
0
async def root(request):
    fs = FileSender()
    path = Path('bark_spider/static/index.html')
    result = await fs.send(request, path)
    return result
Пример #9
0
 def f(*args, **kwargs):
     route = add_static(*args, **kwargs)
     file_sender = FileSender()
     file_sender._sendfile = file_sender._sendfile_fallback
     return route
Пример #10
0
 def maker(*args, **kwargs):
     ret = FileSender(*args, **kwargs)
     if request.param == 'fallback':
         ret._sendfile = ret._sendfile_fallback
     return ret
Пример #11
0
 def maker(*args, **kwargs):
     ret = FileSender(*args, **kwargs)
     if request.param == 'fallback':
         ret._sendfile = ret._sendfile_fallback
     return ret
 def f(*args, **kwargs):
     route = add_static(*args, **kwargs)
     file_sender = FileSender()
     file_sender._sendfile = file_sender._sendfile_fallback
     return route
Пример #13
0
        @asyncio.coroutine
        def sendfile(request, resp, fobj, count):
            """Sendfile that includes a cache header."""
            if not request.app[KEY_DEVELOPMENT]:
                cache_time = 31 * 86400  # = 1 month
                resp.headers[hdrs.CACHE_CONTROL] = "public, max-age={}".format(
                    cache_time)

            yield from orig_sendfile(request, resp, fobj, count)

        # Overwriting like this because __init__ can change implementation.
        self._sendfile = sendfile


FILE_SENDER = FileSender()
CACHING_FILE_SENDER = CachingFileSender()


@asyncio.coroutine
def staticresource_middleware(app, handler):
    """Enhance StaticResourceHandler middleware.

    Adds gzip encoding and fingerprinting matching.
    """
    inst = getattr(handler, '__self__', None)
    if not isinstance(inst, StaticResource):
        return handler

    # pylint: disable=protected-access
    inst._file_sender = CACHING_FILE_SENDER