# 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 starlette webserver framework. """ from pathlib import Path from starlette.applications import Starlette from starlette.routing import Route from starlette.exceptions import HTTPException from starlette.responses import Response from nominatim.api import NominatimAPIAsync from nominatim.apicmd.status import StatusResult import nominatim.result_formatter.v1 as formatting CONTENT_TYPE = { 'text': 'text/plain; charset=utf-8', 'xml': 'text/xml; charset=utf-8' } FORMATTERS = { StatusResult: formatting.create(StatusResult) } def parse_format(request, rtype, default): fmt = request.query_params.get('format', default=default) fmtter = FORMATTERS[rtype] if not fmtter.supports_format(fmt): raise HTTPException(400, detail="Parameter 'format' must be one of: " + ', '.join(fmtter.list_formats())) request.state.format = fmt request.state.formatter = fmtter def format_response(request, result): fmt = request.state.format return Response(request.state.formatter.format(result, fmt), media_type=CONTENT_TYPE.get(fmt, 'application/json')) async def on_status(request): parse_format(request, StatusResult, 'text') result = await request.app.state.API.status() return format_response(request, result) V1_ROUTES = [ Route('/status', endpoint=on_status) ] def get_application(project_dir: Path) -> Starlette: app = Starlette(debug=True, routes=V1_ROUTES) app.state.API = NominatimAPIAsync(project_dir) return app