Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions stac_fastapi/pgstac/models/links.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand Down
36 changes: 36 additions & 0 deletions tests/api/test_links.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Loading