-
-
Notifications
You must be signed in to change notification settings - Fork 132
/
Copy pathrequests.py
151 lines (115 loc) · 4.16 KB
/
requests.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from typing import Dict
from typing import Optional
from werkzeug.datastructures import Headers
from werkzeug.datastructures import ImmutableMultiDict
from openapi_core.contrib.aws.datatypes import APIGatewayEvent
from openapi_core.contrib.aws.datatypes import APIGatewayEventV2
from openapi_core.contrib.aws.types import APIGatewayEventPayload
from openapi_core.datatypes import RequestParameters
class APIGatewayEventOpenAPIRequest:
"""
Converts an API Gateway event payload to an OpenAPI request.
Designed to be used with API Gateway REST API specification exports for
integrations that use event v1 payload. Uses API Gateway event v1 httpMethod
and path data. Requires APIGatewayPathFinder to resolve ANY methods.
"""
def __init__(self, payload: APIGatewayEventPayload):
self.event = APIGatewayEvent(**payload)
self.parameters = RequestParameters(
path=self.path_params,
query=ImmutableMultiDict(self.query_params),
header=Headers(self.event.headers),
cookie=ImmutableMultiDict(),
)
@property
def path_params(self) -> Dict[str, str]:
params = self.event.pathParameters
if params is None:
return {}
return params
@property
def query_params(self) -> Dict[str, str]:
params = self.event.queryStringParameters
if params is None:
return {}
return params
@property
def proto(self) -> str:
return self.event.headers.get("X-Forwarded-Proto", "https")
@property
def host(self) -> str:
return self.event.headers["Host"]
@property
def host_url(self) -> str:
return "://".join([self.proto, self.host])
@property
def path(self) -> str:
return self.event.path
@property
def method(self) -> str:
return self.event.httpMethod.lower()
@property
def body(self) -> Optional[str]:
return self.event.body
@property
def mimetype(self) -> str:
return self.event.headers.get("Content-Type", "")
class APIGatewayEventV2OpenAPIRequest:
"""
Converts an API Gateway event v2 payload to an OpenAPI request.
Designed to be used with API Gateway HTTP API specification exports for
integrations that use event v2 payload. Uses API Gateway event v2 routeKey
and rawPath data. Requires APIGatewayPathFinder to resolve ANY methods.
.. note::
API Gateway HTTP APIs don't support request validation
"""
def __init__(self, payload: APIGatewayEventPayload):
self.event = APIGatewayEventV2(**payload)
self.parameters = RequestParameters(
path=self.path_params,
query=ImmutableMultiDict(self.query_params),
header=Headers(self.event.headers),
cookie=ImmutableMultiDict(),
)
@property
def path_params(self) -> Dict[str, str]:
if self.event.pathParameters is None:
return {}
return self.event.pathParameters
@property
def query_params(self) -> Dict[str, str]:
if self.event.queryStringParameters is None:
return {}
return self.event.queryStringParameters
@property
def proto(self) -> str:
return self.event.headers.get("x-forwarded-proto", "https")
@property
def host(self) -> str:
return self.event.headers["host"]
@property
def host_url(self) -> str:
return "://".join([self.proto, self.host])
@property
def path(self) -> str:
return self.event.rawPath
@property
def method(self) -> str:
return self.event.routeKey.split(" ")[0].lower()
@property
def body(self) -> Optional[str]:
return self.event.body
@property
def mimetype(self) -> str:
return self.event.headers.get("content-type", "")
class APIGatewayEventV2HTTPOpenAPIRequest(APIGatewayEventV2OpenAPIRequest):
"""
Converts an API Gateway event v2 payload to an OpenAPI request.
Uses http integration path and method data.
"""
@property
def path(self) -> str:
return self.event.http.path
@property
def method(self) -> str:
return self.event.http.method.lower()