# SPDX-License-Identifier: GPL-2.0-only # # This file is part of Nominatim. (https://nominatim.org) # # Copyright (C) 2022 by the Nominatim developer community. # For a full list of authors see the git log. """ Server implementation using the sanic webserver framework. """ from pathlib import Path import sanic from nominatim.api import NominatimAPIAsync from nominatim.apicmd.status import StatusResult import nominatim.result_formatter.v1 as formatting api = sanic.Blueprint('NominatimAPI') CONTENT_TYPE = { 'text': 'text/plain; charset=utf-8', 'xml': 'text/xml; charset=utf-8' } def usage_error(msg): return sanic.response.text(msg, status=400) def api_response(request, result): body = request.ctx.formatter.format(result, request.ctx.format) return sanic.response.text(body, content_type=CONTENT_TYPE.get(request.ctx.format, 'application/json')) @api.on_request async def extract_format(request): request.ctx.formatter = request.app.ctx.formatters[request.route.ctx.result_type] request.ctx.format = request.args.get('format', request.route.ctx.default_format) if not request.ctx.formatter.supports_format(request.ctx.format): return usage_error("Parameter 'format' must be one of: " + ', '.join(request.ctx.formatter.list_formats())) @api.get('/status', ctx_result_type=StatusResult, ctx_default_format='text') async def status(request): return api_response(request,await request.app.ctx.api.status()) def get_application(project_dir: Path) -> sanic.Sanic: app = sanic.Sanic("NominatimInstance") app.ctx.api = NominatimAPIAsync(project_dir) app.ctx.formatters = {} for rtype in (StatusResult, ): app.ctx.formatters[rtype] = formatting.create(rtype) app.blueprint(api) return app