pngtile/tile.py
author Tero Marttila <terom@qmsk.net>
Sat, 04 Oct 2014 03:28:57 +0300
changeset 175 16ab69a5569a
parent 174 58c9e2de0dd4
child 182 cc6c6e7fd39a
permissions -rw-r--r--
pngtile: fix multiple bugs with region-link centering
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
175
16ab69a5569a pngtile: fix multiple bugs with region-link centering
Tero Marttila <terom@qmsk.net>
parents: 174
diff changeset
    46
    return scale(val - dim / 2, zoom)
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):
173
e7822b0be417 pngtile.tile: change to providing a short Cache-Control: max-age for unknown-url-time images
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    49
    # age in seconds for caching an unknown-mtime image for revalidates
e7822b0be417 pngtile.tile: change to providing a short Cache-Control: max-age for unknown-url-time images
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    50
    MIN_AGE = 10 # 10 seconds
e7822b0be417 pngtile.tile: change to providing a short Cache-Control: max-age for unknown-url-time images
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
    51
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
    52
    # 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
    53
    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
    54
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    55
    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
    56
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    57
            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
    58
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    59
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    60
        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
    61
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
    62
        self.image_server = image_server
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    64
    def image_url (self, name):
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    65
        return werkzeug.urls.Href(self.image_server)(path)
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    66
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    def render_region (self, request, image):
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
            Handle request for an image region
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        width = int(request.args['w'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        height = int(request.args['h'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        x = int(request.args['x'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        y = int(request.args['y'])
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        zoom = int(request.args.get('zoom', "0"))
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    78
        # safety limit
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        if width * height > MAX_PIXELS:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
            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
    81
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    82
        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
    83
            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
    84
144
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    85
        x = scale_center(x, width, zoom)
5b2b866ad0a3 pngtile.tile: fix render_region centering
Tero Marttila <terom@paivola.fi>
parents: 140
diff changeset
    86
        y = scale_center(y, height, zoom)
135
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
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            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
    90
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
    92
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
    def render_tile (self, request, image):
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
            Handle request for image tile
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        """
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
    99
        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
   100
        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
   101
        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
   102
        y = int(request.args['y'])
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        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
   104
        
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   105
        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
   106
            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
   107
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   108
        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
   109
        y = scale(y * height, zoom)
135
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
        try:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            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
   113
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        except pypngtile.Error as error:
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   115
            raise exceptions.InternalServerError(str(error))
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   117
    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
   118
        """
165
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   119
            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
   120
        """
165
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
        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
   123
            # 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
   124
            name += '/'
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   125
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   126
        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
   127
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   128
    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
   129
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   130
            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
   131
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   132
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   133
        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
   134
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   135
    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
   136
        """
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   137
            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
   138
        """
167
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   139
        
16b600e927fe pngtile.tile: update for PNGTileApplication
Tero Marttila <terom@qmsk.net>
parents: 165
diff changeset
   140
        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
   141
        
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   142
        # determine handler
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   143
        if not type:
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_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
   145
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   146
        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
   147
            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
   148
1dc09e81a4e2 pngtile.tile: handle dir/image requests by redirecting to image_server
Tero Marttila <terom@qmsk.net>
parents: 144
diff changeset
   149
        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
   150
            render_func = self.render_region
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
140
a3bbecbd31e7 pngtile.tile: limit zoom; fix tile row/col mixup with just x/y
Tero Marttila <terom@paivola.fi>
parents: 138
diff changeset
   152
        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
   153
            render_func = self.render_tile
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        else:
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
            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
   157
        
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   158
        # handle image
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   159
        image, name = self.open(request.path)
135
e99dd75afa15 pngtile.tile: separate Application dedicated to PNG serving
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   161
        # http caching
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   162
        mtime = image.cache_mtime()
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   163
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
   164
        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
   165
            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
   166
                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
   167
            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
   168
                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
   169
        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
   170
            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
   171
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   172
        if request.if_modified_since and mtime == request.if_modified_since:
174
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   173
            response = Response(status=304)
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   174
        else:
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   175
            # render 
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   176
            png = render_func(request, image)
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   177
        
174
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   178
            response = Response(png, content_type='image/png')
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   179
        
58c9e2de0dd4 pngtile.cache: set last_modified/cache-control in 304 response as well..
Tero Marttila <terom@qmsk.net>
parents: 173
diff changeset
   180
        # cache out
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   181
        response.last_modified = mtime
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   182
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
   183
        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
   184
            # cached item may change while url stays the same
173
e7822b0be417 pngtile.tile: change to providing a short Cache-Control: max-age for unknown-url-time images
Tero Marttila <terom@qmsk.net>
parents: 172
diff changeset
   185
            response.headers['Cache-Control'] = 'max-age={min_age:d}'.format(min_age=self.MIN_AGE)
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
   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
        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
   188
            # 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
   189
            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
   190
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
   191
        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
   192
            # 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
   193
            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
   194
171
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   195
        return response
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   196
0ff809f855f7 pngtile.tile: implement Last-Modified/If-Modified-Since caching
Tero Marttila <terom@qmsk.net>
parents: 167
diff changeset
   197