-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathdependencies.py
47 lines (38 loc) · 1.67 KB
/
dependencies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Standard Library Imports
import typing
from datetime import datetime
# Third Party Imports
from fastapi import Depends
from fastapi import Header
from fastapi import HTTPException
def max_retries(count: int = 20):
"""
Raises a http exception (with status 200) after max retries are exhausted
"""
def retries_dep(meta: CloudTasksHeaders = Depends()) -> bool:
# count starts from 0 so equality check is required
if meta.retry_count >= count:
raise HTTPException(status_code=200, detail="Max retries exhausted")
return retries_dep
class CloudTasksHeaders:
"""
Extracts known headers sent by Cloud Tasks
Full list: https://cloud.google.com/tasks/docs/creating-http-target-tasks#handler
"""
def __init__(
self,
x_cloudtasks_taskretrycount: typing.Optional[int] = Header(0),
x_cloudtasks_taskexecutioncount: typing.Optional[int] = Header(0),
x_cloudtasks_queuename: typing.Optional[str] = Header(""),
x_cloudtasks_taskname: typing.Optional[str] = Header(""),
x_cloudtasks_tasketa: typing.Optional[float] = Header(0),
x_cloudtasks_taskpreviousresponse: typing.Optional[int] = Header(0),
x_cloudtasks_taskretryreason: typing.Optional[str] = Header(""),
) -> None:
self.retry_count = x_cloudtasks_taskretrycount
self.execution_count = x_cloudtasks_taskexecutioncount
self.queue_name = x_cloudtasks_queuename
self.task_name = x_cloudtasks_taskname
self.eta = datetime.fromtimestamp(x_cloudtasks_tasketa)
self.previous_response = x_cloudtasks_taskpreviousresponse
self.retry_reason = x_cloudtasks_taskretryreason