diff --git a/CHANGES.md b/CHANGES.md index 06a2d9e..02edcfc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - fix root-path handling when setting via env var or on app instance - Allow `q` parameter to be a `str` not a `list[str]` for Advanced Free-Text extension +- do not `unquote` parameters for next/prev links ### Changed diff --git a/stac_fastapi/pgstac/models/links.py b/stac_fastapi/pgstac/models/links.py index 42b5cf7..64c56fe 100644 --- a/stac_fastapi/pgstac/models/links.py +++ b/stac_fastapi/pgstac/models/links.py @@ -1,7 +1,7 @@ """link helpers.""" from typing import Any, Dict, List, Optional -from urllib.parse import ParseResult, parse_qs, unquote, urlencode, urljoin, urlparse +from urllib.parse import ParseResult, parse_qs, urlencode, urljoin, urlparse import attr from stac_fastapi.types.requests import get_base_url @@ -24,7 +24,7 @@ def merge_params(url: str, newparams: Dict) -> str: u = urlparse(url) params = parse_qs(u.query) params.update(newparams) - param_string = unquote(urlencode(params, True)) + param_string = urlencode(params, True) href = ParseResult( scheme=u.scheme, diff --git a/tests/api/test_links.py b/tests/api/test_links.py index e8e57a9..a850501 100644 --- a/tests/api/test_links.py +++ b/tests/api/test_links.py @@ -1,3 +1,6 @@ +import json +from urllib.parse import parse_qs, urlparse + import pytest from fastapi import APIRouter, FastAPI from starlette.requests import Request @@ -104,3 +107,36 @@ async def collections(request: Request): assert link["method"] == "GET" assert link["href"].startswith(url_prefix) assert {"next", "previous", "root", "self"} == {link["rel"] for link in links} + + polygon = { + "type": "Polygon", + "coordinates": [ + [ + (-180.0, -90.0), + (180.0, -90.0), + (180.0, 90.0), + (-180.0, 90.0), + (-180.0, -90.0), + ] + ], + } + + response = client.get( + f"{prefix}/search", params={"limit": 1, "intersects": json.dumps(polygon)} + ) + assert "intersects=%7B%22type%" in str(response.url) + assert "limit=1" in str(response.url) + assert response.status_code == 200 + assert "intersects=%7B%22type%" in response.json()["url"] + assert "limit=1" in response.json()["url"] + links = response.json()["links"] + for link in links: + if link["rel"] in ["previous", "next"]: + assert link["method"] == "GET" + assert "intersects=%7B%22type%" in link["href"] + u = urlparse(link["href"]) + params = parse_qs(u.query) + assert params["limit"][0] == "1" + assert params["intersects"][0] == json.dumps(polygon) + r = client.get(link["href"]) + assert r.status_code == 200