Exemplo n.º 1
0
    def test_content_length_0(self):

        class ContentLengthChecker(list):
            def __init__(self):
                list.__init__(self)
                self.content_length = None
            def append(self, item):
                kv = item.split(b':', 1)
                if len(kv) > 1 and kv[0].lower() == b'content-length':
                    self.content_length = kv[1].strip()
                list.append(self, item)

        # POST with empty body
        conn = client.HTTPConnection('example.com')
        conn.sock = FakeSocket(None)
        conn._buffer = ContentLengthChecker()
        conn.request('POST', '/', '')
        self.assertEqual(conn._buffer.content_length, b'0',
                        'Header Content-Length not set')

        # PUT request with empty body
        conn = client.HTTPConnection('example.com')
        conn.sock = FakeSocket(None)
        conn._buffer = ContentLengthChecker()
        conn.request('PUT', '/', '')
        self.assertEqual(conn._buffer.content_length, b'0',
                        'Header Content-Length not set')
Exemplo n.º 2
0
    def testTimeoutAttribute(self):
        '''This will prove that the timeout gets through
        HTTPConnection and into the socket.
        '''
        # default -- use global socket timeout
        self.assertTrue(socket.getdefaulttimeout() is None)
        socket.setdefaulttimeout(30)
        try:
            httpConn = client.HTTPConnection(HOST, TimeoutTest.PORT)
            httpConn.connect()
        finally:
            socket.setdefaulttimeout(None)
        self.assertEqual(httpConn.sock.gettimeout(), 30)
        httpConn.close()

        # no timeout -- do not use global socket default
        self.assertTrue(socket.getdefaulttimeout() is None)
        socket.setdefaulttimeout(30)
        try:
            httpConn = client.HTTPConnection(HOST, TimeoutTest.PORT,
                                              timeout=None)
            httpConn.connect()
        finally:
            socket.setdefaulttimeout(None)
        self.assertEqual(httpConn.sock.gettimeout(), None)
        httpConn.close()

        # a value
        httpConn = client.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
        httpConn.connect()
        self.assertEqual(httpConn.sock.gettimeout(), 30)
        httpConn.close()
Exemplo n.º 3
0
    def test_auto_headers(self):
        # Some headers are added automatically, but should not be added by
        # .request() if they are explicitly set.

        class HeaderCountingBuffer(list):
            def __init__(self):
                self.count = {}
            def append(self, item):
                kv = item.split(b':')
                if len(kv) > 1:
                    # item is a 'Key: Value' header string
                    lcKey = kv[0].decode('ascii').lower()
                    self.count.setdefault(lcKey, 0)
                    self.count[lcKey] += 1
                list.append(self, item)

        for explicit_header in True, False:
            for header in 'Content-length', 'Host', 'Accept-encoding':
                conn = client.HTTPConnection('example.com')
                conn.sock = FakeSocket('blahblahblah')
                conn._buffer = HeaderCountingBuffer()

                body = 'spamspamspam'
                headers = {}
                if explicit_header:
                    headers[header] = str(len(body))
                conn.request('POST', '/', body, headers)
                self.assertEqual(conn._buffer.count[header.lower()], 1)
Exemplo n.º 4
0
 def testHTTPConnectionSourceAddress(self):
     self.conn = client.HTTPConnection(HOST,
                                       self.port,
                                       source_address=('',
                                                       self.source_port))
     self.conn.connect()
     self.assertEqual(self.conn.sock.getsockname()[1], self.source_port)
Exemplo n.º 5
0
    def test_ipv6host_header(self):
        # Default host header on IPv6 transaction should wrapped by [] if
        # its actual IPv6 address
        expected = bytes(b'GET /foo HTTP/1.1\r\nHost: [2001::]:81\r\n') + \
                   bytes(b'Accept-Encoding: identity\r\n\r\n')
        conn = client.HTTPConnection('[2001::]:81')
        sock = FakeSocket('')
        conn.sock = sock
        conn.request('GET', '/foo')
        self.assertTrue(sock.data.startswith(expected))

        expected = bytes(b'GET /foo HTTP/1.1\r\nHost: [2001:102A::]\r\n') + \
                   bytes(b'Accept-Encoding: identity\r\n\r\n')
        conn = client.HTTPConnection('[2001:102A::]')
        sock = FakeSocket('')
        conn.sock = sock
        conn.request('GET', '/foo')
        self.assertTrue(sock.data.startswith(expected))
