6
6
from falcon .request import Request
7
7
from falcon .response import Response
8
8
9
- from openapi_core .contrib .falcon .handlers import FalconOpenAPIErrorsHandler
9
+ from openapi_core .contrib .falcon .handlers import (
10
+ FalconOpenAPIErrorsHandler ,
11
+ FalconOpenAPIValidRequestHandler ,
12
+ )
10
13
from openapi_core .contrib .falcon .requests import FalconOpenAPIRequest
11
14
from openapi_core .contrib .falcon .responses import FalconOpenAPIResponse
15
+ from openapi_core .protocols import ErrorsHandler
12
16
from openapi_core .spec import Spec
13
17
from openapi_core .unmarshalling .processors import UnmarshallingProcessor
14
- from openapi_core .unmarshalling .request .datatypes import RequestUnmarshalResult
15
18
from openapi_core .unmarshalling .request .types import RequestUnmarshallerType
16
- from openapi_core .unmarshalling .response .datatypes import (
17
- ResponseUnmarshalResult ,
18
- )
19
19
from openapi_core .unmarshalling .response .types import ResponseUnmarshallerType
20
20
21
21
22
- class FalconOpenAPIMiddleware (UnmarshallingProcessor ):
23
- request_class = FalconOpenAPIRequest
24
- response_class = FalconOpenAPIResponse
25
- errors_handler = FalconOpenAPIErrorsHandler ()
22
+ class FalconOpenAPIMiddleware (UnmarshallingProcessor [Request , Response ]):
23
+ request_cls = FalconOpenAPIRequest
24
+ response_cls = FalconOpenAPIResponse
25
+ valid_request_handler_cls = FalconOpenAPIValidRequestHandler
26
+ errors_handler_cls : Type [FalconOpenAPIErrorsHandler ] = FalconOpenAPIErrorsHandler
26
27
27
28
def __init__ (
28
29
self ,
29
30
spec : Spec ,
30
31
request_unmarshaller_cls : Optional [RequestUnmarshallerType ] = None ,
31
32
response_unmarshaller_cls : Optional [ResponseUnmarshallerType ] = None ,
32
- request_class : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
33
- response_class : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
34
- errors_handler : Optional [FalconOpenAPIErrorsHandler ] = None ,
33
+ request_cls : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
34
+ response_cls : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
35
+ errors_handler_cls : Type [FalconOpenAPIErrorsHandler ] = FalconOpenAPIErrorsHandler ,
35
36
** unmarshaller_kwargs : Any ,
36
37
):
37
38
super ().__init__ (
@@ -40,70 +41,46 @@ def __init__(
40
41
response_unmarshaller_cls = response_unmarshaller_cls ,
41
42
** unmarshaller_kwargs ,
42
43
)
43
- self .request_class = request_class or self .request_class
44
- self .response_class = response_class or self .response_class
45
- self .errors_handler = errors_handler or self .errors_handler
44
+ self .request_cls = request_cls or self .request_cls
45
+ self .response_cls = response_cls or self .response_cls
46
+ self .errors_handler_cls = errors_handler_cls or self .errors_handler_cls
46
47
47
48
@classmethod
48
49
def from_spec (
49
50
cls ,
50
51
spec : Spec ,
51
52
request_unmarshaller_cls : Optional [RequestUnmarshallerType ] = None ,
52
53
response_unmarshaller_cls : Optional [ResponseUnmarshallerType ] = None ,
53
- request_class : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
54
- response_class : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
55
- errors_handler : Optional [FalconOpenAPIErrorsHandler ] = None ,
54
+ request_cls : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
55
+ response_cls : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
56
+ errors_handler_cls : Type [FalconOpenAPIErrorsHandler ] = FalconOpenAPIErrorsHandler ,
56
57
** unmarshaller_kwargs : Any ,
57
58
) -> "FalconOpenAPIMiddleware" :
58
59
return cls (
59
60
spec ,
60
61
request_unmarshaller_cls = request_unmarshaller_cls ,
61
62
response_unmarshaller_cls = response_unmarshaller_cls ,
62
- request_class = request_class ,
63
- response_class = response_class ,
64
- errors_handler = errors_handler ,
63
+ request_cls = request_cls ,
64
+ response_cls = response_cls ,
65
+ errors_handler_cls = errors_handler_cls ,
65
66
** unmarshaller_kwargs ,
66
67
)
67
68
68
- def process_request (self , req : Request , resp : Response ) -> None : # type: ignore
69
- openapi_req = self ._get_openapi_request (req )
70
- req .context .openapi = super ().process_request (openapi_req )
71
- if req .context .openapi .errors :
72
- return self ._handle_request_errors (req , resp , req .context .openapi )
69
+ def process_request (self , req : Request , resp : Response ) -> None :
70
+ valid_handler = self .valid_request_handler_cls (req , resp )
71
+ errors_handler = self .errors_handler_cls (req , resp )
72
+ self .handle_request (req , valid_handler , errors_handler )
73
73
74
- def process_response ( # type: ignore
74
+ def process_response (
75
75
self , req : Request , resp : Response , resource : Any , req_succeeded : bool
76
76
) -> None :
77
- openapi_req = self ._get_openapi_request (req )
78
- openapi_resp = self ._get_openapi_response (resp )
79
- resp .context .openapi = super ().process_response (
80
- openapi_req , openapi_resp
81
- )
82
- if resp .context .openapi .errors :
83
- return self ._handle_response_errors (
84
- req , resp , resp .context .openapi
85
- )
86
-
87
- def _handle_request_errors (
88
- self ,
89
- req : Request ,
90
- resp : Response ,
91
- request_result : RequestUnmarshalResult ,
92
- ) -> None :
93
- return self .errors_handler .handle (req , resp , request_result .errors )
94
-
95
- def _handle_response_errors (
96
- self ,
97
- req : Request ,
98
- resp : Response ,
99
- response_result : ResponseUnmarshalResult ,
100
- ) -> None :
101
- return self .errors_handler .handle (req , resp , response_result .errors )
77
+ errors_handler = self .errors_handler_cls (req , resp )
78
+ self .handle_response (req , resp , errors_handler )
102
79
103
80
def _get_openapi_request (self , request : Request ) -> FalconOpenAPIRequest :
104
- return self .request_class (request )
81
+ return self .request_cls (request )
105
82
106
83
def _get_openapi_response (
107
84
self , response : Response
108
85
) -> FalconOpenAPIResponse :
109
- return self .response_class (response )
86
+ return self .response_cls (response )
0 commit comments