pngtile/tile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 01:40:54 +0300
changeset 171 0ff809f855f7
parent 167 16b600e927fe
child 172 73380dd6a816
permissions -rw-r--r--
pngtile.tile: implement Last-Modified/If-Modified-Since caching
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    Raw tile handling.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
from werkzeug import Request, Response, exceptions
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
     6
from werkzeug.utils import redirect
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
     7
import werkzeug.urls
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
     9
import pngtile.application
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import pypngtile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
## Coordinates
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
# width of a tile
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    14
TILE_SIZE = 256
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    15
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    16
# maximum zoom out
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    17
MAX_ZOOM = 4
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
# max. output resolution to allow
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
MAX_PIXELS = 1920 * 1200
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
def scale (val, zoom):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
        Scale dimension by zoom factor
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
        zl > 0 -> bigger
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
        zl < 0 -> smaller
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    if zoom > 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        return val << zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    elif zoom < 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        return val >> -zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        return val
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
def scale_center (val, dim, zoom):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
        Scale value about center by zoom.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    44
    return scale(val, zoom) - dim / 2
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    46
class TileApplication (pngtile.application.PNGTileApplication):
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    47
    def __init__ (self, image_server, **opts):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    48
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    49
            image_server:       http://.../ url to image-server frontend
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    50
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    51
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    52
        super(TileApplication, self).__init__(**opts)
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    53
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    54
        self.image_server = image_server
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    56
    def image_url (self, name):
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    57
        return werkzeug.urls.Href(self.image_server)(path)
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    58
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    def render_region (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            Handle request for an image region
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        width = int(request.args['w'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        height = int(request.args['h'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        x = int(request.args['x'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        y = int(request.args['y'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    70
        # safety limit
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        if width * height > MAX_PIXELS:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
            raise exceptions.BadRequest("Image size: %d * %d > %d" % (width, height, MAX_PIXELS))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    74
        if zoom > MAX_ZOOM:
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    75
            raise exceptions.BadRequest("Image zoom: %d > %d" % (zoom, MAX_ZOOM))
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    76
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    77
        x = scale_center(x, width, zoom)
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    78
        y = scale_center(y, height, zoom)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
            return image.tile_mem(width, height, x, y, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    84
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    def render_tile (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
            Handle request for image tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    91
        width = TILE_SIZE
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    92
        height = TILE_SIZE
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    93
        x = int(request.args['x'])
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    94
        y = int(request.args['y'])
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        zoom = int(request.args.get('zoom', "0"))
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    96
        
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    97
        if zoom > MAX_ZOOM:
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    98
            raise exceptions.BadRequest("Image zoom: %d > %d" % (zoom, MAX_ZOOM))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   100
        x = scale(x * width, zoom)
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   101
        y = scale(y * height, zoom)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
            return image.tile_mem(width, height, x, y, zoom)
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   107
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   109
    def handle_dir (self, request, name, path):
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   111
            Redirect to the image frontend for a non-tile request.
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   113
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   114
        if not name.endswith('/'):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   115
            # avoid an additional redirect
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   116
            name += '/'
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   117
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   118
        return redirect(self.image_url(name))
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   119
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   120
    def handle_image (self, request, name, path):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   121
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   122
            Redirect to the image frontend for a non-tile request.
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   123
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   124
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   125
        return redirect(self.image_url(name))
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   126
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   127
    def handle (self, request):
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   128
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   129
            Handle request for an image
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   130
        """
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   131
        
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   132
        name, path, type = self.lookup(request.path)
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   133
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   134
        # determine handler
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   135
        if not type:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   136
            return self.handle_dir(request, name, path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   137
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   138
        elif not request.args:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   139
            return self.handle_image(request, name, path)
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   140
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   141
        elif 'w' in request.args and 'h' in request.args and 'x' in request.args and 'y' in request.args:
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   142
            render_func = self.render_region
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   144
        elif 'x' in request.args and 'y' in request.args:
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   145
            render_func = self.render_tile
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
            raise exceptions.BadRequest("Unknown args")
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   149
        
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   150
        # handle image
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   151
        image, name = self.open(request.path)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   153
        # http caching
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   154
        mtime = image.cache_mtime()
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   155
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   156
        if request.if_modified_since and mtime == request.if_modified_since:
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   157
            return Response(status=304)
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   158
            
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   159
        # render
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   160
        png = render_func(request, image)
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   161
        
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   162
        # response
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   163
        response = Response(png, content_type='image/png')
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   164
        response.last_modified = mtime
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   165
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   166
        return response
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   167
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   168