Package passtools :: Module pt_client
[hide private]
[frames] | no frames]

Source Code for Module passtools.pt_client

  1  #!/usr/bin/env python 
  2  ########################################## 
  3  # pt_client.py 
  4  #  
  5  # Interface to PassTools REST API 
  6  # 
  7  # Copyright 2013, Urban Airship, Inc. 
  8  ########################################## 
  9  """ 
 10  HTTP interface to PassTools REST API, used indirectly, via other PassTools classes. 
 11   
 12  """ 
 13   
 14  import copy 
 15  import requests 
 16   
 17  try: 
 18      import simplejson as json 
 19  except ImportError: 
 20      import json 
 21   
 22  from passtools import PassTools 
 23   
 24  SSL_CERT_VERIFY = False 
 25  STD_ENCODING = "ISO-8859-1" 
 26  STD_HEADERS = {'Content-Type':'application/x-www-form-urlencoded', 'Accept':'*/*'} 
 27   
28 -def __pt_request(request_func, request_url_frag, request_data = {}):
29 """ 30 Base HTTP request handler. Called only indirectly. 31 32 @type request_func: function 33 @param request_func: Function requested 34 @type request_url_frag: str 35 @param request_url_frag: URL fragment (to be appended to base_URL) 36 @type request_data: dict 37 @param request_data: Request parameters 38 @return: json form of template full-form description 39 """ 40 if not PassTools.api_key: 41 raise RuntimeError("No API secret key provided. Cannot continue.") 42 request_url = "%s%s" % (PassTools.base_url, request_url_frag) 43 44 request_data_dict = copy.deepcopy(request_data) 45 request_data_dict.update({"api_key":PassTools.api_key}) 46 47 resp = request_func(request_url, params = request_data_dict, headers = STD_HEADERS, verify = SSL_CERT_VERIFY) 48 __raise_for_status(resp) 49 50 resp.encoding = STD_ENCODING 51 # User can request raw response by setting test_mode = True; else returns will be json-decoded 52 # And hate to special case like this, but download needs special handling 53 if PassTools.test_mode or ('download' in request_url): 54 return resp 55 else: 56 return resp.json()
57
58 -def pt_get(request_url_frag, request_data = {}):
59 """ 60 HTTP GET 61 62 @type request_func: function 63 @param request_func: Function requested 64 @type request_url_frag: str 65 @param request_url_frag: URL fragment (to be appended to base_URL) 66 @type request_data: dict 67 @param request_data: Request parameters 68 @return: json form of template full-form description 69 """ 70 return __pt_request(requests.get, request_url_frag, request_data)
71
72 -def pt_post(request_url_frag, request_data = {}):
73 """ 74 HTTP POST 75 76 @type request_func: function 77 @param request_func: Function requested 78 @type request_url_frag: str 79 @param request_url_frag: URL fragment (to be appended to base_URL) 80 @type request_data: dict 81 @param request_data: Request parameters 82 @return: json form of template full-form description 83 """ 84 return __pt_request(requests.post, request_url_frag, request_data)
85
86 -def pt_put(request_url_frag, request_data = {}):
87 """ 88 HTTP PUT 89 90 @type request_func: function 91 @param request_func: Function requested 92 @type request_url_frag: str 93 @param request_url_frag: URL fragment (to be appended to base_URL) 94 @type request_data: dict 95 @param request_data: Request parameters 96 @return: json form of template full-form description 97 """ 98 return __pt_request(requests.put, request_url_frag, request_data)
99
100 -def pt_delete(request_url_frag, request_data = {}):
101 """ 102 HTTP DELETE 103 104 @type request_func: function 105 @param request_func: Function requested 106 @type request_url_frag: str 107 @param request_url_frag: URL fragment (to be appended to base_URL) 108 @type request_data: dict 109 @param request_data: Request parameters 110 @return: json form of template full-form description 111 """ 112 return __pt_request(requests.delete, request_url_frag, request_data)
113 114
115 -def __raise_for_status(response):
116 # Override the version in Requests so I can get better reporting 117 118 http_error_msg = '' 119 120 if 400 <= response.status_code < 500: 121 122 decoded_content = "" 123 content_dict = json.loads(response.content, encoding='ISO-8859-1') 124 if "description" in content_dict: 125 decoded_content += content_dict['description'] + " " 126 if "details" in content_dict: 127 decoded_content += content_dict['details'] 128 http_error_msg = '%s Client Error: %s. %s' % (response.status_code, response.reason, decoded_content) 129 130 elif 500 <= response.status_code < 600: 131 http_error_msg = '%s Server Error: %s' % (response.status_code, response.reason) 132 133 if http_error_msg: 134 http_error = PassToolsException(http_status=response.status_code, message=http_error_msg, response=response) 135 http_error.response = response 136 raise http_error
137 138
139 -class PassToolsException(Exception):
140 - def __init__(self, http_status=None, message=None, response=None):
141 super(PassToolsException, self).__init__(message)
142