pngtile.tile: handle dir/image requests by redirecting to image_server
authorTero Marttila <terom@qmsk.net>
Fri, 03 Oct 2014 23:56:25 +0300
changeset 165 1dc09e81a4e2
parent 164 e1e0c8099c8b
child 166 986052d7d0ce
pngtile.tile: handle dir/image requests by redirecting to image_server
bin/image-server
bin/tile-server
pngtile/tile.py
--- a/bin/image-server	Fri Oct 03 23:56:02 2014 +0300
+++ b/bin/image-server	Fri Oct 03 23:56:25 2014 +0300
@@ -22,7 +22,6 @@
     
     parser.add_argument('--tile-server',    metavar='URL', required=True,
             help="http://.../ URL to tileserver root")
-
     parser.add_argument('--static',     metavar='PATH', default='./static',
             help="Path to /static")
     parser.add_argument('image_root',   metavar='PATH',
--- a/bin/tile-server	Fri Oct 03 23:56:02 2014 +0300
+++ b/bin/tile-server	Fri Oct 03 23:56:25 2014 +0300
@@ -20,13 +20,17 @@
     parser.add_argument('--debugger',   action='store_true',
             help="Debugger")
 
+    parser.add_argument('--image-server',    metavar='URL', required=True,
+            help="http://.../ URL to imageserver root")
     parser.add_argument('image_root',   metavar='PATH',
             help="Path to images")
 
     args = parser.parse_args()
 
     application = pngtile.tile.TileApplication(
-        image_root  = args.image_root,
+        image_root      = args.image_root,
+
+        image_server    = args.image_server,
     )
 
     werkzeug.serving.run_simple(args.listen, args.port, application,
--- a/pngtile/tile.py	Fri Oct 03 23:56:02 2014 +0300
+++ b/pngtile/tile.py	Fri Oct 03 23:56:25 2014 +0300
@@ -2,8 +2,9 @@
     Raw tile handling.
 """
 
-from pngtile.application import BaseApplication
+from pngtile.application import BaseApplication, url
 from werkzeug import Request, Response, exceptions
+from werkzeug.utils import redirect
 
 import pypngtile
 
@@ -42,8 +43,14 @@
     return scale(val, zoom) - dim / 2
 
 class TileApplication (BaseApplication):
-    def __init__ (self, **opts):
+    def __init__ (self, image_server, **opts):
+        """
+            image_server:       http://.../ url to image-server frontend
+        """
+
         BaseApplication.__init__(self, **opts)
+
+        self.image_server = image_server
         
     def render_region (self, request, image):
         """
@@ -95,23 +102,72 @@
         except pypngtile.Error as error:
             raise exceptions.BadRequest(str(error))
 
-    def handle (self, request):
+    def handle_dir (self, request, name, path):
         """
-            Handle request for an image
+            Redirect to the image frontend for a non-tile request.
         """
-        
+
+        if not name.endswith('/'):
+            # avoid an additional redirect
+            name += '/'
+
+        return redirect(url(self.image_server, name))
+
+    def handle_image (self, request, name, path):
+        """
+            Redirect to the image frontend for a non-tile request.
+        """
+
+        return redirect(url(self.image_server, name))
+
+    def handle_region (self, request):
+        """
+            Return image/png for given region.
+        """
+
         try:
             image, name = self.get_image(request.path)
         except pypngtile.Error as error:
             raise exceptions.BadRequest(str(error))
+ 
+        png = self.render_region(request, image)
+        
+        return Response(png, content_type='image/png')
 
-        if 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args:
-            png = self.render_region(request, image)
+    def handle_tile (self, request):
+        """
+            Return image/png for given tile.
+        """
+
+        try:
+            image, name = self.get_image(request.path)
+        except pypngtile.Error as error:
+            raise exceptions.BadRequest(str(error))
+            
+        png = self.render_tile(request, image)
+        
+        return Response(png, content_type='image/png')
+
+    def handle (self, request):
+        """
+            Handle request for an image
+        """
+
+        name, path, type = self.lookup_path(request.path)
+        
+        # determine handler
+        if not type:
+            return self.handle_dir(request, name, path)
+
+        elif not request.args:
+            return self.handle_image(request, name, path)
+
+        elif 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args:
+            return self.handle_region(request)
 
         elif 'x' in request.args and 'y' in request.args:
-            png = self.render_tile(request, image)
+            return self.handle_tile(request)
 
         else:
             raise exceptions.BadRequest("Unknown args")
 
-        return Response(png, content_type='image/png')