HTTPConnection.request not respecting timeout?

后端 未结 1 1652
南旧
南旧 2020-12-17 05:39

I\'m trying to use HTTPConnection (2.7.8) to make a request and I\'ve set the timeout to 10 with HTTPConnection(host, timeout=10). However, H

相关标签:
1条回答
  • 2020-12-17 06:04

    It takes around ~30 seconds for the following code to fail:

    #!/usr/bin/env python2
    from httplib import HTTPConnection
    
    conn = HTTPConnection('google.com', 22222, timeout=2)
    conn.request('GET', '')
    

    If ip is passed to HTTPConnection instead of the hostname then the timeout error is raised in 2 seconds as expected:

    #!/usr/bin/env python2
    import socket
    from httplib import HTTPConnection
    
    host, port = 'google.com', 22222
    ip, port = socket.getaddrinfo(host, port)[0][-1]
    conn = HTTPConnection(ip, port, timeout=2)
    conn.request('GET', '')
    

    The explanation is the same as in ftplib.FTP timeout has inconsistent behaviour: the timeout may limit individual socket operations but it says nothing about the duration of the HTTPConnection() call itself that may try several ip addresses returned by getaddrinfo() and the timeout limits only the individual socket operations. Several operations combined may take longer.

    Your HTTPConnection('http://google.com:22222') fails sooner because the url is an incorrect argument: it should be either host or host:port. The absolute url is accepted by request() method -- though even there it has special meaning -- typically, you just provide the path along such as '/'.

    0 讨论(0)
提交回复
热议问题