Add retry handling on error. - zs - Zeitungsschau rss to email converter
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit de38800ce7a8ad243771b74cf84e36a84aebc0d1
 (DIR) parent 4d0d209d7b746599be83f63aad1c61682de36a1e
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Mon, 17 Mar 2014 18:08:20 +0100
       
       Add retry handling on error.
       
       Diffstat:
         feeddb.py                           |      23 +++++++++++++++++------
         zs.py                               |      26 +++++++++++++++++++++++---
       
       2 files changed, 40 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/feeddb.py b/feeddb.py
       @@ -106,18 +106,29 @@ class feeddb(object):
                        feed[key] = value
                        self.writefeed(uri, feed)
        
       -        def pause(self, uri):
       -                self.setfeedval(uri, "pause", True)
       -
       -        def unpause(self, uri):
       -                self.setfeedval(uri, "pause", False)
       -
                def getfeedval(self, uri, key):
                        feed = self.readfeed(uri)
                        if feed == None:
                                return None
                        return feed[key]
        
       +        def setretry(self, uri, retries):
       +                self.setfeedval(uri, "retry", retries)
       +        
       +        def incretry(self, uri):
       +                retries = self.getfeedval(uri, "retry")
       +                if retries == None:
       +                        self.setfeedval(uri, "retry", 1)
       +                else:
       +                        self.setfeedval(uri, "retry", retries+1)
       +
       +        def pause(self, uri):
       +                self.setfeedval(uri, "pause", True)
       +
       +        def unpause(self, uri):
       +                self.setfeedval(uri, "pause", False)
       +                self.setretry(uri, 0)
       +
                def ispaused(self, uri):
                        return self.getfeedval(uri, "pause")
        
 (DIR) diff --git a/zs.py b/zs.py
       @@ -25,18 +25,33 @@ def run(db, selfeed=None, dryrun=False):
                                print("pause %s" % (feeduri))
                                continue
        
       +                retries = db.getretry(feeduri)
       +                estr = None
                        print("fetch %s" % (feeduri))
                        try:
                                curfeed = feed.fetch(feeduri)
                        except urllib.error.HTTPError as err:
                                if err.code == 404:
       -                                print("404 -> pause %s" % (feeduri))
       -                                db.pause(feeduri)
       -                        continue
       +                                estr = "404"
       +                                retries += 1
                        except socket.gaierror:
                                continue
                        except TimeoutError:
                                continue
       +                except ConnectionResetError:
       +                        estr = "connreset"
       +                        retries += 1
       +
       +                # retry handling
       +                if estr != None:
       +                        if retries > 2:
       +                                sys.stderr.write("pause %s %s\n" % \
       +                                                (estr, feeduri))
       +                                db.pause(feeduri)
       +                        db.setretry(feeduri, retries)
       +                        continue
       +                elif retries > 0:
       +                        db.setretry(feeduri, 0)
        
                        clen = len(curfeed["articles"])
                        if clen == 0:
       @@ -114,6 +129,11 @@ def main(args):
                                usage(args[0])
                        db.resetarticles(args[1])
        
       +        elif args[1] == "retry":
       +                if len(args) < 4:
       +                        usage(args[0])
       +                db.setretry(args[1], int(args[2]))
       +
                elif args[1] == "pause":
                        if len(args) < 3:
                                usage(args[0])