pngtile/tile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 02:19:43 +0300
changeset 172 73380dd6a816
parent 171 0ff809f855f7
child 173 e7822b0be417
permissions -rw-r--r--
pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
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
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
    12
import datetime
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
    13
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
## Coordinates
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
# 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
    16
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
    17
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    18
# 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
    19
MAX_ZOOM = 4
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
# max. output resolution to allow
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
MAX_PIXELS = 1920 * 1200
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
def scale (val, zoom):
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
        Scale dimension by zoom factor
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        zl > 0 -> bigger
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        zl < 0 -> smaller
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    if zoom > 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        return val << zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    elif zoom < 0:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        return val >> -zoom
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
        return val
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
def scale_center (val, dim, 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
        Scale value about center by zoom.
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    46
    return scale(val, zoom) - dim / 2
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    48
class TileApplication (pngtile.application.PNGTileApplication):
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
    49
    # age in seconds for caching a known-mtime image
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
    50
    MAX_AGE = 7 * 24 * 60 * 60 # 1 week
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
    51
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    52
    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
    53
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    54
            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
    55
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    56
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    57
        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
    58
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    59
        self.image_server = image_server
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    61
    def image_url (self, name):
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    62
        return werkzeug.urls.Href(self.image_server)(path)
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    63
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    def render_region (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
            Handle request for an image region
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
        width = int(request.args['w'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        height = int(request.args['h'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        x = int(request.args['x'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        y = int(request.args['y'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    75
        # safety limit
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        if width * height > MAX_PIXELS:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
            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
    78
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    79
        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
    80
            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
    81
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    82
        x = scale_center(x, width, zoom)
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    83
        y = scale_center(y, height, zoom)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
            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
    87
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    89
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
    def render_tile (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            Handle request for image tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
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
        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
    97
        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
    98
        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
    99
        y = int(request.args['y'])
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
        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
   101
        
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   102
        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
   103
            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
   104
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   105
        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
   106
        y = scale(y * height, zoom)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
            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
   110
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   112
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   114
    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
   115
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   116
            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
   117
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   118
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   119
        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
   120
            # 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
   121
            name += '/'
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   122
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   123
        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
   124
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   125
    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
   126
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   127
            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
   128
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   129
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   130
        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
   131
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   132
    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
   133
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   134
            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
   135
        """
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   136
        
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   137
        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
   138
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   139
        # determine handler
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   140
        if not type:
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   141
            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
   142
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   143
        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
   144
            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
   145
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   146
        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
   147
            render_func = self.render_region
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   149
        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
   150
            render_func = self.render_tile
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
        else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
            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
   154
        
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   155
        # handle image
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   156
        image, name = self.open(request.path)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   158
        # http caching
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   159
        mtime = image.cache_mtime()
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   160
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   161
        if 't' in request.args:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   162
            try:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   163
                ttime = datetime.datetime.utcfromtimestamp(int(request.args['t']))
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   164
            except ValueError:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   165
                ttime = None
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   166
        else:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   167
            ttime = None
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   168
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   169
        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
   170
            return Response(status=304)
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   171
            
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   172
        # render
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   173
        png = render_func(request, image)
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   174
        
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   175
        # response
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   176
        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
   177
        response.last_modified = mtime
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   178
172
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   179
        if not ttime:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   180
            # cached item may change while url stays the same
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   181
            response.headers['Cache-Control'] = 'must-revalidate'
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   182
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   183
        elif ttime == mtime:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   184
            # url will change if content changes
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   185
            response.headers['Cache-Control'] = 'max-age={max_age:d}'.format(max_age=self.MAX_AGE)
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   186
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   187
        else:
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   188
            # XXX: mismatch wtf
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   189
            response.headers['Cache-Control'] = 'must-revalidate'
73380dd6a816 pngtile: include ?t= in tile urls and generate large cache-control max-age's for those that match
Tero Marttila <terom@qmsk.net>
parents: 171
diff changeset
   190
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   191
        return response
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   192
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   193