예제 #1
0
 def test_early_eof(self):
     # Test httpresponse with no \r\n termination,
     body = "HTTP/1.1 200 Ok"
     sock = FakeSocket(body)
     resp = client.HTTPResponse(sock)
     resp.begin()
     self.assertEqual(resp.read(), b'')
     self.assertTrue(resp.isclosed())
예제 #2
0
 def test_too_many_headers(self):
     headers = '\r\n'.join('Header%d: foo' % i
                           for i in range(client._MAXHEADERS + 1)) + '\r\n'
     text = ('HTTP/1.1 200 OK\r\n' + headers)
     s = FakeSocket(text)
     r = client.HTTPResponse(s)
     self.assertRaisesRegex(client.HTTPException,
                            r"got more than \d+ headers", r.begin)
예제 #3
0
 def test_chunked_missing_end(self):
     """some servers may serve up a short chunked encoding stream"""
     expected = chunked_expected
     sock = FakeSocket(chunked_start + last_chunk)  #no terminating crlf
     resp = client.HTTPResponse(sock, method="GET")
     resp.begin()
     self.assertEqual(resp.read(), expected)
     resp.close()
예제 #4
0
 def test_overflowing_chunked_line(self):
     body = ('HTTP/1.1 200 OK\r\n'
             'Transfer-Encoding: chunked\r\n\r\n' + '0' * 65536 + 'a\r\n'
             'hello world\r\n'
             '0\r\n')
     resp = client.HTTPResponse(FakeSocket(body))
     resp.begin()
     self.assertRaises(client.LineTooLong, resp.read)
예제 #5
0
    def test_status_lines(self):
        # Test HTTP status lines

        body = "HTTP/1.1 200 Ok\r\n\r\nText"
        sock = FakeSocket(body)
        resp = client.HTTPResponse(sock)
        resp.begin()
        self.assertEqual(resp.read(), b"Text")
        self.assertTrue(resp.isclosed())
        self.assertFalse(resp.closed)
        resp.close()
        self.assertTrue(resp.closed)

        body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
        sock = FakeSocket(body)
        resp = client.HTTPResponse(sock)
        self.assertRaises(client.BadStatusLine, resp.begin)
예제 #6
0
 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
예제 #7
0
    def test_chunked_extension(self):
        extra = '3;foo=bar\r\n' + 'abc\r\n'
        expected = chunked_expected + b'abc'

        sock = FakeSocket(chunked_start + extra + last_chunk_extended + chunked_end)
        resp = client.HTTPResponse(sock, method="GET")
        resp.begin()
        self.assertEqual(resp.read(), expected)
        resp.close()
예제 #8
0
    def test_malformed_headers_coped_with(self):
        # Issue 19996
        body = "HTTP/1.1 200 OK\r\nFirst: val\r\n: nval\r\nSecond: val\r\n\r\n"
        sock = FakeSocket(body)
        resp = client.HTTPResponse(sock)
        resp.begin()

        self.assertEqual(resp.getheader('First'), 'val')
        self.assertEqual(resp.getheader('Second'), 'val')
예제 #9
0
 def _make_request(self, *args: Any,
                   **kwargs: Any) -> httplib.HTTPResponse:
     httplib_response = httplib.HTTPResponse(
         MockSock)  # type: ignore[arg-type]
     httplib_response.fp = MockChunkedEncodingResponse(
         [b"f", b"o", b"o"])  # type: ignore[assignment]
     httplib_response.headers = httplib_response.msg = httplib.HTTPMessage(
     )
     return httplib_response
예제 #10
0
    def test_readinto_chunked(self):

        expected = chunked_expected
        nexpected = len(expected)
        b = bytearray(128)

        sock = FakeSocket(chunked_start + last_chunk + chunked_end)
        resp = client.HTTPResponse(sock, method="GET")
        resp.begin()
        n = resp.readinto(b)
        self.assertEqual(b[:nexpected], expected)
        self.assertEqual(n, nexpected)
        resp.close()

        # Various read sizes
        for n in range(1, 12):
            sock = FakeSocket(chunked_start + last_chunk + chunked_end)
            resp = client.HTTPResponse(sock, method="GET")
            resp.begin()
            m = memoryview(b)
            i = resp.readinto(m[0:n])
            i += resp.readinto(m[i:n + i])
            i += resp.readinto(m[i:])
            self.assertEqual(b[:nexpected], expected)
            self.assertEqual(i, nexpected)
            resp.close()

        for x in ('', 'foo\r\n'):
            sock = FakeSocket(chunked_start + x)
            resp = client.HTTPResponse(sock, method="GET")
            resp.begin()
            try:
                n = resp.readinto(b)
            except client.IncompleteRead as i:
                self.assertEqual(i.partial, expected)
                expected_message = 'IncompleteRead(%d bytes read)' % len(
                    expected)
                self.assertEqual(repr(i), expected_message)
                self.assertEqual(str(i), expected_message)
            else:
                self.fail('IncompleteRead expected')
            finally:
                resp.close()
