5
5
import sys
6
6
7
7
8
- class RestTool :
8
+ class BaseRestTool ( object ) :
9
9
"""Class to prepare HTTP request, call the request and decode the response."""
10
10
11
11
# Root/parent MangoPayApi instance that holds the OAuthToken and Configuration instance
@@ -53,12 +53,10 @@ def Request(self, urlMethod, requestType, requestData = None, pagination = None,
53
53
54
54
return response
55
55
56
- def _runRequest (self , urlMethod , pagination , additionalUrlParams ):
57
- """Execute request and check response.
58
- return object Respons data
59
- throws Exception If cURL has error
56
+ def _generateRequest (self , urlMethod , pagination , additionalUrlParams ):
57
+ """Generate the request object
58
+ that will be used in the `_runRequest`
60
59
"""
61
-
62
60
urlToolObj = UrlTool (self ._root .Config )
63
61
restUrl = urlToolObj .GetRestUrl (urlMethod , self ._authRequired , pagination , additionalUrlParams )
64
62
fullUrl = urlToolObj .GetFullUrl (restUrl )
@@ -71,14 +69,31 @@ def _runRequest(self, urlMethod, pagination, additionalUrlParams):
71
69
if (self ._debugMode ): logging .getLogger (__name__ ).debug ('REQUEST: {0} {1}\n DATA: {2}' .format (self ._requestType , fullUrl , self ._requestData ))
72
70
73
71
if self ._requestType == "POST" :
74
- response = requests .post ( fullUrl , json .dumps (self ._requestData ), auth = authObj , verify = False , headers = headersJson )
72
+ request = requests .Request ( 'POST' , fullUrl , data = json .dumps (self ._requestData ), auth = authObj , headers = headersJson )
75
73
elif self ._requestType == "GET" :
76
- response = requests .get ( fullUrl , auth = authObj , verify = False )
74
+ request = requests .Request ( 'GET' , fullUrl , auth = authObj )
77
75
elif self ._requestType == "PUT" :
78
- response = requests .put ( fullUrl , json .dumps (self ._requestData ), auth = authObj , verify = False , headers = headersJson )
76
+ request = requests .Request ( 'PUT' , fullUrl , data = json .dumps (self ._requestData ), auth = authObj , headers = headersJson )
79
77
elif self ._requestType == "DELETE" :
80
- response = requests .delete (fullUrl , auth = authObj , verify = False , headers = headers )
81
-
78
+ request = requests .Request ('DELETE' , fullUrl , auth = authObj , headers = headers )
79
+
80
+ return request
81
+
82
+ def _sendRequest (self , request ):
83
+ """Prepare and send the request"""
84
+ prepared_request = request .prepare ()
85
+ session = requests .Session ()
86
+ response = session .send (prepared_request , verify = False )
87
+ return response
88
+
89
+ def _runRequest (self , urlMethod , pagination , additionalUrlParams ):
90
+ """Execute request and check response.
91
+ return object Respons data
92
+ throws Exception If cURL has error
93
+ """
94
+ request = self ._generateRequest (urlMethod , pagination , additionalUrlParams )
95
+ response = self ._sendRequest (request )
96
+
82
97
if (self ._debugMode ): logging .getLogger (__name__ ).debug ('RESPONSE: {0}\n {1}\n {2}' .format (response .status_code , response .headers , response .text ))
83
98
84
99
decodedResp = json .loads (response .text ) if (response .text != '' and 'application/json' in response .headers ['content-type' ]) else None
@@ -125,3 +140,37 @@ def _checkResponseCode(self, response, decodedResp):
125
140
elif decodedResp != None and decodedResp .get ('error' ) != None :
126
141
message = decodedResp .get ('error' )
127
142
raise ResponseException (response .request .url , response .status_code , message )
143
+
144
+
145
+ def _getRestTool (root , * args , ** kwargs ):
146
+ RestToolClass = root .Config .RestToolClass
147
+ if RestToolClass is None :
148
+ RestToolClass = BaseRestTool
149
+
150
+ # in the case the user swap for his own class, check it's good enough
151
+ if not issubclass (RestToolClass , BaseRestTool ):
152
+ raise ValueError ("You've swapped the `Configuration.RestToolClass` "
153
+ "for you own but you need `%s` to subclass "
154
+ "the original class `%s`" % (RestToolClass ,
155
+ BaseRestTool ))
156
+
157
+ return RestToolClass (root , * args , ** kwargs )
158
+
159
+
160
+ class RestToolProxy (object ):
161
+ """
162
+ Wrapper around the `BaseRestTool` class
163
+ It decides which class should be used based on the `root.Config.RestToolClass`
164
+ And then proxies the calls to the wrapped class instance
165
+ """
166
+
167
+ def __init__ (self , root , * args , ** kwargs ):
168
+ resttool = _getRestTool (root , * args , ** kwargs )
169
+ self ._resttool = resttool
170
+
171
+ def __getattribute__ (self , attr ):
172
+ return getattr (object .__getattribute__ (self , '_resttool' ), attr )
173
+
174
+
175
+ # for easy backward compatibility we use the proxy as the main class
176
+ RestTool = RestToolProxy
0 commit comments