Skip to content

Commit f2ca6f7

Browse files
committed
fix: query in get requests
1 parent e04a25f commit f2ca6f7

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

pystac_client/item_search.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,8 @@ def _clean_params_for_get_request(self) -> Dict[str, Any]:
329329
params["collections"] = ",".join(params["collections"])
330330
if "intersects" in params:
331331
params["intersects"] = json.dumps(params["intersects"])
332+
if "query" in params:
333+
params["query"] = json.dumps(params["query"], separators=(",", ":"))
332334
if "sortby" in params:
333335
params["sortby"] = self._sortby_dict_to_str(params["sortby"])
334336
if "fields" in params:

pystac_client/stac_api_io.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import re
44
from copy import deepcopy
55
from typing import TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Union
6-
from urllib.parse import urlparse
6+
from urllib.parse import quote_plus, urlparse
77

88
import pystac
99
from pystac.link import Link
@@ -156,6 +156,8 @@ def request(
156156
params = deepcopy(parameters) or {}
157157
if "intersects" in params:
158158
params["intersects"] = json.dumps(params["intersects"])
159+
if "query" in params:
160+
params["query"] = quote_plus(params["query"])
159161
request = Request(method="GET", url=href, headers=headers, params=params)
160162
try:
161163
modified = self._req_modifier(request) if self._req_modifier else None
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
User-Agent:
12+
- python-requests/2.28.1
13+
method: GET
14+
uri: https://planetarycomputer.microsoft.com/api/stac/v1/search?limit=1&query=%257B%2522eo%253Acloud_cover%2522%253A%257B%2522gte%2522%253A0%252C%2522lte%2522%253A10%257D%257D
15+
response:
16+
body:
17+
string: '{"code":"JSONDecodeError","description":"expected value at line 1 column
18+
1: line 1 column 1 (char 0)"}'
19+
headers:
20+
Access-Control-Allow-Credentials:
21+
- 'true'
22+
Access-Control-Allow-Origin:
23+
- '*'
24+
Content-Length:
25+
- '102'
26+
Content-Type:
27+
- application/json
28+
Date:
29+
- Mon, 28 Nov 2022 21:53:33 GMT
30+
Strict-Transport-Security:
31+
- max-age=15724800; includeSubDomains
32+
X-Azure-Ref:
33+
- 03S2FYwAAAABLnSOpJunVSqWWSDOh2Pv9REVOMzAxMDAwMTEwMDExADkyN2FiZmE2LTE5ZjYtNGFmMS1hMDlkLWM5NTlkOWExZTY0NA==
34+
X-Cache:
35+
- CONFIG_NOCACHE
36+
status:
37+
code: 500
38+
message: Internal Server Error
39+
version: 1

tests/test_item_search.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,19 @@ def __geo_interface__(self) -> Dict[str, Any]:
619619
new_results = search.items()
620620
assert all(isinstance(item, pystac.Item) for item in new_results)
621621

622+
@pytest.mark.vcr
623+
def test_get_with_query(self) -> None:
624+
items = list(
625+
ItemSearch(
626+
url=SEARCH_URL,
627+
method="GET",
628+
query={"eo:cloud_cover": {"gte": 0, "lte": 10}},
629+
limit=1,
630+
max_items=1,
631+
).items()
632+
)
633+
assert len(items) == 1
634+
622635
@pytest.mark.vcr
623636
def test_result_paging(self) -> None:
624637
search = ItemSearch(

0 commit comments

Comments
 (0)