77from falcon .response import Response
88
99from openapi_core .contrib .falcon .handlers import FalconOpenAPIErrorsHandler
10+ from openapi_core .contrib .falcon .handlers import (
11+ FalconOpenAPIValidRequestHandler ,
12+ )
1013from openapi_core .contrib .falcon .requests import FalconOpenAPIRequest
1114from openapi_core .contrib .falcon .responses import FalconOpenAPIResponse
1215from openapi_core .spec import Spec
1316from openapi_core .unmarshalling .processors import UnmarshallingProcessor
14- from openapi_core .unmarshalling .request .datatypes import RequestUnmarshalResult
1517from openapi_core .unmarshalling .request .types import RequestUnmarshallerType
16- from openapi_core .unmarshalling .response .datatypes import (
17- ResponseUnmarshalResult ,
18- )
1918from openapi_core .unmarshalling .response .types import ResponseUnmarshallerType
2019
2120
22- class FalconOpenAPIMiddleware (UnmarshallingProcessor ):
21+ class FalconOpenAPIMiddleware (UnmarshallingProcessor [ Request , Response ] ):
2322 request_cls = FalconOpenAPIRequest
2423 response_cls = FalconOpenAPIResponse
25- errors_handler = FalconOpenAPIErrorsHandler ()
24+ valid_request_handler_cls = FalconOpenAPIValidRequestHandler
25+ errors_handler_cls : Type [
26+ FalconOpenAPIErrorsHandler
27+ ] = FalconOpenAPIErrorsHandler
2628
2729 def __init__ (
2830 self ,
@@ -31,7 +33,9 @@ def __init__(
3133 response_unmarshaller_cls : Optional [ResponseUnmarshallerType ] = None ,
3234 request_cls : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
3335 response_cls : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
34- errors_handler : Optional [FalconOpenAPIErrorsHandler ] = None ,
36+ errors_handler_cls : Type [
37+ FalconOpenAPIErrorsHandler
38+ ] = FalconOpenAPIErrorsHandler ,
3539 ** unmarshaller_kwargs : Any ,
3640 ):
3741 super ().__init__ (
@@ -42,7 +46,7 @@ def __init__(
4246 )
4347 self .request_cls = request_cls or self .request_cls
4448 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
4650
4751 @classmethod
4852 def from_spec (
@@ -52,7 +56,9 @@ def from_spec(
5256 response_unmarshaller_cls : Optional [ResponseUnmarshallerType ] = None ,
5357 request_cls : Type [FalconOpenAPIRequest ] = FalconOpenAPIRequest ,
5458 response_cls : Type [FalconOpenAPIResponse ] = FalconOpenAPIResponse ,
55- errors_handler : Optional [FalconOpenAPIErrorsHandler ] = None ,
59+ errors_handler_cls : Type [
60+ FalconOpenAPIErrorsHandler
61+ ] = FalconOpenAPIErrorsHandler ,
5662 ** unmarshaller_kwargs : Any ,
5763 ) -> "FalconOpenAPIMiddleware" :
5864 return cls (
@@ -61,46 +67,20 @@ def from_spec(
6167 response_unmarshaller_cls = response_unmarshaller_cls ,
6268 request_cls = request_cls ,
6369 response_cls = response_cls ,
64- errors_handler = errors_handler ,
70+ errors_handler_cls = errors_handler_cls ,
6571 ** unmarshaller_kwargs ,
6672 )
6773
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 )
7378
74- def process_response ( # type: ignore
79+ def process_response (
7580 self , req : Request , resp : Response , resource : Any , req_succeeded : bool
7681 ) -> 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 )
10484
10585 def _get_openapi_request (self , request : Request ) -> FalconOpenAPIRequest :
10686 return self .request_cls (request )
@@ -110,3 +90,6 @@ def _get_openapi_response(
11090 ) -> FalconOpenAPIResponse :
11191 assert self .response_cls is not None
11292 return self .response_cls (response )
93+
94+ def _validate_response (self ) -> bool :
95+ return self .response_cls is not None
0 commit comments