|
3 | 3 | from typing import Optional
|
4 | 4 | import time
|
5 | 5 | import uuid
|
| 6 | +import json |
6 | 7 | from elasticsearch import Elasticsearch
|
7 | 8 | from elasticsearch.exceptions import NotFoundError
|
8 | 9 | from elasticsearch_dsl import Document
|
9 | 10 | from fastapi import APIRouter, BackgroundTasks, HTTPException, Request, Response
|
10 |
| -from fastapi.responses import RedirectResponse |
| 11 | +from fastapi.responses import RedirectResponse, JSONResponse |
11 | 12 | from starlette.datastructures import URL
|
12 | 13 |
|
13 | 14 | from ..cache import (
|
|
26 | 27 | from ..drawing import generate_x_tile
|
27 | 28 | from ..elastic import get_es_headers, get_search_base
|
28 | 29 | from ..logger import logger
|
29 |
| -from ..parameters import extract_parameters, merge_generated_parameters |
| 30 | +from ..parameters import extract_parameters, merge_generated_parameters, SearchParams |
30 | 31 | from ..tilegen import (
|
31 | 32 | TILE_HEIGHT_PX,
|
32 | 33 | TILE_WIDTH_PX,
|
@@ -148,8 +149,8 @@ def cached_response(es, idx, x, y, z, params, parameter_hash) -> Optional[Respon
|
148 | 149 |
|
149 | 150 | try:
|
150 | 151 | es.update( # pylint: disable=E1123
|
151 |
| - ".datashader_tiles", |
152 |
| - tile_id(idx, x, y, z, parameter_hash), |
| 152 | + index=".datashader_tiles", |
| 153 | + id=tile_id(idx, x, y, z, parameter_hash), |
153 | 154 | body={"script" : {"source": "ctx._source.cache_hits++"}},
|
154 | 155 | retry_on_conflict=5,
|
155 | 156 | )
|
@@ -281,18 +282,21 @@ def generate_tile_to_cache(idx: str, x: int, y: int, z: int, params, parameter_h
|
281 | 282 | logger.debug("Releasing cache placeholder %s", rendering_tile_name(idx, x, y, z, parameter_hash))
|
282 | 283 | release_cache_placeholder(config.cache_path, rendering_tile_name(idx, x, y, z, parameter_hash))
|
283 | 284 |
|
284 |
| -async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks): |
| 285 | +async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks, post_params=None): |
285 | 286 | check_proxy_key(request.headers.get('tms-proxy-key'))
|
286 | 287 |
|
287 | 288 | es = Elasticsearch(
|
288 | 289 | config.elastic_hosts.split(","),
|
289 | 290 | verify_certs=False,
|
290 | 291 | timeout=120,
|
291 | 292 | )
|
292 |
| - |
| 293 | + if post_params is None: |
| 294 | + post_params = {} |
293 | 295 | # Get hash and parameters
|
294 | 296 | try:
|
295 |
| - parameter_hash, params = extract_parameters(request.headers, request.query_params) |
| 297 | + print(request.query_params) |
| 298 | + print(post_params) |
| 299 | + parameter_hash, params = extract_parameters(request.headers, {**request.query_params, **post_params}) |
296 | 300 | # try to build the dsl object bad filters cause exceptions that are then retried.
|
297 | 301 | # underlying elasticsearch_dsl doesn't support the elasticsearch 8 api yet so this causes requests to thrash
|
298 | 302 | # If the filters are bad or elasticsearch_dsl cannot build the request will never be completed so serve X tile
|
@@ -344,3 +348,14 @@ async def get_tms(idx: str, x: int, y: int, z: int, request: Request, background
|
344 | 348 | @router.get("/{already_waited}/{idx}/{z}/{x}/{y}.png")
|
345 | 349 | async def get_tms_after_wait(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks):
|
346 | 350 | return await fetch_or_render_tile(already_waited, idx, x, y, z, request, background_tasks)
|
| 351 | + |
| 352 | + |
| 353 | +@router.post("/{idx}/{z}/{x}/{y}.png") |
| 354 | +async def post_tile(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, params: SearchParams, background_tasks: BackgroundTasks): |
| 355 | + params = params.dict() |
| 356 | + params["params"] = json.dumps(params["params"]) |
| 357 | + response = await fetch_or_render_tile(0, idx, x, y, z, request, background_tasks, post_params=params) |
| 358 | + if isinstance(response, RedirectResponse): |
| 359 | + print(already_waited) |
| 360 | + return JSONResponse(status_code=200, content={"retry-after": response.headers['retry-after']}) |
| 361 | + return response |
0 commit comments