11from typing import List , Optional
22
3- from requests import Session
3+ from requests import Request , Session
44
55from msgraphcore .client_factory import HTTPClientFactory
66from msgraphcore .middleware .abc_token_credential import TokenCredential
77from msgraphcore .middleware .middleware import BaseMiddleware
8- from msgraphcore .middleware .options .middleware_control import middleware_control
8+ from msgraphcore .middleware .request_context import RequestContext
9+
10+ supported_options = ['scopes' , 'custom_option' ]
11+
12+
13+ def attach_context (func ):
14+ def wrapper (* args , ** kwargs ):
15+ middleware_control = dict ()
16+
17+ for option in supported_options :
18+ value = kwargs .pop (option , None )
19+ if value :
20+ middleware_control .update ({option : value })
21+
22+ headers = kwargs .get ('headers' , {})
23+ request_context = RequestContext (middleware_control , headers )
24+
25+ request = func (* args , ** kwargs )
26+ request .context = request_context
27+
28+ return request
29+
30+ return wrapper
931
1032
1133class GraphClient :
@@ -43,17 +65,16 @@ def __init__(self, **kwargs):
4365 """
4466 self .graph_session = self .get_graph_session (** kwargs )
4567
46- @middleware_control .get_middleware_options
4768 def get (self , url : str , ** kwargs ):
4869 r"""Sends a GET request. Returns :class:`Response` object.
4970 :param url: URL for the new :class:`Request` object.
5071 :param \*\*kwargs: Optional arguments that ``request`` takes.
5172 :rtype: requests.Response
5273 """
53- return self .graph_session .get (self ._graph_url (url ), ** kwargs )
74+ prepared_request = self .prepare_request ('GET' , self ._graph_url (url ), ** kwargs )
75+ return self .graph_session .send (prepared_request )
5476
55- @middleware_control .get_middleware_options
56- def post (self , url , data = None , json = None , ** kwargs ):
77+ def post (self , url , ** kwargs ):
5778 r"""Sends a POST request. Returns :class:`Response` object.
5879 :param url: URL for the new :class:`Request` object.
5980 :param data: (optional) Dictionary, list of tuples, bytes, or file-like
@@ -62,9 +83,9 @@ def post(self, url, data=None, json=None, **kwargs):
6283 :param \*\*kwargs: Optional arguments that ``request`` takes.
6384 :rtype: requests.Response
6485 """
65- return self .graph_session .post (self ._graph_url (url ), data , json , ** kwargs )
86+ prepared_request = self .prepare_request ('POST' , self ._graph_url (url ), ** kwargs )
87+ return self .graph_session .send (prepared_request )
6688
67- @middleware_control .get_middleware_options
6889 def put (self , url , data = None , ** kwargs ):
6990 r"""Sends a PUT request. Returns :class:`Response` object.
7091 :param url: URL for the new :class:`Request` object.
@@ -73,9 +94,9 @@ def put(self, url, data=None, **kwargs):
7394 :param \*\*kwargs: Optional arguments that ``request`` takes.
7495 :rtype: requests.Response
7596 """
76- return self .graph_session .put (self ._graph_url (url ), data , ** kwargs )
97+ prepared_request = self .prepare_request ('PUT' , self ._graph_url (url ), ** kwargs )
98+ return self .graph_session .send (prepared_request )
7799
78- @middleware_control .get_middleware_options
79100 def patch (self , url , data = None , ** kwargs ):
80101 r"""Sends a PATCH request. Returns :class:`Response` object.
81102 :param url: URL for the new :class:`Request` object.
@@ -84,16 +105,17 @@ def patch(self, url, data=None, **kwargs):
84105 :param \*\*kwargs: Optional arguments that ``request`` takes.
85106 :rtype: requests.Response
86107 """
87- return self .graph_session .patch (self ._graph_url (url ), data , ** kwargs )
108+ prepared_request = self .prepare_request ('PATCH' , self ._graph_url (url ), ** kwargs )
109+ return self .graph_session .send (prepared_request )
88110
89- @middleware_control .get_middleware_options
90111 def delete (self , url , ** kwargs ):
91112 r"""Sends a DELETE request. Returns :class:`Response` object.
92113 :param url: URL for the new :class:`Request` object.
93114 :param \*\*kwargs: Optional arguments that ``request`` takes.
94115 :rtype: requests.Response
95116 """
96- return self .graph_session .delete (self ._graph_url (url ), ** kwargs )
117+ prepared_request = self .prepare_request ('DELETE' , self ._graph_url (url ), ** kwargs )
118+ return self .graph_session .send (prepared_request )
97119
98120 def _graph_url (self , url : str ) -> str :
99121 """Appends BASE_URL to user provided path
@@ -102,12 +124,18 @@ def _graph_url(self, url: str) -> str:
102124 """
103125 return self .graph_session .base_url + url if (url [0 ] == '/' ) else url
104126
127+ @attach_context
128+ def prepare_request (self , method , url , ** kwargs ):
129+ req = Request (method , url , ** kwargs )
130+ prepared = Session ().prepare_request (req )
131+ return prepared
132+
105133 @staticmethod
106134 def get_graph_session (** kwargs ):
107135 """Method to always return a single instance of a HTTP Client"""
108136
109- credential = kwargs .get ('credential' )
110- middleware = kwargs .get ('middleware' )
137+ credential = kwargs .pop ('credential' , None )
138+ middleware = kwargs .pop ('middleware' , None )
111139
112140 if credential and middleware :
113141 raise ValueError (
@@ -117,5 +145,5 @@ def get_graph_session(**kwargs):
117145 raise ValueError ("Invalid parameters!. Missing TokenCredential or middleware" )
118146
119147 if credential :
120- return HTTPClientFactory (** kwargs ).create_with_default_middleware (credential )
148+ return HTTPClientFactory (** kwargs ).create_with_default_middleware (credential , ** kwargs )
121149 return HTTPClientFactory (** kwargs ).create_with_custom_middleware (middleware )
0 commit comments