diff options
Diffstat (limited to 'Lib/test/test_httplib.py')
| -rw-r--r-- | Lib/test/test_httplib.py | 140 | 
1 files changed, 130 insertions, 10 deletions
| diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 24c72ff..cf61552 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -186,6 +186,23 @@ class BasicTest(TestCase):          self.assertEqual(resp.read(2), b'xt')          self.assertTrue(resp.isclosed()) +    def test_partial_readintos(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() +        b = bytearray(2) +        n = resp.readinto(b) +        self.assertEqual(n, 2) +        self.assertEqual(bytes(b), b'Te') +        self.assertFalse(resp.isclosed()) +        n = resp.readinto(b) +        self.assertEqual(n, 2) +        self.assertEqual(bytes(b), b'xt') +        self.assertTrue(resp.isclosed()) +      def test_host_port(self):          # Check invalid host_port @@ -234,6 +251,21 @@ class BasicTest(TestCase):          if resp.read():              self.fail("Did not expect response from HEAD request") +    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', +            NoEOFStringIO) +        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) +      def test_send_file(self):          expected = (b'GET /foo HTTP/1.1\r\nHost: example.com\r\n'                      b'Accept-Encoding: identity\r\nContent-Length:') @@ -289,15 +321,28 @@ class BasicTest(TestCase):              'Transfer-Encoding: chunked\r\n\r\n'              'a\r\n'              'hello worl\r\n' -            '1\r\n' -            'd\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(), b'hello world') +        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") @@ -305,9 +350,64 @@ class BasicTest(TestCase):              try:                  resp.read()              except client.IncompleteRead as i: -                self.assertEqual(i.partial, b'hello world') -                self.assertEqual(repr(i),'IncompleteRead(11 bytes read)') -                self.assertEqual(str(i),'IncompleteRead(11 bytes read)') +                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() + +    def test_readinto_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' +        nexpected = len(expected) +        b = bytearray(128) + +        sock = FakeSocket(chunked_start + '0\r\n') +        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 + '0\r\n') +            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: @@ -330,6 +430,26 @@ class BasicTest(TestCase):          self.assertEqual(resp.reason, 'OK')          self.assertTrue(resp.isclosed()) +    def test_readinto_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() +        b = bytearray(5) +        n = resp.readinto(b) +        self.assertEqual(n, 0) +        self.assertEqual(bytes(b), b'\x00'*5) +        self.assertEqual(resp.status, 200) +        self.assertEqual(resp.reason, 'OK') +        self.assertTrue(resp.isclosed()) +      def test_negative_content_length(self):          sock = FakeSocket(              'HTTP/1.1 200 OK\r\nContent-Length: -1\r\n\r\nHello\r\n') @@ -545,8 +665,7 @@ class HTTPSTest(TestCase):      def test_local_good_hostname(self):          # The (valid) cert validates the HTTP hostname          import ssl -        from test.ssl_servers import make_https_server -        server = make_https_server(self, CERT_localhost) +        server = self.make_server(CERT_localhost)          context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)          context.verify_mode = ssl.CERT_REQUIRED          context.load_verify_locations(CERT_localhost) @@ -554,12 +673,12 @@ class HTTPSTest(TestCase):          h.request('GET', '/nonexistent')          resp = h.getresponse()          self.assertEqual(resp.status, 404) +        del server      def test_local_bad_hostname(self):          # The (valid) cert doesn't validate the HTTP hostname          import ssl -        from test.ssl_servers import make_https_server -        server = make_https_server(self, CERT_fakehostname) +        server = self.make_server(CERT_fakehostname)          context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)          context.verify_mode = ssl.CERT_REQUIRED          context.load_verify_locations(CERT_fakehostname) @@ -577,6 +696,7 @@ class HTTPSTest(TestCase):          h.request('GET', '/nonexistent')          resp = h.getresponse()          self.assertEqual(resp.status, 404) +        del server      @unittest.skipIf(not hasattr(client, 'HTTPSConnection'),                       'http.client.HTTPSConnection not available') | 
