Source code for pyrestsdk.middleware._middleware_pipeline

"""Houses Middleware Pipeline"""

from typing import TypeVar
import json
import ssl
from requests import PreparedRequest, Response
from requests.adapters import HTTPAdapter
from urllib3 import PoolManager
from pyrestsdk.middleware import BaseMiddleware
from pyrestsdk.middleware._request_context import RequestContext

B = TypeVar("B", bound=BaseMiddleware)


[docs]class MiddlewarePipeline(HTTPAdapter): """MiddlewarePipeline, entry point of middleware The pipeline is implemented as a linked-list, read more about it here https://buffered.dev/middleware-python-requests/ """ def __init__(self) -> None: super().__init__() self._current_middleware = None self._first_middleware = None self.poolmanager = PoolManager(ssl_version=ssl.PROTOCOL_TLSv1_2)
[docs] def add_middleware(self, middleware: B) -> None: """Adds middleware to the pipeline""" if self._current_middleware is not None: self._current_middleware.next = middleware self._current_middleware = middleware else: self._first_middleware = middleware self._current_middleware = self._first_middleware
[docs] def send( self, request: PreparedRequest, stream: bool = False, timeout=None, verify: bool = True, cert=None, proxies=None, ) -> Response: """Sends the prepared request through the middleware pipeline""" middleware_control_json = request.headers.pop("middleware_control", None) if middleware_control_json: middleware_control = json.loads(middleware_control_json) else: middleware_control = {} # Set Context request.context = RequestContext(middleware_control, request.headers) if self._first_middleware is not None: return self._first_middleware.send( request, stream, timeout, verify, cert, proxies ) # No middleware in pipeline, call superclass' send return super().send(request, stream, timeout, verify, cert, proxies)