1
2
3
4
5
6
7
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
52
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
116
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
142