예제 #11
0
 def test_chunked_trailers(self):
     """See that trailers are read and ignored"""
     expected = chunked_expected
     sock = FakeSocket(chunked_start + last_chunk + trailers + chunked_end)
     resp = client.HTTPResponse(sock, method="GET")
     resp.begin()
     self.assertEqual(resp.read(), expected)
     # we should have reached the end of the file
     self.assertEqual(sock.file.read(100), b"") #we read to the end
     resp.close()
예제 #12
0
    def test_chunked(self):
        chunked_start = (
            'HTTP/1.1 200 OK\r\n'
            'Transfer-Encoding: chunked\r\n\r\n'
            'a\r\n'
            'hello worl\r\n'
            '3\r\n'
            'd! \r\n'
            '8\r\n'
            'and now \r\n'
            '22\r\n'
            'for something completely different\r\n'
        )
        expected = b'hello world! and now for something completely different'
        sock = FakeSocket(chunked_start + '0\r\n')
        resp = client.HTTPResponse(sock, method="GET")
        resp.begin()
        self.assertEqual(resp.read(), expected)
        resp.close()

        # Various read sizes
        for n in range(1, 12):
            sock = FakeSocket(chunked_start + '0\r\n')
            resp = client.HTTPResponse(sock, method="GET")
            resp.begin()
            self.assertEqual(resp.read(n) + resp.read(n) + resp.read(), expected)
            resp.close()

        for x in ('', 'foo\r\n'):
            sock = FakeSocket(chunked_start + x)
            resp = client.HTTPResponse(sock, method="GET")
            resp.begin()
            try:
                resp.read()
            except client.IncompleteRead as i:
                self.assertEqual(i.partial, expected)
                expected_message = 'IncompleteRead(%d bytes read)' % len(expected)
                self.assertEqual(repr(i), expected_message)
                self.assertEqual(str(i), expected_message)
            else:
                self.fail('IncompleteRead expected')
            finally:
                resp.close()
예제 #13
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())
예제 #14
0
 def __call__(self, *args: Any,
              **kwargs: Any) -> httplib.HTTPResponse:
     if self._ex:
         ex, self._ex = self._ex, None
         raise ex()
     response = httplib.HTTPResponse(
         MockSock)  # type: ignore[arg-type]
     response.fp = MockChunkedEncodingResponse(
         [b"f", b"o", b"o"])  # type: ignore[assignment]
     response.headers = response.msg = httplib.HTTPMessage()
     return response
예제 #15
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]
예제 #16
0
 def test_read_head(self):
     # Test that the library doesn't attempt to read any data
     # from a HEAD request.  (Tickles SF bug #622042.)
     sock = FakeSocket(
         'HTTP/1.1 200 OK\r\n'
         'Content-Length: 14432\r\n'
         '\r\n', NoEOFStringIO)
     resp = client.HTTPResponse(sock, method="HEAD")
     resp.begin()
     if resp.read():
         self.fail("Did not expect response from HEAD request")
예제 #17
0
 def test_chunked_response_without_crlf_on_end(self) -> None:
     stream = [b"foo", b"bar", b"baz"]
     fp = MockChunkedEncodingWithoutCRLFOnEnd(stream)
     r = httplib.HTTPResponse(MockSock)  # type: ignore[arg-type]
     r.fp = fp  # type: ignore[assignment]
     r.chunked = True
     r.chunk_left = None
     resp = HTTPResponse(r,
                         preload_content=False,
                         headers={"transfer-encoding": "chunked"})
     assert stream == list(resp.stream())
예제 #18
0
 def test_partial_reads(self):
     # if we have a lenght, the system knows when to close itself
     # same behaviour than when we read the whole thing with read()
     body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
     sock = FakeSocket(body)
     resp = client.HTTPResponse(sock)
     resp.begin()
     self.assertEqual(resp.read(2), b'Te')
     self.assertFalse(resp.isclosed())
     self.assertEqual(resp.read(2), b'xt')
     self.assertTrue(resp.isclosed())
