gallery.py: Use Python-3-compatible exception syntax
[blog.git] / posts / gallery / gallery.py
index 1dece358033acb2b57f2491410c6dbf7188ab2bd..1a3c958753c0093460e7e561c67c59227cfc88d5 100755 (executable)
@@ -51,6 +51,7 @@ import os.path as _os_path
 import random as _random
 import re as _re
 import subprocess as _subprocess
+import urlparse as _urlparse
 import xml.sax.saxutils as _xml_sax_saxutils
 
 
@@ -113,7 +114,7 @@ def invoke(args, stdin=None, stdout=_subprocess.PIPE, stderr=_subprocess.PIPE,
     try :
         q = _subprocess.Popen(args, stdin=_subprocess.PIPE, stdout=stdout,
                               stderr=stderr, cwd=cwd)
-    except OSError, e:
+    except OSError as e:
         raise CommandError(args, status=e.args[0], stderr=e)
     stdout,stderr = q.communicate(input=stdin)
     status = q.wait()
@@ -238,6 +239,25 @@ class CGIGalleryServer (object):
         except ProcessingComplete:
             pass
 
+    def page_from_query(self, query=None, query_string=None):
+        """Extract the requested page from a query string
+
+        This is a helper method for CGIGalleryServer consumers.
+        Specify either query or query_string, but not both.
+        """
+        if query is None:
+            query = _urlparse.parse_qs(query_string)
+        page = 0
+        if 'pp' in query:
+            pp = query['pp']
+            if isinstance(pp, list):
+                pp = pp[0]
+            try:
+                page = int(pp) - 1
+            except ValueError:
+                pass
+        return page
+
     def relative_url(self, url):
         if url is None:
             return url
@@ -683,47 +703,34 @@ def serve_cgi(server):
     import sys
 
     url=None
-    page=0
     cgitb.enable()
     #cgitb.enable(display=0, logdir="/tmp/")
     data = cgi.FieldStorage()
+    page = server.page_from_query(
+        query={key: data[key].getlist() for key in data.keys()})
     if 'p' in data:
         p = data['p']
         if isinstance(p, list):
             p = p[0]
         url = p.value
-    if 'pp' in data:
-        try:
-            page = int(data['pp'].value) - 1
-        except ValueError:
-            pass
     server.serve(url=url, page=page, stream=sys.stdout)
 
 def serve_scgi(server, host='localhost', port=4000):
     import scgi
     import scgi.scgi_server
-    import urlparse
 
     class GalleryHandler(scgi.scgi_server.SCGIHandler):
         def produce(self, env, bodysize, input, output):
             #LOG.info(HTTP_USER_AGENT REQUEST_METHOD REMOTE_ADDR REQUEST_URI
             url = env.get('DOCUMENT_URI', None)
-            page = 0
-            data = urlparse.parse_qs(env.get('QUERY_STRING', ''))
-            if 'pp' in data:
-                pp = data['pp']
-                if isinstance(pp, list):
-                    pp = pp[0]
-                try:
-                    page = int(pp) - 1
-                except ValueError:
-                    pass
+            page = server.page_from_query(
+                query_string=env.get('QUERY_STRING', ''))
             try:
                 try:
                     url = server.relative_url(url=url)
                 except HTTPError as e:
                     LOG.error(e.message)
-                    server._error(e.status, content=e.content, stream=stream)
+                    server._error(e.status, content=e.content, stream=output)
             except ProcessingComplete:
                 pass
             else: