Skip to content

Commit bc3d32e

Browse files
committed
add Accept header support
1 parent f5f89f4 commit bc3d32e

4 files changed

Lines changed: 37 additions & 4 deletions

File tree

pygeoapi/api/__init__.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,14 @@ def _get_locale(self, headers: dict,
320320

321321
return raw, default_locale
322322

323-
def _get_format(self, headers: dict) -> Union[str, None]:
323+
def _get_format(self, headers: dict,
324+
extra_formats: dict = {}) -> Union[str, None]:
324325
"""
325326
Get `Request` format type from query parameters or headers.
326327
327328
:param headers: Dict of Request headers
329+
:param extra_formats: Dict of extra dataset specific formats
330+
328331
:returns: format value or None if not found/specified
329332
"""
330333

@@ -340,10 +343,14 @@ def _get_format(self, headers: dict) -> Union[str, None]:
340343
if types_ is None:
341344
return
342345

343-
(fmts, mimes) = zip(*FORMAT_TYPES.items())
346+
merged_format_types = FORMAT_TYPES | extra_formats
347+
348+
(fmts, mimes) = zip(*merged_format_types.items())
349+
mimes2 = [m.split(';')[0] for m in mimes]
350+
344351
for type_ in types_:
345-
if type_ in mimes:
346-
idx_ = mimes.index(type_)
352+
if type_ in mimes2:
353+
idx_ = mimes2.index(type_)
347354
return fmts[idx_]
348355

349356
@property

pygeoapi/api/itemtypes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ def get_collection_items(
354354
LOGGER.debug('Validating requested format')
355355
dataset_formatters = get_dataset_formatters(collections[dataset])
356356

357+
if dataset_formatters:
358+
LOGGER.debug(f'Dataset formatters: {dataset_formatters}')
359+
request._format = request._get_format(
360+
request.get_request_headers(request.headers),
361+
{v.f: v.mimetype for v in dataset_formatters.values()})
362+
363+
LOGGER.debug(f'Request format: {request.format}')
364+
357365
if not request.is_valid(dataset_formatters.keys()):
358366
return api.get_format_exception(request)
359367

pygeoapi/formatter/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(self, formatter_def: dict):
4545
"""
4646

4747
self.extension = None
48+
self.f = None
4849
self.mimetype = None
4950

5051
try:

tests/api/test_itemtypes.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,23 @@ def test_get_collection_items(config, api_):
400400

401401
assert code == HTTPStatus.BAD_REQUEST
402402

403+
# test Accept header for dataset formatters
404+
req = mock_api_request(HTTP_ACCEPT='application/json')
405+
rsp_headers, code, response = get_collection_items(api_, req, 'obs')
406+
assert rsp_headers['Content-Type'] == 'application/json'
407+
408+
req = mock_api_request(HTTP_ACCEPT='text/csv')
409+
rsp_headers, code, response = get_collection_items(api_, req, 'obs')
410+
assert rsp_headers['Content-Type'] == 'text/csv; charset=utf-8'
411+
412+
req = mock_api_request({'f': 'json'}, HTTP_ACCEPT='text/csv')
413+
rsp_headers, code, response = get_collection_items(api_, req, 'obs')
414+
assert rsp_headers['Content-Type'] == 'application/json'
415+
416+
req = mock_api_request({'f': 'csv'}, HTTP_ACCEPT='application/json')
417+
rsp_headers, code, response = get_collection_items(api_, req, 'obs')
418+
assert rsp_headers['Content-Type'] == 'text/csv; charset=utf-8'
419+
403420

404421
def test_get_collection_items_include_extra_query_parameters(config, api_):
405422
req = mock_api_request()

0 commit comments

Comments
 (0)