Blob Blame History Raw
From f6d8da61034610d9e1fc42ca1f7e34c1c83f3386 Mon Sep 17 00:00:00 2001
From: Kovid Goyal <kovid@kovidgoyal.net>
Date: Thu, 25 Jul 2019 10:46:06 +0530
Subject: [PATCH 17/71] py3 compat for gaierror retry

---
 src/calibre/web/fetch/simple.py | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/calibre/web/fetch/simple.py b/src/calibre/web/fetch/simple.py
index b5b098d3c3..e0b4fefc5c 100644
--- a/src/calibre/web/fetch/simple.py
+++ b/src/calibre/web/fetch/simple.py
@@ -277,9 +277,13 @@ class RecursiveFetcher(object):
         except URLError as err:
             if hasattr(err, 'code') and err.code in responses:
                 raise FetchError(responses[err.code])
-            if getattr(err, 'reason', [0])[0] == 104 or \
-                getattr(getattr(err, 'args', [None])[0], 'errno', None) in (-2,
-                        -3):  # Connection reset by peer or Name or service not known
+            is_temp = False
+            reason = getattr(err, 'reason', None)
+            if isinstance(reason, socket.gaierror):
+                # see man gai_strerror() for details
+                if getattr(reason, 'errno', None) in (socket.EAI_AGAIN, socket.EAI_NONAME):
+                    is_temp = True
+            if is_temp:  # Connection reset by peer or Name or service not known
                 self.log.debug('Temporary error, retrying in 1 second')
                 time.sleep(1)
                 with closing(open_func(url, timeout=self.timeout)) as f: