6
6
import mimetypes
7
7
from pprint import pformat
8
8
import random
9
-
10
- # json module is not supported in versions of Python < 2.6 so try to load the
11
- # simplejson module instead. Note that as of simplejson v2.1.1, Python 2.4
12
- # support was dropped. You will need to look for v2.1.0 specifically for
13
- # Python 2.4 support.
14
- import sys
15
- major_py_version = sys .version_info [0 ]
16
- minor_py_version = sys .version_info [1 ]
17
- if major_py_version == 2 and minor_py_version < 6 :
18
- import simplejson as json
19
- else :
20
- import json
9
+ import json
10
+ from urlparse import parse_qs , urlparse
21
11
22
12
import requests
23
13
from requests_oauthlib import OAuth1
24
14
25
- # parse_qs is in the urlparse module as of 2.6, but in cgi in earlier versions.
26
- if major_py_version == 2 and minor_py_version > 5 :
27
- from urlparse import parse_qs
28
- else :
29
- from cgi import parse_qs
30
-
31
- from urlparse import urlparse
32
-
33
15
__version__ = '0.5.0'
34
16
35
17
REQUEST_TOKEN_URL = 'https://sso.openx.com/api/index/initiate'
@@ -62,20 +44,19 @@ class Client(object):
62
44
63
45
"""
64
46
65
-
66
47
def __init__ (self , domain , realm , consumer_key , consumer_secret ,
67
- callback_url = 'oob' ,
68
- scheme = 'http' ,
69
- request_token_url = REQUEST_TOKEN_URL ,
70
- access_token_url = ACCESS_TOKEN_URL ,
71
- authorization_url = AUTHORIZATION_URL ,
72
- api_path = API_PATH_V1 ,
73
- email = None ,
74
- password = None ,
75
- http_proxy = None ,
76
- https_proxy = None ,
77
- headers = None ,
78
- timeout = None ):
48
+ callback_url = 'oob' ,
49
+ scheme = 'http' ,
50
+ request_token_url = REQUEST_TOKEN_URL ,
51
+ access_token_url = ACCESS_TOKEN_URL ,
52
+ authorization_url = AUTHORIZATION_URL ,
53
+ api_path = API_PATH_V1 ,
54
+ email = None ,
55
+ password = None ,
56
+ http_proxy = None ,
57
+ https_proxy = None ,
58
+ headers = None ,
59
+ timeout = None ):
79
60
"""
80
61
81
62
domain -- Your UI domain. The API is accessed off this domain.
@@ -97,7 +78,7 @@ def __init__(self, domain, realm, consumer_key, consumer_secret,
97
78
self .consumer_key = consumer_key
98
79
self .consumer_secret = consumer_secret
99
80
self .callback_url = callback_url
100
- self .scheme = scheme
81
+ self .scheme = scheme
101
82
self .request_token_url = request_token_url
102
83
self .access_token_url = access_token_url
103
84
self .authorization_url = authorization_url
@@ -129,7 +110,6 @@ def __init__(self, domain, realm, consumer_key, consumer_secret,
129
110
130
111
self .logger = logging .getLogger (__name__ )
131
112
132
-
133
113
def log_request (self , response ):
134
114
self .logger .debug ('====={0:=<45}' .format ('OX3 api call started' ))
135
115
self .logger .debug ("%s %s" % (response .request .method , response .request .url ))
@@ -144,11 +124,10 @@ def log_request(self, response):
144
124
self .logger .debug ('====={0:=<45}' .format ('OX3 api call response body' ))
145
125
try :
146
126
self .logger .debug (pformat (json .loads (response .content )))
147
- except :
127
+ except ValueError :
148
128
self .logger .debug ("%s" % response .content )
149
129
self .logger .debug ('====={0:=<45}' .format ('OX3 api call finished' ))
150
130
151
-
152
131
def request (self , url , method = 'GET' , headers = None , data = None , sign = False ,
153
132
send_json = False ):
154
133
"""Helper method to make a (optionally OAuth signed) HTTP request."""
@@ -264,7 +243,6 @@ def validate_session(self):
264
243
rest = {})
265
244
self ._session .cookies .set_cookie (cookie )
266
245
267
-
268
246
# v2 doesn't need this extra step, just the cookie:
269
247
if self .api_path == API_PATH_V1 :
270
248
response = self ._session .put (url = self ._resolve_url ('/a/session/validate' ), timeout = self .timeout )
@@ -321,24 +299,31 @@ def _resolve_url(self, url):
321
299
322
300
# If there is no scheme specified we create a fully qualified URL.
323
301
if not parse_res [0 ]:
324
- url = '%s://%s%s%s' % (self .scheme , self .domain , self .api_path ,
325
- parse_res [2 ])
302
+ url = '%s://%s%s%s' % (self .scheme , self .domain , self .api_path ,
303
+ parse_res [2 ])
326
304
if parse_res [4 ]:
327
305
url = url + '?' + parse_res [4 ]
328
306
329
307
return url
330
308
309
+ def _response_value (self , response ):
310
+ """ Utility method. Returns decoded json. If the response content cannot be decoded, then
311
+ the content is returned.
312
+
313
+ """
314
+ try :
315
+ return response .json ()
316
+ except ValueError :
317
+ return response .content
318
+
331
319
def get (self , url ):
332
320
"""Issue a GET request to the given URL or API shorthand
333
321
334
322
"""
335
323
response = self ._session .get (self ._resolve_url (url ), timeout = self .timeout )
336
324
self .log_request (response )
337
325
response .raise_for_status ()
338
- try :
339
- return response .json ()
340
- except :
341
- return response .content
326
+ return self ._response_value (response )
342
327
343
328
def options (self , url ):
344
329
"""Send a request with HTTP method OPTIONS to the given
@@ -350,10 +335,7 @@ def options(self, url):
350
335
response = self ._session .options (self ._resolve_url (url ), timeout = self .timeout )
351
336
self .log_request (response )
352
337
response .raise_for_status ()
353
- try :
354
- return response .json ()
355
- except :
356
- return response .content
338
+ return self ._response_value (response )
357
339
358
340
def put (self , url , data = None ):
359
341
"""Issue a PUT request to url (either a full URL or API
@@ -366,10 +348,7 @@ def put(self, url, data=None):
366
348
response = self ._session .put (self ._resolve_url (url ), data = data , timeout = self .timeout )
367
349
self .log_request (response )
368
350
response .raise_for_status ()
369
- try :
370
- return response .json ()
371
- except :
372
- return response .content
351
+ return self ._response_value (response )
373
352
374
353
def post (self , url , data = None ):
375
354
"""Issue a POST request to url (either a full URL or API
@@ -382,10 +361,7 @@ def post(self, url, data=None):
382
361
response = self ._session .post (self ._resolve_url (url ), data = data , timeout = self .timeout )
383
362
self .log_request (response )
384
363
response .raise_for_status ()
385
- try :
386
- return response .json ()
387
- except :
388
- return response .content
364
+ return self ._response_value (response )
389
365
390
366
def delete (self , url ):
391
367
"""Issue a DELETE request to the URL or API shorthand."""
@@ -395,10 +371,7 @@ def delete(self, url):
395
371
# Catch no content responses from some delete actions.
396
372
if response .status_code == 204 :
397
373
return []
398
- try :
399
- return response .json ()
400
- except :
401
- return response .content
374
+ return self ._response_value (response )
402
375
403
376
def upload_creative (self , account_id , file_path ):
404
377
"""Upload a media creative to the account with ID
@@ -441,10 +414,8 @@ def upload_creative(self, account_id, file_path):
441
414
response = self ._session .get (url , headers = headers , data = body , timeout = self .timeout )
442
415
self .log_request (response )
443
416
response .raise_for_status ()
444
- try :
445
- return response .json ()
446
- except :
447
- return response .content
417
+ return self ._response_value (response )
418
+
448
419
449
420
def client_from_file (file_path = '.ox3rc' , env = None ):
450
421
"""Return an instance of ox3apiclient.Client with data from file_path.
@@ -513,4 +484,4 @@ def client_from_file(file_path='.ox3rc', env=None):
513
484
514
485
# The exposed API has moved to using Client instead of OX3APIClient, but create
515
486
# a temporary alias for backwards compatibility.
516
- OX3APIClient = Client
487
+ OX3APIClient = Client
0 commit comments