>> I discovered much to my chagrin today that the socket module's new >> timeout capability doesn't play well with file objects as returned by >> a socket's makefile method.
Guido> Can you explain better how it doesn't work?
When the socket is in non-blocking mode, reads on the file returned by .makefile() will fail with an IOError if there is nothing to return.
>> I would think the greatest use of timeouts would be using >> higher-level line-oriented modules like urllib and ftplib. In >> addition, since makefile() isn't always available, it seems >> worthwhile to implement something in socket.py, thus making >> makefile() universally available.
Guido> Um, when is makefile() not available?
I don't know. I was going by the doc string in socketmodule.c which says, in part:
... makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\ ... [*] not available on all platforms!");
Maybe the docs are just wrong. According to the #ifdef in the code, if NO_DUP is defined (OS/2, Windows, BeOS), makefile() isn't.
Guido> There's code for Windows that emulates it, returning a file-like Guido> object. Maybe that code should be enabled universally rather Guido> than only on Windows...
That sounds similar to what is in timeoutsocket.py. It would have the advantage of providing identical semantics across all platforms.
Skip