1
1
from typing import List , Optional
2
2
3
- from requests import Session
3
+ from requests import Request , Session
4
4
5
5
from msgraphcore .client_factory import HTTPClientFactory
6
6
from msgraphcore .middleware .abc_token_credential import TokenCredential
7
7
from 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
9
31
10
32
11
33
class GraphClient :
@@ -43,17 +65,16 @@ def __init__(self, **kwargs):
43
65
"""
44
66
self .graph_session = self .get_graph_session (** kwargs )
45
67
46
- @middleware_control .get_middleware_options
47
68
def get (self , url : str , ** kwargs ):
48
69
r"""Sends a GET request. Returns :class:`Response` object.
49
70
:param url: URL for the new :class:`Request` object.
50
71
:param \*\*kwargs: Optional arguments that ``request`` takes.
51
72
:rtype: requests.Response
52
73
"""
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 )
54
76
55
- @middleware_control .get_middleware_options
56
- def post (self , url , data = None , json = None , ** kwargs ):
77
+ def post (self , url , ** kwargs ):
57
78
r"""Sends a POST request. Returns :class:`Response` object.
58
79
:param url: URL for the new :class:`Request` object.
59
80
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
@@ -62,9 +83,9 @@ def post(self, url, data=None, json=None, **kwargs):
62
83
:param \*\*kwargs: Optional arguments that ``request`` takes.
63
84
:rtype: requests.Response
64
85
"""
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 )
66
88
67
- @middleware_control .get_middleware_options
68
89
def put (self , url , data = None , ** kwargs ):
69
90
r"""Sends a PUT request. Returns :class:`Response` object.
70
91
:param url: URL for the new :class:`Request` object.
@@ -73,9 +94,9 @@ def put(self, url, data=None, **kwargs):
73
94
:param \*\*kwargs: Optional arguments that ``request`` takes.
74
95
:rtype: requests.Response
75
96
"""
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 )
77
99
78
- @middleware_control .get_middleware_options
79
100
def patch (self , url , data = None , ** kwargs ):
80
101
r"""Sends a PATCH request. Returns :class:`Response` object.
81
102
:param url: URL for the new :class:`Request` object.
@@ -84,16 +105,17 @@ def patch(self, url, data=None, **kwargs):
84
105
:param \*\*kwargs: Optional arguments that ``request`` takes.
85
106
:rtype: requests.Response
86
107
"""
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 )
88
110
89
- @middleware_control .get_middleware_options
90
111
def delete (self , url , ** kwargs ):
91
112
r"""Sends a DELETE request. Returns :class:`Response` object.
92
113
:param url: URL for the new :class:`Request` object.
93
114
:param \*\*kwargs: Optional arguments that ``request`` takes.
94
115
:rtype: requests.Response
95
116
"""
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 )
97
119
98
120
def _graph_url (self , url : str ) -> str :
99
121
"""Appends BASE_URL to user provided path
@@ -102,12 +124,18 @@ def _graph_url(self, url: str) -> str:
102
124
"""
103
125
return self .graph_session .base_url + url if (url [0 ] == '/' ) else url
104
126
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
+
105
133
@staticmethod
106
134
def get_graph_session (** kwargs ):
107
135
"""Method to always return a single instance of a HTTP Client"""
108
136
109
- credential = kwargs .get ('credential' )
110
- middleware = kwargs .get ('middleware' )
137
+ credential = kwargs .pop ('credential' , None )
138
+ middleware = kwargs .pop ('middleware' , None )
111
139
112
140
if credential and middleware :
113
141
raise ValueError (
@@ -117,5 +145,5 @@ def get_graph_session(**kwargs):
117
145
raise ValueError ("Invalid parameters!. Missing TokenCredential or middleware" )
118
146
119
147
if credential :
120
- return HTTPClientFactory (** kwargs ).create_with_default_middleware (credential )
148
+ return HTTPClientFactory (** kwargs ).create_with_default_middleware (credential , ** kwargs )
121
149
return HTTPClientFactory (** kwargs ).create_with_custom_middleware (middleware )
0 commit comments