File: middlewares.py

package info (click to toggle)
python-openapi-core 0.19.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,008 kB
  • sloc: python: 18,868; makefile: 47
file content (88 lines) | stat: -rw-r--r-- 3,399 bytes parent folder | download
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
"""OpenAPI core contrib falcon middlewares module"""

from typing import Any
from typing import Type
from typing import Union

from falcon.request import Request
from falcon.response import Response
from jsonschema._utils import Unset
from jsonschema.validators import _UNSET
from jsonschema_path import SchemaPath

from openapi_core import Config
from openapi_core import OpenAPI
from openapi_core.contrib.falcon.handlers import FalconOpenAPIErrorsHandler
from openapi_core.contrib.falcon.handlers import (
    FalconOpenAPIValidRequestHandler,
)
from openapi_core.contrib.falcon.integrations import FalconIntegration
from openapi_core.contrib.falcon.requests import FalconOpenAPIRequest
from openapi_core.contrib.falcon.responses import FalconOpenAPIResponse
from openapi_core.unmarshalling.request.types import RequestUnmarshallerType
from openapi_core.unmarshalling.response.types import ResponseUnmarshallerType


class FalconOpenAPIMiddleware(FalconIntegration):
    valid_request_handler_cls = FalconOpenAPIValidRequestHandler
    errors_handler_cls: Type[FalconOpenAPIErrorsHandler] = (
        FalconOpenAPIErrorsHandler
    )

    def __init__(
        self,
        openapi: OpenAPI,
        request_cls: Type[FalconOpenAPIRequest] = FalconOpenAPIRequest,
        response_cls: Type[FalconOpenAPIResponse] = FalconOpenAPIResponse,
        errors_handler_cls: Type[
            FalconOpenAPIErrorsHandler
        ] = FalconOpenAPIErrorsHandler,
        **unmarshaller_kwargs: Any,
    ):
        super().__init__(openapi)
        self.request_cls = request_cls or self.request_cls
        self.response_cls = response_cls or self.response_cls
        self.errors_handler_cls = errors_handler_cls or self.errors_handler_cls

    @classmethod
    def from_spec(
        cls,
        spec: SchemaPath,
        request_unmarshaller_cls: Union[
            RequestUnmarshallerType, Unset
        ] = _UNSET,
        response_unmarshaller_cls: Union[
            ResponseUnmarshallerType, Unset
        ] = _UNSET,
        request_cls: Type[FalconOpenAPIRequest] = FalconOpenAPIRequest,
        response_cls: Type[FalconOpenAPIResponse] = FalconOpenAPIResponse,
        errors_handler_cls: Type[
            FalconOpenAPIErrorsHandler
        ] = FalconOpenAPIErrorsHandler,
        **unmarshaller_kwargs: Any,
    ) -> "FalconOpenAPIMiddleware":
        config = Config(
            request_unmarshaller_cls=request_unmarshaller_cls,
            response_unmarshaller_cls=response_unmarshaller_cls,
        )
        openapi = OpenAPI(spec, config=config)
        return cls(
            openapi,
            request_unmarshaller_cls=request_unmarshaller_cls,
            response_unmarshaller_cls=response_unmarshaller_cls,
            request_cls=request_cls,
            response_cls=response_cls,
            errors_handler_cls=errors_handler_cls,
            **unmarshaller_kwargs,
        )

    def process_request(self, req: Request, resp: Response) -> None:
        valid_handler = self.valid_request_handler_cls(req, resp)
        errors_handler = self.errors_handler_cls(req, resp)
        self.handle_request(req, valid_handler, errors_handler)

    def process_response(
        self, req: Request, resp: Response, resource: Any, req_succeeded: bool
    ) -> None:
        errors_handler = self.errors_handler_cls(req, resp)
        self.handle_response(req, resp, errors_handler)