Non-blocking read() in httplib?

Benjamin Niemann b.niemann at betternet.de
Mon Jul 12 08:31:19 EDT 2004


Marcin Ciura wrote:
> I have the following problem with HTTPResponse:
> 
> import httplib #, select
> ...
>     connection = httplib.HTTPConnection(host)
>     connection.connect()
>     connection.request('GET', url)
>     response = connection.getresponse()
>     # print response.status, response.reason gives '200 OK'
>     # ready = select.select([response],[],[], 5.0) # no fileno() method
>     # signal.alarm(5) # not on Windows
>     # ...
>     data=response.read() # this sometimes blocks
>     connection.close()
> 
> Sometimes the read() call blocks forever for no obvious reason 
> (response.status is OK); it even cannot be interrupted from the keyboard 
> (on Windows).
> 
> I would like to defend against this by throwing an exception when the 
> read() lasts too long. But I cannot use select.select(), because 
> HTTPResponse has no fileno() method. Neither can I use signal.alarm(), 
> as it is for Unixes only.
> 
> Is there any other way to break read() or make it non-blocking?
I'm using timeoutsocket.py which allows you to globally specify a 
timeout for all sockets. Used signal.alarm before, which caused more 
problems than it solved...



More information about the Python-list mailing list