1
1
"""
2
2
Graph Session
3
3
"""
4
- from requests import Session , Request , Response
4
+
5
+ from requests import Session
5
6
6
7
from msgraphcore .constants import BASE_URL , SDK_VERSION
7
8
from msgraphcore .middleware ._middleware import MiddlewarePipeline , BaseMiddleware
8
9
from msgraphcore .middleware ._base_auth import AuthProviderBase
9
10
from msgraphcore .middleware .authorization import AuthorizationHandler
11
+ from msgraphcore .middleware .options .middleware_control import middleware_control
10
12
11
13
12
14
class GraphSession (Session ):
13
- """
14
- Extends session object with graph functionality
15
+ """Extends Session with Graph functionality
16
+
17
+ Extends Session by adding support for middleware options and middleware pipeline
18
+
19
+
15
20
"""
16
21
def __init__ (self , auth_provider : AuthProviderBase , middleware : list = []):
17
22
super ().__init__ ()
@@ -20,47 +25,84 @@ def __init__(self, auth_provider: AuthProviderBase, middleware: list = []):
20
25
21
26
auth_handler = AuthorizationHandler (auth_provider )
22
27
28
+ # The authorization handler should be the first middleware in the pipeline.
23
29
middleware .insert (0 , auth_handler )
24
30
self ._register (middleware )
25
31
26
- def get (self , url : str , ** kwargs ) -> Response :
27
- return self ._prepare_and_send_request ('GET' , url , ** kwargs )
28
-
29
- def post (self , url : str , ** kwargs ) -> Response :
30
- return self ._prepare_and_send_request ('POST' , url , ** kwargs )
31
-
32
- def put (self , url : str , ** kwargs ) -> Response :
33
- return self ._prepare_and_send_request ('PUT' , url , ** kwargs )
34
-
35
- def patch (self , url : str , ** kwargs ) -> Response :
36
- return self ._prepare_and_send_request ('PATCH' , url , ** kwargs )
37
-
38
- def delete (self , url : str , ** kwargs ) -> Response :
39
- return self ._prepare_and_send_request ('DELETE' , url , ** kwargs )
40
-
41
- def _get_url (self , url : str ) -> Response :
32
+ @middleware_control .get_middleware_options
33
+ def get (self , url : str , ** kwargs ):
34
+ r"""Sends a GET request. Returns :class:`Response` object.
35
+
36
+ :param url: URL for the new :class:`Request` object.
37
+ :param \*\*kwargs: Optional arguments that ``request`` takes.
38
+ :rtype: requests.Response
39
+ """
40
+ return super ().get (self ._graph_url (url ))
41
+
42
+ @middleware_control .get_middleware_options
43
+ def post (self , url , data = None , json = None , ** kwargs ):
44
+ r"""Sends a POST request. Returns :class:`Response` object.
45
+
46
+ :param url: URL for the new :class:`Request` object.
47
+ :param data: (optional) Dictionary, list of tuples, bytes, or file-like
48
+ object to send in the body of the :class:`Request`.
49
+ :param json: (optional) json to send in the body of the :class:`Request`.
50
+ :param \*\*kwargs: Optional arguments that ``request`` takes.
51
+ :rtype: requests.Response
52
+ """
53
+ return super ().post (self ._graph_url (url ), data , json , ** kwargs )
54
+
55
+ @middleware_control .get_middleware_options
56
+ def put (self , url , data = None , ** kwargs ):
57
+ r"""Sends a PUT request. Returns :class:`Response` object.
58
+
59
+ :param url: URL for the new :class:`Request` object.
60
+ :param data: (optional) Dictionary, list of tuples, bytes, or file-like
61
+ object to send in the body of the :class:`Request`.
62
+ :param \*\*kwargs: Optional arguments that ``request`` takes.
63
+ :rtype: requests.Response
64
+ """
65
+ return super ().put (self ._graph_url (url ), data , ** kwargs )
66
+
67
+ @middleware_control .get_middleware_options
68
+ def patch (self , url , data = None , ** kwargs ):
69
+ r"""Sends a PATCH request. Returns :class:`Response` object.
70
+
71
+ :param url: URL for the new :class:`Request` object.
72
+ :param data: (optional) Dictionary, list of tuples, bytes, or file-like
73
+ object to send in the body of the :class:`Request`.
74
+ :param \*\*kwargs: Optional arguments that ``request`` takes.
75
+ :rtype: requests.Response
76
+ """
77
+ return super ().patch (self ._graph_url (url ), data , ** kwargs )
78
+
79
+ @middleware_control .get_middleware_options
80
+ def delete (self , url , ** kwargs ):
81
+ r"""Sends a DELETE request. Returns :class:`Response` object.
82
+
83
+ :param url: URL for the new :class:`Request` object.
84
+ :param \*\*kwargs: Optional arguments that ``request`` takes.
85
+ :rtype: requests.Response
86
+ """
87
+ return super ().delete (url , ** kwargs )
88
+
89
+ def _graph_url (self , url : str ) -> str :
90
+ """Appends BASE_URL to user provided path
91
+
92
+ :param url: user provided path
93
+ :return: graph_url
94
+ """
42
95
return self ._base_url + url if (url [0 ] == '/' ) else url
43
96
44
97
def _register (self , middleware : [BaseMiddleware ]) -> None :
98
+ """Adds middleware to middleware_pipeline
99
+
100
+ :param middleware: list of middleware
101
+ """
45
102
if middleware :
46
- middleware_adapter = MiddlewarePipeline ()
103
+ middleware_pipeline = MiddlewarePipeline ()
47
104
48
105
for ware in middleware :
49
- middleware_adapter .add_middleware (ware )
50
-
51
- self .mount ('https://' , middleware_adapter )
52
-
53
- def _prepare_and_send_request (self , method : str = '' , url : str = '' , ** kwargs ) -> Response :
54
- # Retrieve middleware options
55
- list_of_scopes = kwargs .pop ('scopes' , None )
56
-
57
- # Prepare request
58
- request_url = self ._get_url (url )
59
- request = Request (method , request_url , kwargs )
60
- prepared_request = self .prepare_request (request )
61
-
62
- if list_of_scopes is not None :
63
- # Append middleware options to the request object, will be used by MiddlewareController
64
- prepared_request .scopes = list_of_scopes
106
+ middleware_pipeline .add_middleware (ware )
65
107
66
- return self .send ( prepared_request , ** kwargs )
108
+ self .mount ( 'https://' , middleware_pipeline )
0 commit comments