def _make_request(self, *args, **kwargs):
     httplib_response = httplib.HTTPResponse(MockSock)
     httplib_response.fp = MockChunkedEncodingResponse(
         [b"f", b"o", b"o"])
     httplib_response.headers = httplib_response.msg = HTTPHeaderDict(
     )
     return httplib_response
Пример #2
0
    def test_io(self):
        fp = BytesIO(b'foo')
        resp = HTTPResponse(fp, preload_content=False)

        self.assertEqual(resp.closed, False)
        self.assertEqual(resp.readable(), True)
        self.assertEqual(resp.writable(), False)
        self.assertRaises(IOError, resp.fileno)

        resp.close()
        self.assertEqual(resp.closed, True)

        # Try closing with an `httplib.HTTPResponse`, because it has an
        # `isclosed` method.
        sock = socket.socket()
        self.addCleanup(sock.close)
        hlr = httplib.HTTPResponse(sock)
        self.addCleanup(hlr.close)
        resp2 = HTTPResponse(hlr, preload_content=False)
        self.assertEqual(resp2.closed, False)
        resp2.close()
        self.assertEqual(resp2.closed, True)

        # also try when only data is present.
        resp3 = HTTPResponse('foodata')
        self.assertRaises(IOError, resp3.fileno)

        resp3._fp = 2
        # A corner case where _fp is present but doesn't have `closed`,
        # `isclosed`, or `fileno`.  Unlikely, but possible.
        self.assertEqual(resp3.closed, True)
        self.assertRaises(IOError, resp3.fileno)
Пример #3
0
    def test_io(self, sock):
        fp = BytesIO(b"foo")
        resp = HTTPResponse(fp, preload_content=False)

        assert not resp.closed
        assert resp.readable()
        assert not resp.writable()
        with pytest.raises(IOError):
            resp.fileno()

        resp.close()
        assert resp.closed

        # Try closing with an `httplib.HTTPResponse`, because it has an
        # `isclosed` method.
        try:
            hlr = httplib.HTTPResponse(sock)
            resp2 = HTTPResponse(hlr, preload_content=False)
            assert not resp2.closed
            resp2.close()
            assert resp2.closed
        finally:
            hlr.close()

        # also try when only data is present.
        resp3 = HTTPResponse("foodata")
        with pytest.raises(IOError):
            resp3.fileno()

        resp3._fp = 2
        # A corner case where _fp is present but doesn't have `closed`,
        # `isclosed`, or `fileno`.  Unlikely, but possible.
        assert resp3.closed
        with pytest.raises(IOError):
            resp3.fileno()
 def __call__(self, *args, **kwargs):
     if self._ex:
         ex, self._ex = self._ex, None
         raise ex()
     response = httplib.HTTPResponse(MockSock)
     response.fp = MockChunkedEncodingResponse([b"f", b"o", b"o"])
     response.headers = response.msg = HTTPHeaderDict()
     return response
