Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit d8cc2ca

Browse files
committedJan 21, 2025·
Optionnally provide request HTTP headers to processors
1 parent 29b507f commit d8cc2ca

File tree

7 files changed

+34
-9
lines changed

7 files changed

+34
-9
lines changed
 

‎pygeoapi/api/processes.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,8 @@ def execute_process(api: API, request: APIRequest,
495495
process_id, data_dict, execution_mode=execution_mode,
496496
requested_outputs=requested_outputs,
497497
subscriber=subscriber,
498-
requested_response=requested_response)
498+
requested_response=requested_response,
499+
request_headers=request.headers)
499500
job_id, mime_type, outputs, status, additional_headers = result
500501
headers.update(additional_headers or {})
501502

‎pygeoapi/process/base.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def __init__(self, processor_def: dict, process_metadata: dict):
5353
self.name = processor_def['name']
5454
self.metadata = process_metadata
5555
self.supports_outputs = False
56+
self.supports_request_headers = False
5657

5758
def set_job_id(self, job_id: str) -> None:
5859
"""
@@ -70,7 +71,8 @@ def set_job_id(self, job_id: str) -> None:
7071

7172
pass
7273

73-
def execute(self, data: dict, outputs: Optional[dict] = None
74+
def execute(self, data: dict, outputs: Optional[dict] = None,
75+
request_headers: Optional[dict] = None
7476
) -> Tuple[str, Any]:
7577
"""
7678
execute the process
@@ -81,6 +83,8 @@ def execute(self, data: dict, outputs: Optional[dict] = None
8183
required outputs - defaults to all outputs.
8284
The value of any key may be an object and include the
8385
property `transmissionMode` - defaults to `value`.
86+
:param request_headers: `dict` optionally specifying the headers from
87+
the request
8488
:returns: tuple of MIME type and process response
8589
(string or bytes, or dict)
8690
"""

‎pygeoapi/process/manager/base.py

+20-6
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def __init__(self, manager_def: dict):
7676
self.name = manager_def['name']
7777
self.is_async = False
7878
self.supports_subscribing = False
79+
self.supports_request_headers = False
7980
self.connection = manager_def.get('connection')
8081
self.output_dir = manager_def.get('output_dir')
8182

@@ -194,7 +195,8 @@ def _execute_handler_async(self, p: BaseProcessor, job_id: str,
194195
data_dict: dict,
195196
requested_outputs: Optional[dict] = None,
196197
subscriber: Optional[Subscriber] = None,
197-
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value # noqa
198+
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value, # noqa
199+
request_headers: Optional[dict] = None
198200
) -> Tuple[str, None, JobStatus]:
199201
"""
200202
This private execution handler executes a process in a background
@@ -215,13 +217,15 @@ def _execute_handler_async(self, p: BaseProcessor, job_id: str,
215217
:param subscriber: optional `Subscriber` specifying callback URLs
216218
:param requested_response: `RequestedResponse` optionally specifying
217219
raw or document (default is `raw`)
220+
:param request_headers: `dict` optionally specifying the headers from
221+
the request
218222
219223
:returns: tuple of None (i.e. initial response payload)
220224
and JobStatus.accepted (i.e. initial job status)
221225
"""
222226

223227
args = (p, job_id, data_dict, requested_outputs, subscriber,
224-
requested_response)
228+
requested_response, request_headers)
225229

226230
_process = dummy.Process(target=self._execute_handler_sync, args=args)
227231
_process.start()
@@ -232,7 +236,8 @@ def _execute_handler_sync(self, p: BaseProcessor, job_id: str,
232236
data_dict: dict,
233237
requested_outputs: Optional[dict] = None,
234238
subscriber: Optional[Subscriber] = None,
235-
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value # noqa
239+
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value, # noqa
240+
request_headers: Optional[dict] = None
236241
) -> Tuple[str, Any, JobStatus]:
237242
"""
238243
Synchronous execution handler
@@ -254,16 +259,20 @@ def _execute_handler_sync(self, p: BaseProcessor, job_id: str,
254259
:param subscriber: optional `Subscriber` specifying callback URLs
255260
:param requested_response: `RequestedResponse` optionally specifying
256261
raw or document (default is `raw`)
262+
:param request_headers: `dict` optionally specifying the headers from
263+
the request
257264
258265
:returns: tuple of MIME type, response payload and status
259266
"""
260267

261268
extra_execute_parameters = {}
262269

263-
# only pass requested_outputs if supported,
270+
# only pass requested_outputs and request_headers if supported,
264271
# otherwise this breaks existing processes
265272
if p.supports_outputs:
266273
extra_execute_parameters['outputs'] = requested_outputs
274+
if p.supports_request_headers:
275+
extra_execute_parameters['request_headers'] = request_headers
267276

268277
self._send_in_progress_notification(subscriber)
269278

@@ -358,7 +367,8 @@ def execute_process(
358367
execution_mode: Optional[RequestedProcessExecutionMode] = None,
359368
requested_outputs: Optional[dict] = None,
360369
subscriber: Optional[Subscriber] = None,
361-
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value # noqa
370+
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value, # noqa
371+
request_headers: Optional[dict] = None
362372
) -> Tuple[str, Any, JobStatus, Optional[Dict[str, str]]]:
363373
"""
364374
Default process execution handler
@@ -377,6 +387,8 @@ def execute_process(
377387
:param subscriber: `Subscriber` optionally specifying callback urls
378388
:param requested_response: `RequestedResponse` optionally specifying
379389
raw or document (default is `raw`)
390+
:param request_headers: `dict` optionally specifying the headers from
391+
the request
380392
381393
382394
:raises UnknownProcessError: if the input process_id does not
@@ -443,10 +455,12 @@ def execute_process(
443455
}
444456
self.add_job(job_metadata)
445457

446-
# only pass subscriber if supported, otherwise this breaks
458+
# only pass subscriber and headers if supported, otherwise this breaks
447459
# existing managers
448460
if self.supports_subscribing:
449461
extra_execute_handler_parameters['subscriber'] = subscriber
462+
if self.supports_request_headers:
463+
extra_execute_handler_parameters['request_headers'] = request_headers # noqa
450464

451465
# TODO: handler's response could also be allowed to include more HTTP
452466
# headers

‎pygeoapi/process/manager/dummy.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def execute_process(
7979
execution_mode: Optional[RequestedProcessExecutionMode] = None,
8080
requested_outputs: Optional[dict] = None,
8181
subscriber: Optional[Subscriber] = None,
82-
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value # noqa
82+
requested_response: Optional[RequestedResponse] = RequestedResponse.raw.value, # noqa
83+
request_headers: Optional[dict] = None
8384
) -> Tuple[str, str, Any, JobStatus, Optional[Dict[str, str]]]:
8485
"""
8586
Default process execution handler
@@ -95,6 +96,8 @@ def execute_process(
9596
:param subscriber: `Subscriber` optionally specifying callback urls
9697
:param requested_response: `RequestedResponse` optionally specifying
9798
raw or document (default is `raw`)
99+
:param request_headers: `dict` optionally specifying the headers from
100+
the request
98101
99102
:raises UnknownProcessError: if the input process_id does not
100103
correspond to a known process

‎pygeoapi/process/manager/mongodb_.py

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def __init__(self, manager_def):
4747
super().__init__(manager_def)
4848
self.is_async = True
4949
self.supports_subscribing = True
50+
self.supports_request_headers = True
5051

5152
def _connect(self):
5253
try:

‎pygeoapi/process/manager/postgresql.py

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def __init__(self, manager_def: dict):
7979
self.is_async = True
8080
self.id_field = 'identifier'
8181
self.supports_subscribing = True
82+
self.supports_request_headers = True
8283
self.connection = manager_def['connection']
8384

8485
try:

‎pygeoapi/process/manager/tinydb_.py

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def __init__(self, manager_def: dict):
6363
super().__init__(manager_def)
6464
self.is_async = True
6565
self.supports_subscribing = True
66+
self.supports_request_headers = True
6667

6768
@contextmanager
6869
def _db(self):

0 commit comments

Comments
 (0)
Please sign in to comment.