Skip to content

Commit 5a6dc68

Browse files
authored
refactor: quotas errors and query extension syntax handling (#104)
- handle `QuotaExceededError` raised by eodag (follows CS-SI/eodag#2139) - do not allow POST search request parameters with additional parameters outside of query extension
1 parent 2698f0a commit 5a6dc68

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

stac_fastapi/eodag/core.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from pygeofilter.backends.cql2_json import to_cql2
3434
from pygeofilter.parsers.cql2_json import parse as parse_json
3535
from pygeofilter.parsers.cql2_text import parse as parse_cql2_text
36+
from stac_fastapi.api.models import create_post_request_model
3637
from stac_fastapi.types.errors import NotFoundError
3738
from stac_fastapi.types.requests import get_base_url
3839
from stac_fastapi.types.rfc3339 import str_to_interval
@@ -448,6 +449,10 @@ async def post_search(
448449
:param kwargs: Additional keyword arguments.
449450
:returns: Found items.
450451
"""
452+
search_post_model = create_post_request_model(self.extensions)
453+
request_json = await request.json()
454+
search_post_model.model_validate(request_json, extra="forbid")
455+
451456
return await self._search_base(search_request, request)
452457

453458
async def get_search(

stac_fastapi/eodag/errors.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
MisconfiguredError,
3636
NoMatchingCollection,
3737
NotAvailableError,
38+
QuotaExceededError,
3839
RequestError,
3940
TimeOutError,
4041
UnsupportedCollection,
@@ -60,6 +61,7 @@
6061
UnsupportedProvider: status.HTTP_404_NOT_FOUND,
6162
ValidationError: status.HTTP_400_BAD_REQUEST,
6263
RequestError: status.HTTP_400_BAD_REQUEST,
64+
QuotaExceededError: status.HTTP_429_TOO_MANY_REQUESTS,
6365
}
6466

6567
logger = logging.getLogger(__name__)

tests/test_search.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,33 @@ async def test_request_params_invalid(bbox, request_not_valid, defaults):
3838
await request_not_valid(f"search?collections={defaults.collection}&bbox={bbox}")
3939

4040

41+
async def test_invalid_post_search_request(request_not_valid):
42+
"""
43+
Test if an invalid POST /search request body returns an error
44+
"""
45+
post_body = {
46+
"collections": ["S2_MSI_L1C"],
47+
"limit": 1,
48+
"sortby": [{"field": "datetime", "direction": "asc"}],
49+
"query": {"federation:backends": {"eq": "creodias_s3"}},
50+
"ecmwf:year": {"eq": "2000"}, # additional parameter outside of query
51+
}
52+
await request_not_valid("search", "POST", post_body)
53+
54+
55+
async def test_valid_post_search_request(request_valid):
56+
"""
57+
Test if a valid POST /search request body passes validation
58+
"""
59+
post_body = {
60+
"collections": ["S2_MSI_L1C"],
61+
"limit": 1,
62+
"sortby": [{"field": "datetime", "direction": "asc"}],
63+
"query": {"federation:backends": {"eq": "creodias_s3"}},
64+
}
65+
await request_valid(url="search", method="POST", post_data=post_body)
66+
67+
4168
@pytest.mark.parametrize("input_bbox,expected_geom", [(None, None), ("bbox_csv", "bbox_list")])
4269
async def test_request_params_valid(request_valid, defaults, input_bbox, expected_geom):
4370
"""

0 commit comments

Comments
 (0)