33from typing import Optional
44import time
55import uuid
6+ import json
67from elasticsearch import Elasticsearch
78from elasticsearch .exceptions import NotFoundError
89from elasticsearch_dsl import Document
910from fastapi import APIRouter , BackgroundTasks , HTTPException , Request , Response
10- from fastapi .responses import RedirectResponse
11+ from fastapi .responses import RedirectResponse , JSONResponse
1112from starlette .datastructures import URL
1213
1314from ..cache import (
2627from ..drawing import generate_x_tile
2728from ..elastic import get_es_headers , get_search_base
2829from ..logger import logger
29- from ..parameters import extract_parameters , merge_generated_parameters
30+ from ..parameters import extract_parameters , merge_generated_parameters , SearchParams
3031from ..tilegen import (
3132 TILE_HEIGHT_PX ,
3233 TILE_WIDTH_PX ,
@@ -148,8 +149,8 @@ def cached_response(es, idx, x, y, z, params, parameter_hash) -> Optional[Respon
148149
149150 try :
150151 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 ),
153154 body = {"script" : {"source" : "ctx._source.cache_hits++" }},
154155 retry_on_conflict = 5 ,
155156 )
@@ -281,7 +282,7 @@ def generate_tile_to_cache(idx: str, x: int, y: int, z: int, params, parameter_h
281282 logger .debug ("Releasing cache placeholder %s" , rendering_tile_name (idx , x , y , z , parameter_hash ))
282283 release_cache_placeholder (config .cache_path , rendering_tile_name (idx , x , y , z , parameter_hash ))
283284
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 = {} ):
285286 check_proxy_key (request .headers .get ('tms-proxy-key' ))
286287
287288 es = Elasticsearch (
@@ -292,7 +293,9 @@ async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z:
292293
293294 # Get hash and parameters
294295 try :
295- parameter_hash , params = extract_parameters (request .headers , request .query_params )
296+ print (request .query_params )
297+ print (post_params )
298+ parameter_hash , params = extract_parameters (request .headers , {** request .query_params ,** post_params })
296299 # try to build the dsl object bad filters cause exceptions that are then retried.
297300 # underlying elasticsearch_dsl doesn't support the elasticsearch 8 api yet so this causes requests to thrash
298301 # If the filters are bad or elasticsearch_dsl cannot build the request will never be completed so serve X tile
@@ -344,3 +347,18 @@ async def get_tms(idx: str, x: int, y: int, z: int, request: Request, background
344347@router .get ("/{already_waited}/{idx}/{z}/{x}/{y}.png" )
345348async def get_tms_after_wait (already_waited : int , idx : str , x : int , y : int , z : int , request : Request , background_tasks : BackgroundTasks ):
346349 return await fetch_or_render_tile (already_waited , idx , x , y , z , request , background_tasks )
350+
351+
352+ @router .post ("/{idx}/{z}/{x}/{y}.png" )
353+ async def post_tile (already_waited : int ,idx : str , x : int , y : int , z : int , request : Request ,params : SearchParams , background_tasks : BackgroundTasks ):
354+ params = params .dict ()
355+ params ["params" ] = json .dumps (params ["params" ])
356+ response = await fetch_or_render_tile (0 , idx , x , y , z , request , background_tasks ,post_params = params )
357+ if isinstance (response ,RedirectResponse ):
358+ print (response .headers )
359+ return JSONResponse (status_code = 200 , content = {"retry-after" :response .headers ['retry-after' ]})
360+ return response
361+
362+
363+
364+
0 commit comments