This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: socket timeouts produce wrong errors in win32
Type: Stage:
Components: Library (Lib) Versions: Python 2.3
process
Status: closed Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: glchapman, troels
Priority: normal Keywords:

Created on 2003-03-24 17:59 by glchapman, last changed 2022-04-10 16:07 by admin. This issue is now closed.

Messages (3)
msg15252 - (view) Author: Greg Chapman (glchapman) Date: 2003-03-24 17:59
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.
msg15253 - (view) Author: Troels Walsted Hansen (troels) Date: 2004-06-02 11:22
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')
msg15254 - (view) Author: Greg Chapman (glchapman) Date: 2004-06-02 15:09
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.
History
Date User Action Args
2022-04-10 16:07:52adminsetgithub: 38210
2003-03-24 17:59:37glchapmancreate