Exemplo n.º 6
0
 def make_connection(self, host):
     # return an existing connection if possible.  This allows
     # HTTP/1.1 keep-alive.
     if self._connection and host == self._connection[0]:
         return self._connection[1]
     # create a HTTP connection object from a host descriptor
     chost, self._extra_headers, x509 = self.get_host_info(host)
     self._connection = host, http_client.HTTPConnection(chost)
     return self._connection[1]
Exemplo n.º 7
0
    def test_send_file(self):
        expected = (bytes(b'GET /foo HTTP/1.1\r\nHost: example.com\r\n') +
                    bytes(b'Accept-Encoding: identity\r\nContent-Length:'))

        # __file__ will usually be the .pyc, i.e. binary data
        with open(__file__, 'rb') as body:
            conn = client.HTTPConnection('example.com')
            sock = FakeSocket(body)
            conn.sock = sock
            conn.request('GET', '/foo', body)
            self.assertTrue(sock.data.startswith(expected), '%r != %r' %
                    (sock.data[:len(expected)], expected))
Exemplo n.º 8
0
 def test_epipe(self):
     sock = EPipeSocket(
         "HTTP/1.0 401 Authorization Required\r\n"
         "Content-type: text/html\r\n"
         "WWW-Authenticate: Basic realm=\"example\"\r\n", b"Content-Length")
     conn = client.HTTPConnection("example.com")
     conn.sock = sock
     self.assertRaises(socket.error,
                       lambda: conn.request("PUT", "/url", "body"))
     resp = conn.getresponse()
     self.assertEqual(401, resp.status)
     self.assertEqual("Basic realm=\"example\"",
                      resp.getheader("www-authenticate"))
Exemplo n.º 9
0
    def test_host_port(self):
        # Check invalid host_port

        # Note that http.client does not accept user:password@ in the host-port.
        for hp in ("www.python.org:abc", "user:[email protected]"):
            self.assertRaises(client.InvalidURL, client.HTTPConnection, hp)

        for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b",
                          8000), ("www.python.org:80", "www.python.org", 80),
                         ("www.python.org", "www.python.org",
                          80), ("www.python.org:", "www.python.org", 80),
                         ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)):
            c = client.HTTPConnection(hp)
            self.assertEqual(h, c.host)
            self.assertEqual(p, c.port)
Exemplo n.º 10
0
 def test_send(self):
     expected = bytes(b'this is a test this is only a test')
     conn = client.HTTPConnection('example.com')
     sock = FakeSocket(None)
     conn.sock = sock
     conn.send(expected)
     self.assertEqual(expected, sock.data)
     sock.data = bytes(b'')
     if utils.PY3:
         mydata = array.array('b', expected)
     else:
         mydata = array.array(b'b', expected)
     conn.send(mydata)
     self.assertEqual(expected, sock.data)
     sock.data = bytes(b'')
     conn.send(io.BytesIO(expected))
     self.assertEqual(expected, sock.data)
Exemplo n.º 11
0
    def compressLZMA(cls, path):
        # improves console readability
        path = os.path.normpath(path)

        printLog('INFO', 'Compressing file: ' + path)

        with open(path, 'rb') as fin:
            conn = client.HTTPConnection(getAppManagerHost(False))
            headers = {'Content-type': 'application/octet-stream'}
            conn.request('POST', '/storage/lzma/', body=fin, headers=headers)
            response = conn.getresponse()

            if response.status != 200:
                printLog('ERROR', 'LZMA compression error: ' + response.reason)

            with open(path + '.xz', 'wb') as fout:
                fout.write(response.read())
Exemplo n.º 12
0
 def test_putheader(self):
     conn = client.HTTPConnection('example.com')
     conn.sock = FakeSocket(None)
     conn.putrequest('GET','/')
     conn.putheader('Content-length', 42)
     self.assertTrue(b'Content-length: 42' in conn._buffer)