From ae9cd99134160a5540e6f8d6d33d855122854e10 Mon Sep 17 00:00:00 2001 From: Aaron Niskode-Dossett Date: Wed, 13 Jan 2021 04:58:15 -0600 Subject: [PATCH] fix: Catch ECONNRESET and other errors more reliably (#1147) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #1146 🦕 --- googleapiclient/http.py | 8 +++++--- tests/test_http.py | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/googleapiclient/http.py b/googleapiclient/http.py index e842bb4c87b..5e582cf8519 100644 --- a/googleapiclient/http.py +++ b/googleapiclient/http.py @@ -28,9 +28,7 @@ from six import BytesIO, StringIO from six.moves.urllib.parse import urlparse, urlunparse, quote, unquote -import base64 import copy -import gzip import httplib2 import json import logging @@ -38,7 +36,6 @@ import os import random import socket -import sys import time import uuid @@ -190,11 +187,16 @@ def _retry_request( exception = connection_error except socket.error 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 + # with an errno corresponding to ECONNRESET if socket.errno.errorcode.get(socket_error.errno) not in { "WSAETIMEDOUT", "ETIMEDOUT", "EPIPE", "ECONNABORTED", + "ECONNREFUSED", + "ECONNRESET", }: raise exception = socket_error diff --git a/tests/test_http.py b/tests/test_http.py index 9bfae93fd73..f87d7e1613b 100644 --- a/tests/test_http.py +++ b/tests/test_http.py @@ -174,10 +174,10 @@ def request(self, *args, **kwargs): # set errno to a non-retriable value try: # For Windows: - ex.errno = socket.errno.WSAECONNREFUSED + ex.errno = socket.errno.WSAEHOSTUNREACH except AttributeError: # For Linux/Mac: - ex.errno = socket.errno.ECONNREFUSED + ex.errno = socket.errno.EHOSTUNREACH # Now raise the correct timeout error. raise ex