Repository: googleapis/google-api-python-client

Issue:
http.py refers to socket.error, which is deprecated
It should just use `OSError` 
https://docs.python.org/3/library/socket.html#socket.error


Discussion:
Hi @dossett, great find! Once #1147 is merged, it would be great to get your help with this one also!

Resolving patch:
diff --git a/googleapiclient/http.py b/googleapiclient/http.py
--- a/googleapiclient/http.py
+++ b/googleapiclient/http.py
@@ -178,14 +178,13 @@ def _retry_request(
         except _ssl_SSLError as ssl_error:
             exception = ssl_error
         except socket.timeout as socket_timeout:
-            # It's important that this be before socket.error as it's a subclass
+            # Needs to be before socket.error as it's a subclass of OSError
             # socket.timeout has no errorcode
             exception = socket_timeout
         except ConnectionError as connection_error:
-            # Needs to be before socket.error as it's a subclass of
-            # OSError (socket.error)
+            # Needs to be before socket.error as it's a subclass of OSError
             exception = connection_error
-        except socket.error as socket_error:
+        except OSError as socket_error:
             # errno's contents differ by platform, so we have to match by name.
             # Some of these same errors may have been caught above, e.g. ECONNRESET *should* be
             # raised as a ConnectionError, but some libraries will raise it as a socket.error


Test patch:
diff --git a/tests/test_http.py b/tests/test_http.py
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -137,7 +137,7 @@ def request(self, *args, **kwargs):
         elif self.num_errors == 4:
             ex = httplib2.ServerNotFoundError()
         elif self.num_errors == 3:
-            ex = socket.error()
+            ex = OSError()
             ex.errno = socket.errno.EPIPE
         elif self.num_errors == 2:
             ex = ssl.SSLError()
@@ -145,14 +145,14 @@ def request(self, *args, **kwargs):
             # Initialize the timeout error code to the platform's error code.
             try:
                 # For Windows:
-                ex = socket.error()
+                ex = OSError()
                 ex.errno = socket.errno.WSAETIMEDOUT
             except AttributeError:
                 # For Linux/Mac:
                 if PY3:
                     ex = socket.timeout()
                 else:
-                    ex = socket.error()
+                    ex = OSError()
                     ex.errno = socket.errno.ETIMEDOUT
 
         self.num_errors -= 1
@@ -170,7 +170,7 @@ def request(self, *args, **kwargs):
             return httplib2.Response(self.success_json), self.success_data
         else:
             self.num_errors -= 1
-            ex = socket.error()
+            ex = OSError()
             # set errno to a non-retriable value
             try:
                 # For Windows:
@@ -943,7 +943,7 @@ def test_no_retry_connection_errors(self):
         )
         request._sleep = lambda _x: 0  # do nothing
         request._rand = lambda: 10
-        with self.assertRaises(socket.error):
+        with self.assertRaises(OSError):
             response = request.execute(num_retries=3)
 
     def test_retry_connection_errors_non_resumable(self):