Esempio n. 1
0
async def test_json_invalid_content_type(loop: Any, session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._headers = {"Content-Type": "data/octet-stream"}
    response._body = b""

    with pytest.raises(aiohttp.ContentTypeError) as info:
        await response.json()

    assert info.value.request_info == response.request_info
Esempio n. 2
0
async def test_release(loop: Any, session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    fut = loop.create_future()
    fut.set_result(b"")
    content = response.content = mock.Mock()
    content.readany.return_value = fut

    response.release()
    assert response._connection is None
Esempio n. 3
0
async def test_response_eof_upgraded(loop: Any, session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )

    conn = response._connection = mock.Mock()
    conn.protocol.upgraded = True

    response._response_eof()
    assert not conn.release.called
    assert response._connection is conn
Esempio n. 4
0
def test_response_links_no_rel(loop: Any, session: Any) -> None:
    url = URL("http://def-cl-resp.org/")
    response = ClientResponse(
        "get",
        url,
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._headers = CIMultiDict([("Link", "<http://example.com/>")])
    assert response.links == {
        "http://example.com/": {
            "url": URL("http://example.com/")
        }
    }
Esempio n. 5
0
def test_response_not_closed_after_get_ok(mocker) -> None:
    response = ClientResponse(
        "get",
        URL("http://del-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=mock.Mock(),
        session=mock.Mock(),
    )
    response.status = 400
    response.reason = "Bad Request"
    response._closed = False
    spy = mocker.spy(response, "raise_for_status")
    assert not response.ok
    assert not response.closed
    assert spy.call_count == 0
Esempio n. 6
0
def client_response(loop, session):
    """Fixture to return a mocked client response."""

    r = aiohttp.ClientResponse(
        'get',
        URL('http://synse-response.io'),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )

    r.content = mock.Mock()
    r._headers = {'Content-Type': 'application/json'}

    return r
Esempio n. 7
0
        def cb():
            fut = asyncio.Future(loop=self._loop)
            resp = ClientResponse('GET',
                                  yarl.URL('foo'),
                                  writer=Mock(),
                                  timer=TimerNoop(),
                                  continue100=None,
                                  request_info=Mock(),
                                  traces=[],
                                  loop=self._loop,
                                  session=Mock())
            resp.status = status

            # setting this as aiohttp 3.5.4 is now checking if this value is not None
            # see aiohttp/client_reqrep.py:934
            resp.reason = http.client.responses[status]

            fut.set_result(resp)
            return fut
Esempio n. 8
0
def test_content_disposition_full() -> None:
    response = ClientResponse('get',
                              URL('http://def-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=mock.Mock(),
                              session=mock.Mock())
    response._headers = {
        'Content-Disposition': 'attachment; filename="archive.tar.gz"; foo=bar'
    }

    assert 'attachment' == response.content_disposition.type
    assert 'bar' == response.content_disposition.parameters["foo"]
    assert 'archive.tar.gz' == response.content_disposition.filename
    with pytest.raises(TypeError):
        response.content_disposition.parameters["foo"] = "baz"
Esempio n. 9
0
    def test_https_connect_resp_start_error(self, ClientRequestMock):
        proxy_req = ClientRequest('GET',
                                  URL('http://proxy.example.com'),
                                  loop=self.loop)
        ClientRequestMock.return_value = proxy_req

        proxy_resp = ClientResponse('get',
                                    URL('http://proxy.example.com'),
                                    request_info=mock.Mock(),
                                    writer=mock.Mock(),
                                    continue100=None,
                                    timer=TimerNoop(),
                                    auto_decompress=True,
                                    traces=[],
                                    loop=self.loop,
                                    session=mock.Mock())
        proxy_req.send = make_mocked_coro(proxy_resp)
        proxy_resp.start = make_mocked_coro(
            raise_exception=OSError("error message"))

        connector = aiohttp.TCPConnector(loop=self.loop)
        connector._resolve_host = make_mocked_coro([{
            'hostname': 'hostname',
            'host': '127.0.0.1',
            'port': 80,
            'family': socket.AF_INET,
            'proto': 0,
            'flags': 0
        }])

        tr, proto = mock.Mock(), mock.Mock()
        tr.get_extra_info.return_value = None
        self.loop.create_connection = make_mocked_coro((tr, proto))

        req = ClientRequest(
            'GET',
            URL('https://www.python.org'),
            proxy=URL('http://proxy.example.com'),
            loop=self.loop,
        )
        with self.assertRaisesRegex(OSError, "error message"):
            self.loop.run_until_complete(connector._create_connection(req))
Esempio n. 10
0
    async def request(self, *args, **kwargs) -> ClientResponse:
        try:
            data = self.requests.pop(0)
            response = ClientResponse('get',
                                      URL('http://def-cl-resp.org'),
                                      request_info=mock.Mock(),
                                      writer=mock.Mock(),
                                      continue100=None,
                                      timer=TimerNoop(),
                                      traces=[],
                                      loop=asyncio.get_running_loop(),
                                      session=mock.Mock())
            response.status = 200
            response._body = data
            response._headers = {'Content-Type': 'application/json'}
            return response

        except IndexError as e:
            print(f'error in pop requests')
            raise Exception(str(e)) from e
Esempio n. 11
0
async def test_read_and_release_connection_with_error(loop: Any,
                                                      session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    content = response.content = mock.Mock()
    content.read.return_value = loop.create_future()
    content.read.return_value.set_exception(ValueError)

    with pytest.raises(ValueError):
        await response.read()
    assert response._closed
Esempio n. 12
0
async def test_response_eof_after_connection_detach(loop: Any,
                                                    session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._closed = False
    conn = response._connection = mock.Mock()
    conn.protocol = None

    response._response_eof()
    assert conn.release.called
    assert response._connection is None
def test_response_links_quoted(loop, session):
    url = URL('http://def-cl-resp.org/')
    response = ClientResponse('get',
                              url,
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)
    response.headers = CIMultiDict([
        ("Link", '<http://example.com/>; rel="home-page"'),
    ])
    assert (response.links == {
        'home-page': {
            'url': URL('http://example.com/'),
            'rel': 'home-page'
        }
    })
Esempio n. 14
0
async def test_json_custom_loader(loop: Any, session: Any) -> None:
    response = ClientResponse(
        "get",
        URL("http://def-cl-resp.org"),
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._headers = {"Content-Type": "application/json;charset=cp1251"}
    response._body = b"data"

    def custom(content):
        return content + "-custom"

    res = await response.json(loads=custom)
    assert res == "data-custom"
def test_response_links_relative(loop, session):
    url = URL('http://def-cl-resp.org/')
    response = ClientResponse('get',
                              url,
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)
    response.headers = CIMultiDict([
        ("Link", '</relative/path>; rel=rel'),
    ])
    assert (response.links == {
        'rel': {
            'url': URL('http://def-cl-resp.org/relative/path'),
            'rel': 'rel'
        }
    })
Esempio n. 16
0
def test_response_request_info() -> None:
    url = 'http://def-cl-resp.org'
    headers = {'Content-Type': 'application/json;charset=cp1251'}
    response = ClientResponse(
        'get', URL(url),
        request_info=RequestInfo(
            url,
            'get',
            headers
        ),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=mock.Mock(),
        session=mock.Mock()
    )
    assert url == response.request_info.url
    assert 'get' == response.request_info.method
    assert headers == response.request_info.headers
Esempio n. 17
0
async def test_read_and_release_connection(loop, session) -> None:
    response = ClientResponse('get', URL('http://def-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)

    def side_effect(*args, **kwargs):
        fut = loop.create_future()
        fut.set_result(b'payload')
        return fut
    content = response.content = mock.Mock()
    content.read.side_effect = side_effect

    res = await response.read()
    assert res == b'payload'
    assert response._connection is None
Esempio n. 18
0
def HTTPResponse(*args, **kw):
    # Dynamically load package
    module = __import__(RESPONSE_PATH, fromlist=(RESPONSE_CLASS, ))
    ClientResponse = getattr(module, RESPONSE_CLASS)

    from aiohttp.helpers import TimerNoop

    kw['request_info'] = m.Mock(
        method=args[0],
        url=args[1],
    )

    kw['writer'] = m.Mock()
    kw['continue100'] = None
    kw['timer'] = TimerNoop()
    kw['traces'] = []
    kw['loop'] = m.Mock()
    kw['session'] = None

    # Return response instance
    return ClientResponse(*args, **kw)
Esempio n. 19
0
 async def build_response(
         self, url: URL
 ) -> 'Union[ClientResponse, Exception]':
     if isinstance(self.exception, Exception):
         return self.exception
     kwargs = {}
     if AIOHTTP_VERSION >= StrictVersion('3.1.0'):
         loop = Mock()
         loop.get_debug = Mock()
         loop.get_debug.return_value = True
         kwargs['request_info'] = Mock()
         kwargs['writer'] = Mock()
         kwargs['continue100'] = None
         kwargs['timer'] = TimerNoop()
         if AIOHTTP_VERSION >= StrictVersion('3.3.0'):
             pass
         else:
             kwargs['auto_decompress'] = True
         kwargs['traces'] = []
         kwargs['loop'] = loop
         kwargs['session'] = None
     resp = self.response_class(self.method, url, **kwargs)
     # we need to initialize headers manually
     headers = CIMultiDict({hdrs.CONTENT_TYPE: self.content_type})
     if self.headers:
         headers.update(self.headers)
     raw_headers = self._build_raw_headers(headers)
     if AIOHTTP_VERSION >= StrictVersion('3.3.0'):
         # Reified attributes
         resp._headers = headers
         resp._raw_headers = raw_headers
     else:
         resp.headers = headers
         resp.raw_headers = raw_headers
     resp.status = self.status
     resp.reason = self.reason
     resp.content = stream_reader_factory()
     resp.content.feed_data(self.body)
     resp.content.feed_eof()
     return resp
Esempio n. 20
0
    def build_response(self, method: str, url: str, payload: str, *,
                       session: ClientSession, status: int) -> ClientResponse:
        response = session._response_class(
            method,
            URL(url),
            request_info=self.mock_module.Mock(),
            writer=self.mock_module.Mock(),
            continue100=None,
            timer=TimerNoop(),
            traces=[],
            loop=session.loop,
            session=session)
        response._headers = CIMultiDictProxy(
            CIMultiDict({'Content-Type': 'application/json'}))
        response.status = status
        if status >= 400:
            response.reason = payload

        response.content = StreamReader(ResponseHandler(session.loop))
        response.content.feed_data(str.encode(payload))
        response.content.feed_eof()
        return response
Esempio n. 21
0
def test_response_links_relative(loop: Any, session: Any) -> None:
    url = URL("http://def-cl-resp.org/")
    response = ClientResponse(
        "get",
        url,
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._headers = CIMultiDict([
        ("Link", "</relative/path>; rel=rel"),
    ])
    assert response.links == {
        "rel": {
            "url": URL("http://def-cl-resp.org/relative/path"),
            "rel": "rel"
        }
    }
Esempio n. 22
0
def test_response_links_quoted(loop, session) -> None:
    url = URL("http://def-cl-resp.org/")
    response = ClientResponse(
        "get",
        url,
        request_info=mock.Mock(),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session,
    )
    response._headers = CIMultiDict([
        ("Link", '<http://example.com/>; rel="home-page"'),
    ])
    assert response.links == {
        "home-page": {
            "url": URL("http://example.com/"),
            "rel": "home-page"
        }
    }
async def test_json_custom_content_type(loop, session):
    response = ClientResponse('get',
                              URL('http://def-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)

    def side_effect(*args, **kwargs):
        fut = loop.create_future()
        fut.set_result('{"тест": "пройден"}'.encode('cp1251'))
        return fut

    response.headers = {'Content-Type': 'custom/type;charset=cp1251'}
    content = response.content = mock.Mock()
    content.read.side_effect = side_effect

    res = await response.json(content_type='custom/type')
    assert res == {'тест': 'пройден'}
    assert response._connection is None
Esempio n. 24
0
def test_response_links_no_rel(loop, session) -> None:
    url = URL('http://def-cl-resp.org/')
    response = ClientResponse('get', url,
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)
    response._headers = CIMultiDict([
        (
            "Link",
            '<http://example.com/>'
        )
    ])
    assert (
        response.links ==
        {
            'http://example.com/':
            {'url': URL('http://example.com/')}
        }
    )
Esempio n. 25
0
async def test_text_after_read(loop, session) -> None:
    response = ClientResponse('get',
                              URL('http://def-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)

    def side_effect(*args, **kwargs):
        fut = loop.create_future()
        fut.set_result('{"тест": "пройден"}'.encode('cp1251'))
        return fut

    response._headers = {'Content-Type': 'application/json;charset=cp1251'}
    content = response.content = mock.Mock()
    content.read.side_effect = side_effect

    res = await response.text()
    assert res == '{"тест": "пройден"}'
    assert response._connection is None
Esempio n. 26
0
def test_no_redirect_history_in_exception() -> None:
    url = 'http://def-cl-resp.org'
    headers = {'Content-Type': 'application/json;charset=cp1251'}
    response = ClientResponse(
        'get',
        URL(url),
        request_info=RequestInfo(
            url,
            'get',
            headers
        ),
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=mock.Mock(),
        session=mock.Mock()
    )
    response.status = 409
    response.reason = 'CONFLICT'
    with pytest.raises(aiohttp.ClientResponseError) as cm:
        response.raise_for_status()
    assert () == cm.value.history
Esempio n. 27
0
async def test_http_processing_error(session) -> None:
    loop = mock.Mock()
    request_info = mock.Mock()
    response = ClientResponse(
        'get', URL('http://del-cl-resp.org'), request_info=request_info,
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        traces=[],
        loop=loop,
        session=session)
    loop.get_debug = mock.Mock()
    loop.get_debug.return_value = True

    connection = mock.Mock()
    connection.protocol = aiohttp.DataQueue(loop)
    connection.protocol.set_response_params = mock.Mock()
    connection.protocol.set_exception(http.HttpProcessingError())

    with pytest.raises(aiohttp.ClientResponseError) as info:
        await response.start(connection)

    assert info.value.request_info is request_info
Esempio n. 28
0
def test_del(session) -> None:
    loop = mock.Mock()
    response = ClientResponse('get', URL('http://del-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)
    loop.get_debug = mock.Mock()
    loop.get_debug.return_value = True

    connection = mock.Mock()
    response._closed = False
    response._connection = connection
    loop.set_exception_handler(lambda loop, ctx: None)

    with pytest.warns(ResourceWarning):
        del response
        gc.collect()

    connection.release.assert_called_with()
Esempio n. 29
0
async def test_response_read_triggers_callback(loop: Any,
                                               session: Any) -> None:
    trace = mock.Mock()
    trace.send_response_chunk_received = make_mocked_coro()
    response_method = "get"
    response_url = URL("http://def-cl-resp.org")
    response_body = b"This is response"

    response = ClientResponse(
        response_method,
        response_url,
        request_info=mock.Mock,
        writer=mock.Mock(),
        continue100=None,
        timer=TimerNoop(),
        loop=loop,
        session=session,
        traces=[trace],
    )

    def side_effect(*args, **kwargs):
        fut = loop.create_future()
        fut.set_result(response_body)
        return fut

    response._headers = {"Content-Type": "application/json;charset=cp1251"}
    content = response.content = mock.Mock()
    content.read.side_effect = side_effect

    res = await response.read()
    assert res == response_body
    assert response._connection is None

    assert trace.send_response_chunk_received.called
    assert trace.send_response_chunk_received.call_args == mock.call(
        response_method, response_url, response_body)
Esempio n. 30
0
async def test_text_detect_encoding_if_invalid_charset(loop, session) -> None:
    response = ClientResponse('get', URL('http://def-cl-resp.org'),
                              request_info=mock.Mock(),
                              writer=mock.Mock(),
                              continue100=None,
                              timer=TimerNoop(),
                              traces=[],
                              loop=loop,
                              session=session)

    def side_effect(*args, **kwargs):
        fut = loop.create_future()
        fut.set_result('{"тест": "пройден"}'.encode('cp1251'))
        return fut

    response._headers = {'Content-Type': 'text/plain;charset=invalid'}
    content = response.content = mock.Mock()
    content.read.side_effect = side_effect

    await response.read()
    res = await response.text()
    assert res == '{"тест": "пройден"}'
    assert response._connection is None
    assert response.get_encoding().lower() in ('windows-1251', 'maccyrillic')