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