Пример #5
0
 def test_invalid_chunks(self):
     stream = [b"foooo", b"bbbbaaaaar"]
     fp = MockChunkedInvalidEncoding(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     self.assertRaises(ProtocolError, next, resp.read_chunked())
Пример #6
0
 def test_chunked_response_with_extensions(self):
     stream = [b"foo", b"bar"]
     fp = MockChunkedEncodingWithExtensions(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     assert stream == list(resp.stream())
Пример #7
0
 def test_mock_transfer_encoding_chunked_unlmtd_read(self):
     stream = [b"foooo", b"bbbbaaaaar"]
     fp = MockChunkedEncodingResponse(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     assert stream == list(resp.read_chunked())
Пример #8
0
    def test_mock_transfer_encoding_chunked(self):
        stream = [b"fo", b"o", b"bar"]
        fp = MockChunkedEncodingResponse(stream)
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})

        for i, c in enumerate(resp.stream()):
            assert c == stream[i]
Пример #9
0
 def test_mock_transfer_encoding_chunked_custom_read(self):
     stream = [b"foooo", b"bbbbaaaaar"]
     fp = MockChunkedEncodingResponse(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     expected_response = [b'fo', b'oo', b'o', b'bb', b'bb', b'aa', b'aa', b'ar']
     response = list(resp.read_chunked(2))
     assert expected_response == response
Пример #10
0
 def test_chunked_response_without_crlf_on_end(self):
     stream = [b"foo", b"bar", b"baz"]
     fp = MockChunkedEncodingWithoutCRLFOnEnd(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(
         r, preload_content=False, headers={"transfer-encoding": "chunked"}
     )
     assert stream == list(resp.stream())
Пример #11
0
    def test_mock_transfer_encoding_chunked(self):
        stream = [b"fo", b"o", b"bar"]
        fp = MockChunkedEncodingResponse(stream)
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})

        i = 0
        for c in resp.stream():
            self.assertEqual(c, stream[i])
            i += 1
Пример #12
0
 def test_invalid_chunks(self):
     stream = [b"foooo", b"bbbbaaaaar"]
     fp = MockChunkedInvalidEncoding(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(
         r, preload_content=False, headers={"transfer-encoding": "chunked"}
     )
     with pytest.raises(ProtocolError):
         next(resp.read_chunked())
Пример #13
0
 def test_chunked_response_with_extensions(self):
     stream = [b"foo", b"bar"]
     fp = MockChunkedEncodingWithExtensions(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     if getattr(self, "assertListEqual", False):
         self.assertListEqual(stream, list(resp.stream()))
     else:
         for index, item in enumerate(resp.stream()):
             v = stream[index]
             self.assertEqual(item, v)
Пример #14
0
    def test_io_closed_consistently(self):
        hlr = httplib.HTTPResponse(socket.socket())
        hlr.fp = BytesIO(b'foo')
        hlr.chunked = 0
        hlr.length = 3
        resp = HTTPResponse(hlr, preload_content=False)

        self.assertEqual(resp.closed, False)
        self.assertEqual(resp._fp.isclosed(), False)
        self.assertEqual(is_fp_closed(resp._fp), False)
        resp.read()
        self.assertEqual(resp.closed, True)
        self.assertEqual(resp._fp.isclosed(), True)
        self.assertEqual(is_fp_closed(resp._fp), True)
Пример #15
0
    def test_chunked_head_response(self):
        r = httplib.HTTPResponse(MockSock, method='HEAD')
        r.chunked = True
        r.chunk_left = None
        resp = HTTPResponse('',
                            preload_content=False,
                            headers={'transfer-encoding': 'chunked'},
                            original_response=r)
        assert resp.chunked is True

        resp.supports_chunked_reads = lambda: True
        resp.release_conn = mock.Mock()
        for _ in resp.stream():
            continue
        resp.release_conn.assert_called_once_with()
Пример #16
0
    def test_incomplete_chunk(self):
        stream = [b"foooo", b"bbbbaaaaar"]
        fp = MockChunkedIncompleteRead(stream)
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        r.chunked = True
        r.chunk_left = None
        resp = HTTPResponse(r,
                            preload_content=False,
                            headers={"transfer-encoding": "chunked"})
        with pytest.raises(ProtocolError) as ctx:
            next(resp.read_chunked())

        orig_ex = ctx.value.args[1]
        assert isinstance(orig_ex, httplib_IncompleteRead)
Пример #17
0
 def test_io_closed_consistently(self, sock):
     try:
         hlr = httplib.HTTPResponse(sock)
         hlr.fp = BytesIO(b'foo')
         hlr.chunked = 0
         hlr.length = 3
         with HTTPResponse(hlr, preload_content=False) as resp:
             assert not resp.closed
             assert not resp._fp.isclosed()
             assert not is_fp_closed(resp._fp)
             resp.read()
             assert resp.closed
             assert resp._fp.isclosed()
             assert is_fp_closed(resp._fp)
     finally:
         hlr.close()
Пример #18
0
    def test_invalid_chunk_length(self):
        stream = [b"foooo", b"bbbbaaaaar"]
        fp = MockChunkedInvalidChunkLength(stream)
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        r.chunked = True
        r.chunk_left = None
        resp = HTTPResponse(r,
                            preload_content=False,
                            headers={"transfer-encoding": "chunked"})
        with pytest.raises(ProtocolError) as ctx:
            next(resp.read_chunked())

        orig_ex = ctx.value.args[1]
        assert isinstance(orig_ex, InvalidChunkLength)
        assert orig_ex.length == six.b(fp.BAD_LENGTH_LINE)
Пример #19
0
 def test_mock_transfer_encoding_chunked_custom_read(self):
     stream = [b"foooo", b"bbbbaaaaar"]
     fp = MockChunkedEncodingResponse(stream)
     r = httplib.HTTPResponse(MockSock)
     r.fp = fp
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r, preload_content=False, headers={'transfer-encoding': 'chunked'})
     expected_response = [b'fo', b'oo', b'o', b'bb', b'bb', b'aa', b'aa', b'ar']
     response = list(resp.read_chunked(2))
     if getattr(self, "assertListEqual", False):
         self.assertListEqual(expected_response, response)
     else:
         for index, item in enumerate(response):
             v = expected_response[index]
             self.assertEqual(item, v)
Пример #20
0
    def test__iter__decode_content(self):
        def stream():
            # Set up a generator to chunk the gzipped body
            compress = zlib.compressobj(6, zlib.DEFLATED, 16 + zlib.MAX_WBITS)
            data = compress.compress(b"foo\nbar")
            data += compress.flush()
            for i in range(0, len(data), 2):
                yield data[i : i + 2]

        fp = MockChunkedEncodingResponse(list(stream()))
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        headers = {"transfer-encoding": "chunked", "content-encoding": "gzip"}
        resp = HTTPResponse(r, preload_content=False, headers=headers)

        data = b""
        for c in resp:
            data += c

        assert b"foo\nbar" == data
Пример #21
0
    def test_mock_gzipped_transfer_encoding_chunked_decoded(self):
        """Show that we can decode the gizpped and chunked body."""
        def stream():
            # Set up a generator to chunk the gzipped body
            compress = zlib.compressobj(6, zlib.DEFLATED, 16 + zlib.MAX_WBITS)
            data = compress.compress(b'foobar')
            data += compress.flush()
            for i in range(0, len(data), 2):
                yield data[i:i + 2]

        fp = MockChunkedEncodingResponse(list(stream()))
        r = httplib.HTTPResponse(MockSock)
        r.fp = fp
        headers = {'transfer-encoding': 'chunked', 'content-encoding': 'gzip'}
        resp = HTTPResponse(r, preload_content=False, headers=headers)

        data = b''
        for c in resp.stream(decode_content=True):
            data += c

        assert b'foobar' == data