Skip to content

Feat/request context #83

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
May 27, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions msgraphcore/middleware/middleware.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import ssl
import uuid

from requests.adapters import HTTPAdapter
from urllib3 import PoolManager

from msgraphcore.middleware.request_context import RequestContext


class MiddlewarePipeline(HTTPAdapter):
"""MiddlewarePipeline, entry point of middleware
Expand All @@ -22,6 +25,9 @@ def add_middleware(self, middleware):
self._middleware = middleware

def send(self, request, **kwargs):

request.context = RequestContext(request)

if self._middleware_present():
return self._middleware.send(request, **kwargs)
# No middleware in pipeline, call superclass' send
Expand Down
13 changes: 7 additions & 6 deletions msgraphcore/middleware/options/middleware_control.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from msgraphcore.constants import AUTH_MIDDLEWARE_OPTIONS

from .auth_middleware_options import AuthMiddlewareOptions
from msgraphcore.middleware.options.auth_middleware_options import AuthMiddlewareOptions


class MiddlewareControl:
Expand All @@ -18,10 +17,12 @@ def get_middleware_options(self, func):

def wrapper(*args, **kwargs):
# Get middleware options from **kwargs
scopes = kwargs.pop('scopes', None)
if scopes:
# Set middleware options, for use by middleware in the middleware pipeline
self.set(AUTH_MIDDLEWARE_OPTIONS, AuthMiddlewareOptions(scopes))
middleware_options = kwargs.pop('middleware_options', None)
if middleware_options:
scopes = middleware_options.get('scopes', None)
if scopes:
# Set middleware options, for use by middleware in the middleware pipeline
self.set(AUTH_MIDDLEWARE_OPTIONS, AuthMiddlewareOptions(scopes))
return func(*args, **kwargs)

return wrapper
Expand Down
25 changes: 25 additions & 0 deletions msgraphcore/middleware/request_context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import uuid

from msgraphcore.middleware.options.middleware_control import middleware_control


class RequestContext:
NONE_FLAG = 0
REDIRECT_HANDLER_ENABLED_FLAG = 1
RETRY_HANDLER_ENABLED_FLAG = 2
AUTH_HANDLER_ENABLED_FLAG = 4
DEFAULT_HTTPROVIDER_ENABLED_FLAG = 8
LOGGING_HANDLER_ENABLED_FLAG = 10

def __init__(self, request):
self.middleware_control = middleware_control
self.client_request_id = request.headers.get('client-request-id', str(uuid.uuid4()))
self._feature_usage = self.NONE_FLAG

@property
def feature_usage(self):
return hex(self._feature_usage)

@feature_usage.setter
def set_feature_usage(self, flag):
self._feature_usage = self.feature_usage | flag
5 changes: 4 additions & 1 deletion tests/unit/test_middleware_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def test_request_object_is_modified_in_order(self):
middleware_pipeline.add_middleware(MockRequestMiddleware2())

request = OrderedDict()
request.headers = {}
result = middleware_pipeline.send(request=request)

second, _ = result.popitem()
Expand All @@ -41,7 +42,9 @@ def test_response_object_is_modified_in_reverse_order(self):

# Responses are passed through the list of middlewares in reverse order.
# This will return hello world
resp = middleware_pipeline.send(OrderedDict())
request = OrderedDict()
request.headers = {}
resp = middleware_pipeline.send(request)

self.assertEqual(resp, 'Hello World')

Expand Down