[ python-Bugs-708927 ] socket timeouts produce wrong errors in win32
SourceForge.net
noreply at sourceforge.net
Wed Jun 2 11:09:48 EDT 2004
Bugs item #708927, was opened at 2003-03-24 08:59
Message generated for change (Comment added) made by glchapman
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=708927&group_id=5470
Category: Python Library
Group: Python 2.3
>Status: Closed
Resolution: None
Priority: 5
Submitted By: Greg Chapman (glchapman)
Assigned to: Nobody/Anonymous (nobody)
Summary: socket timeouts produce wrong errors in win32
Initial Comment:
Here's a session:
Python 2.3a2 (#39, Feb 19 2003, 17:58:58) [MSC v.1200
32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more
information.
>>> import socket
>>> socket.setdefaulttimeout(0.01)
>>> import urllib
>>> urllib.urlopen('http://www.python.org')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "c:\Python23\lib\urllib.py", line 76, in urlopen
return opener.open(url)
File "c:\Python23\lib\urllib.py", line 181, in open
return getattr(self, name)(url)
File "c:\Python23\lib\urllib.py", line 297, in open_http
h.endheaders()
File "c:\Python23\lib\httplib.py", line 705, in endheaders
self._send_output()
File "c:\Python23\lib\httplib.py", line 591, in
_send_output
self.send(msg)
File "c:\Python23\lib\httplib.py", line 558, in send
self.connect()
File "c:\Python23\lib\httplib.py", line 798, in connect
IOError: [Errno socket error] (2, 'No such file or directory')
>>> urllib.urlopen('http://www.python.org')
< SNIP >
IOError: [Errno socket error] (0, 'Error')
Looking at socketmodule.c, it appears internal_connect
must be taking the path which (under MS_WINDOWS)
calls select to see if there was a timeout. select must
be returning 0 (to signal a timeout), but it apparently
does not call WSASetLastError, so when set_error is
called, WSAGetLastError returns 0, and the ultimate
error generated comes from the call to
PyErr_SetFromErrNo. Perhaps in this case
internal_connect should itself call WSASetLastError
(with WSAETIMEDOUT rather than
WSAEWOULDBLOCK?).
The reason I ran into this is I was planning to convert
some code which used the timeoutsocket module under
2.2. That module raises a Timeout exception (which the
code was catching) and I was trying to figure out what
the equivalent exception would be from the normal
socket module. Perhaps the socket module should
define some sort of timeout exception class so it would
be easier to detect timeouts as opposed to other socket
errors.
----------------------------------------------------------------------
>Comment By: Greg Chapman (glchapman)
Date: 2004-06-02 07:09
Message:
Logged In: YES
user_id=86307
I agree that it has been fixed. I think the timeout parameter
to internal_connect was not there for 2.3a2 (but Sourceforge
won't let me connect to the web CVS right now, so I'm not
sure). Anyway, since internal_connect sets timeout to true
in this case, the correct error is generated by sock_connect.
----------------------------------------------------------------------
Comment By: Troels Walsted Hansen (troels)
Date: 2004-06-02 03:22
Message:
Logged In: YES
user_id=32863
I think this may be fixed. I wasn't able to reproduce the
problem with Python 2.3.4 on Windows XP SP1.
Python 2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more
information.
>>> import socket
>>> socket.setdefaulttimeout(0.01)
>>> import urllib
>>> urllib.urlopen('http://www.python.org')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "C:\Program Files\Python23\lib\urllib.py", line 76,
in urlopen
return opener.open(url)
File "C:\Program Files\Python23\lib\urllib.py", line 181,
in open
return getattr(self, name)(url)
File "C:\Program Files\Python23\lib\urllib.py", line 297,
in open_http
h.endheaders()
File "C:\Program Files\Python23\lib\httplib.py", line 712,
in endheaders
self._send_output()
File "C:\Program Files\Python23\lib\httplib.py", line 597,
in _send_output
self.send(msg)
File "C:\Program Files\Python23\lib\httplib.py", line 564,
in send
self.connect()
File "C:\Program Files\Python23\lib\httplib.py", line 548,
in connect
raise socket.error, msg
IOError: [Errno socket error] timed out
Repeatedly calling the code below gives the same exception
and backtrace every time.
>>> urllib.urlopen('http://www.python.org')
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=708927&group_id=5470
More information about the Python-bugs-list
mailing list