]> granicus.if.org Git - python/commitdiff
Fix for SF buf #458835
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 11 Oct 2001 17:47:22 +0000 (17:47 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 11 Oct 2001 17:47:22 +0000 (17:47 +0000)
Try to be systematic about dealing with socket and ssl exceptions in
FakeSocket.makefile().  The previous version of the code caught all
ssl errors and treated them as EOF, even though most of the errors
don't mean EOF.

An SSL error can mean on of three things:

    1. The SSL/TLS connection was closed.
    2. The operation should be retried.
    3. An error occurred.

Also, if a socket error occurred and the error was EINTR, retry the
call.  Otherwise, it was a legitimate error and the caller should
receive the exception.

Lib/httplib.py

index fa63787ef6dc44c5242bccc438e5cc67c2d47b69..cb068564f8a146d3638ce2796f400da971fbfabc 100644 (file)
@@ -66,8 +66,9 @@ Req-started-unread-response    _CS_REQ_STARTED    <response_class>
 Req-sent-unread-response       _CS_REQ_SENT       <response_class>
 """
 
-import socket
+import errno
 import mimetools
+import socket
 
 try:
     from cStringIO import StringIO
@@ -604,8 +605,18 @@ class FakeSocket:
         while 1:
             try:
                 buf = self.__ssl.read()
-            except socket.sslerror, msg:
-                break
+            except socket.sslerror, err:
+                if (err[0] == socket.SSL_ERROR_WANT_READ
+                    or err[0] == socket.SSL_ERROR_WANT_WRITE
+                    or 0):
+                    continue
+                if err[0] == socket.SSL_ERROR_ZERO_RETURN:
+                    break
+                raise
+            except socket.error, err:
+                if err[0] = errno.EINTR:
+                    continue
+                raise
             if buf == '':
                 break
             msgbuf.append(buf)