예제 #19
0
 def test_content_length_sync(self):
     """Check that we don't read past the end of the Content-Length stream"""
     extradata = "extradata"
     expected = b"Hello123\r\n"
     sock = FakeSocket('HTTP/1.1 200 OK\r\nContent-Length: 10\r\n\r\nHello123\r\n' + extradata)
     resp = client.HTTPResponse(sock, method="GET")
     resp.begin()
     self.assertEqual(resp.read(), expected)
     # the file should now have our extradata ready to be read
     self.assertEqual(sock.file.read(100), extradata.encode("ascii")) #we read to the end
     resp.close()
예제 #20
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())
예제 #21
0
 def test_chunked_sync(self):
     """Check that we don't read past the end of the chunked-encoding stream"""
     expected = chunked_expected
     extradata = "extradata"
     sock = FakeSocket(chunked_start + last_chunk + trailers + chunked_end + extradata)
     resp = client.HTTPResponse(sock, method="GET")
     resp.begin()
     self.assertEqual(resp.read(), expected)
     # the file should now have our extradata ready to be read
     self.assertEqual(sock.file.read(100), extradata.encode("ascii")) #we read to the end
     resp.close()
예제 #22
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())
예제 #23
0
 def test_partial_reads_no_content_length(self):
     # when no length is present, the socket should be gracefully closed when
     # all data was read
     body = "HTTP/1.1 200 Ok\r\n\r\nText"
     sock = FakeSocket(body)
     resp = client.HTTPResponse(sock)
     resp.begin()
     self.assertEqual(resp.read(2), b'Te')
     self.assertFalse(resp.isclosed())
     self.assertEqual(resp.read(2), b'xt')
     self.assertEqual(resp.read(1), b'')
     self.assertTrue(resp.isclosed())
예제 #24
0
 def test_partial_reads_incomplete_body(self):
     # if the server shuts down the connection before the whole
     # content-length is delivered, the socket is gracefully closed
     body = "HTTP/1.1 200 Ok\r\nContent-Length: 10\r\n\r\nText"
     sock = FakeSocket(body)
     resp = client.HTTPResponse(sock)
     resp.begin()
     self.assertEqual(resp.read(2), b'Te')
     self.assertFalse(resp.isclosed())
     self.assertEqual(resp.read(2), b'xt')
     self.assertEqual(resp.read(1), b'')
     self.assertTrue(resp.isclosed())
예제 #25
0
 def test_readinto_head(self):
     # Test that the library doesn't attempt to read any data
     # from a HEAD request.  (Tickles SF bug #622042.)
     sock = FakeSocket(
         'HTTP/1.1 200 OK\r\n'
         'Content-Length: 14432\r\n'
         '\r\n', NoEOFBytesIO)
     resp = client.HTTPResponse(sock, method="HEAD")
     resp.begin()
     b = bytearray(5)
     if resp.readinto(b) != 0:
         self.fail("Did not expect response from HEAD request")
     self.assertEqual(bytes(b), b'\x00' * 5)
예제 #26
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
예제 #27
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
예제 #28
0
 def test_chunked_head(self):
     chunked_start = ('HTTP/1.1 200 OK\r\n'
                      'Transfer-Encoding: chunked\r\n\r\n'
                      'a\r\n'
                      'hello world\r\n'
                      '1\r\n'
                      'd\r\n')
     sock = FakeSocket(chunked_start + '0\r\n')
     resp = client.HTTPResponse(sock, method="HEAD")
     resp.begin()
     self.assertEqual(resp.read(), b'')
     self.assertEqual(resp.status, 200)
     self.assertEqual(resp.reason, 'OK')
     self.assertTrue(resp.isclosed())
예제 #29
0
def test_python_issue_20007():
    """
    Make sure we have a work-around for Python bug #20007
    http://bugs.python.org/issue20007
    """
    class FakeSocket(object):
        def makefile(self, _mode, _bufsize=None):
            # pylint:disable=unused-argument
            return BytesIO(b"HTTP/1.1 200 Ok\r\n\r\nText")

    source = http_client.HTTPResponse(FakeSocket())
    source.begin()
    stream = HTMLInputStream(source)
    assert stream.charsUntil(" ") == "Text"
예제 #30
0
 def test_incomplete_read(self):
     sock = FakeSocket('HTTP/1.1 200 OK\r\nContent-Length: 10\r\n\r\nHello\r\n')
     resp = client.HTTPResponse(sock, method="GET")
     resp.begin()
     try:
         resp.read()
     except client.IncompleteRead as i:
         self.assertEqual(i.partial, b'Hello\r\n')
         self.assertEqual(repr(i),
                          "IncompleteRead(7 bytes read, 3 more expected)")
         self.assertEqual(str(i),
                          "IncompleteRead(7 bytes read, 3 more expected)")
         self.assertTrue(resp.isclosed())
     else:
         self.fail('IncompleteRead expected')