From: Sarah Hoffmann Date: Sun, 6 Aug 2023 15:20:16 +0000 (+0200) Subject: provide full URL in more field X-Git-Tag: v4.3.0~39 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/996026e5ed9f1f07e618b67de9077c3e338c0302 provide full URL in more field This is a regression against the PHP version. Fixes #3138. --- diff --git a/nominatim/api/v1/server_glue.py b/nominatim/api/v1/server_glue.py index d83adaae..d1bcc1da 100644 --- a/nominatim/api/v1/server_glue.py +++ b/nominatim/api/v1/server_glue.py @@ -69,6 +69,11 @@ class ASGIAdaptor(abc.ABC): body of the response to 'output'. """ + @abc.abstractmethod + def base_uri(self) -> str: + """ Return the URI of the original request. + """ + @abc.abstractmethod def config(self) -> Configuration: @@ -481,7 +486,7 @@ async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A (str(r.place_id) for r in results if r.place_id)) queryparts['format'] = fmt - moreurl = urlencode(queryparts) + moreurl = params.base_uri() + '/search?' + urlencode(queryparts) else: moreurl = '' diff --git a/nominatim/server/falcon/server.py b/nominatim/server/falcon/server.py index 196c519f..e551e542 100644 --- a/nominatim/server/falcon/server.py +++ b/nominatim/server/falcon/server.py @@ -67,6 +67,9 @@ class ParamWrapper(api_impl.ASGIAdaptor): self.response.content_type = self.content_type + def base_uri(self) -> str: + return cast (str, self.request.forwarded_prefix) + def config(self) -> Configuration: return self._config diff --git a/nominatim/server/starlette/server.py b/nominatim/server/starlette/server.py index f89e52a1..5567ac9c 100644 --- a/nominatim/server/starlette/server.py +++ b/nominatim/server/starlette/server.py @@ -50,6 +50,19 @@ class ParamWrapper(api_impl.ASGIAdaptor): return Response(output, status_code=status, media_type=self.content_type) + def base_uri(self) -> str: + scheme = self.request.url.scheme + host = self.request.url.hostname + port = self.request.url.port + root = self.request.scope['root_path'] + if (scheme == 'http' and port == 80) or (scheme == 'https' and port == 443): + port = None + if port is not None: + return f"{scheme}://{host}:{port}{root}" + + return f"{scheme}://{host}{root}" + + def config(self) -> Configuration: return cast(Configuration, self.request.app.state.API.config) diff --git a/test/python/api/fake_adaptor.py b/test/python/api/fake_adaptor.py index f04381db..d886d34e 100644 --- a/test/python/api/fake_adaptor.py +++ b/test/python/api/fake_adaptor.py @@ -47,6 +47,9 @@ class FakeAdaptor(glue.ASGIAdaptor): return FakeResponse(status, output, self.content_type) + def base_uri(self) -> str: + return 'http://test' + def config(self): return self._config