/
http_request.py
138 lines (125 loc) · 5.13 KB
/
http_request.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#coding:utf-8
import re
import requests
from requests import Request,Response
from utils.utils import lower_dict_keys,omit_long_data
from utils.exceptions import ParamsError
from utils import log
logger=log.logger()
class ApiResponse(Response):
def raise_for_status(self):
if hasattr(self, 'error') and self.error:
raise self.error
Response.raise_for_status(self)
class HttpRequest(requests.Session):
def __init__(self,base_url=None,*arg,**kwargs):
super(HttpRequest,self).__init__(*arg,**kwargs)
self.base_url=base_url if base_url else ''
self.init_case_data()
def init_case_data(self):
self.init_data={
"name": "",
"data": [
{
"request": {
"url": "N/A",
"method": "N/A",
"headers": {}
},
"response": {
"status_code": "N/A",
"headers": {},
"encoding": None,
"content_type": ""
}
}
],
"data_check": {
"times": 1,
'type':'query',
"sql": "N/A",
"data_source": {},
}
}
def get_req_resp_record(self,resp_obj):
""" get request and response info from Response() object.
"""
def log_print(req_resp_dict,r_type):
msg="\n-----------{} detail:----------\n".format(r_type)
for k,v in req_resp_dict[r_type].items():
msg+="{:<50} : {}".format(k,repr(v))
logger.debug(msg)
req_resp_dict={
"request":{},
"response":{}
}
# record request info
req_resp_dict['request']['url']=resp_obj.request.url
req_resp_dict['request']['headers']=dict(resp_obj.request.headers)
request_body=resp_obj.request.body
if request_body:
request_content_type = lower_dict_keys(req_resp_dict['request']['headers']).get('content-type')
if request_content_type and "multipart/form-data" in request_content_type:
# upload file type
req_resp_dict["request"]["body"] = "upload file stream (OMITTED)"
else:
req_resp_dict["request"]["body"] = request_body
log_print(req_resp_dict,'request')
# record response info
req_resp_dict["response"]["url"] = resp_obj.url
req_resp_dict["response"]["status_code"] = resp_obj.status_code
req_resp_dict["response"]["reason"] = resp_obj.reason
req_resp_dict["response"]["cookies"] = resp_obj.cookies or {}
req_resp_dict["response"]["encoding"] = resp_obj.encoding
resp_headers = dict(resp_obj.headers)
req_resp_dict["response"]["headers"] = resp_headers
lower_resp_headers = lower_dict_keys(resp_headers)
content_type = lower_resp_headers.get("content-type", "")
req_resp_dict["response"]["content_type"] = content_type
if "image" in content_type:
# response is image type, record bytes content only
req_resp_dict["response"]["content"] = resp_obj.content
else:
try:
# try to record json data
req_resp_dict["response"]["json"] = resp_obj.json()
except ValueError:
# only record at most 512 text charactors
resp_text = resp_obj.text
req_resp_dict["response"]["text"] = omit_long_data(resp_text)
log_print(req_resp_dict, "response")
return req_resp_dict
def request(self,method, url, name=None, **kwargs):
# test name
self.init_data['name']=name
# request info
self.init_data[0]['request']['method']=method
self.init_data[0]['request']['url']=url
absolute_http_url_regexp = re.compile(r"^https?://", re.I)
if absolute_http_url_regexp.match(url):
pass
elif self.base_url:
url="{}/{}".format(self.base_url.rstrip("/"), url.lstrip("/"))
else:
logger.error('request :{} --base url missed!'.format(url or name))
raise ParamsError("base url missed!")
resp_obj=self._send_request(method,url,**kwargs)
self.init_data['data']=[self.get_req_resp_record(resp_obj)]
try:
resp_obj.raise_for_status()
except requests.RequestException as e:
logger.error(u"{exception}".format(exception=str(e)))
else:
logger.error(
"status_code: {}\n".format(resp_obj.status_code))
return resp_obj
def _send_request(self,method, url, **kwargs):
try:
msg = "processed request:\n"
msg += "> {method} {url}\n".format(method=method, url=url)
msg += "> kwargs: {kwargs}".format(kwargs=kwargs)
logger.debug(msg)
return requests.Session.request(self, method, url, **kwargs)
except requests.RequestException as ex:
logger.error("RequestException:\n{}".format(str(ex)) )
raise