apppublic/appPublic/http_client.py

131 lines
3.0 KiB
Python
Raw Normal View History

2020-05-25 17:46:50 +08:00
import requests
class NeedLogin(Exception):
pass
class InsufficientPrivilege(Exception):
pass
class HTTPError(Exception):
2020-06-03 16:27:25 +08:00
def __init__(self,resp_code,url=None):
2020-05-25 17:46:50 +08:00
self.resp_code = resp_code
2020-06-03 16:27:25 +08:00
self.url = url
2020-05-25 17:46:50 +08:00
Exception.__init__(self)
def __expr__(self):
2020-06-03 16:27:25 +08:00
return f'{self.url}:{self.resp_code}'
2020-05-25 17:46:50 +08:00
def __str__(self):
2020-06-03 16:27:25 +08:00
return f'{self.url}:{self.resp_code}'
2020-05-25 17:46:50 +08:00
hostsessions = {}
2020-06-05 09:54:55 +08:00
class Http_Client:
2020-05-25 17:46:50 +08:00
def __init__(self):
self.s = requests.Session()
2020-06-05 09:54:55 +08:00
self.s.verify = False
2022-06-07 14:00:59 +08:00
self.s.hooks['response'].append(self.response_handler)
def prepped_handler(self, prepped):
pass
def response_handler(self, resp, *args, **kw):
return resp
2020-05-25 17:46:50 +08:00
def url2domain(self,url):
parts = url.split('/')[:3]
pre = '/'.join(parts)
return pre
def _webcall(self,url,method="GET",
params={},
files={},
headers={},
stream=False):
domain = self.url2domain(url)
sessionid = hostsessions.get(domain,None)
if sessionid:
headers.update({'session':sessionid})
if method in ['GET']:
req = requests.Request(method,url,
params=params,headers=headers)
else:
req = requests.Request(method,url,
data=params,files=files,headers=headers)
prepped = self.s.prepare_request(req)
2022-06-07 14:00:59 +08:00
self.prepped_handler(prepped)
2020-05-25 17:46:50 +08:00
resp = self.s.send(prepped)
if resp.status_code == 200:
h = resp.headers.get('Set-Cookie',None)
if h:
sessionid = h.split(';')[0]
hostsessions[domain] = sessionid
if resp.status_code == 401:
print('NeedLogin:',url)
raise NeedLogin
if resp.status_code == 403:
raise InsufficientPrivilege
if resp.status_code != 200:
print('Error', url, method,
params, resp.status_code,
type(resp.status_code))
2020-06-05 09:54:55 +08:00
raise HTTPError(resp.status_code,url)
2020-05-25 17:46:50 +08:00
return resp
def webcall(self,url,method="GET",
params={},
files={},
headers={},
stream=False):
resp = self._webcall(url,method=method,
params=params,
files=files,
headers=headers,
stream=stream)
if stream:
return resp
try:
data = resp.json()
if type(data) != type({}):
return data
status = data.get('status',None)
if status is None:
return data
if status == 'OK':
2020-12-07 18:54:57 +08:00
return data.get('data')
2020-05-25 17:46:50 +08:00
return data
except:
return resp.text
def __call__(self,url,method="GET",
params={},
headers={},
files={},
stream=False):
return self.webcall(url, method=method,
params=params, files=files, headers=headers)
def get(self, url, params={}, headers={}):
return self.__call__(url,method='GET',params=params,
headers=headers)
def post(self, url, params={}, headers={}, files={}):
return self.__call__(url,method='POST',params=params, files=files,
headers=headers)
def put(self, url, params={}, headers={}):
return self.__call__(url,method='PUT',params=params,
headers=headers)
def delete(self, url, params={}, headers={}):
return self.__call__(url,method='DELETE',params=params,
headers=headers)
def option(self, url, params={}, headers={}):
return self.__call__(url,method='OPTION',params=params,
headers=headers)