apppublic/http_client.py
2020-05-25 17:46:50 +08:00

121 lines
2.8 KiB
Python

import requests
class NeedLogin(Exception):
pass
class InsufficientPrivilege(Exception):
pass
class HTTPError(Exception):
def __init__(self,resp_code):
self.resp_code = resp_code
Exception.__init__(self)
def __expr__(self):
return f'Exception:return code={self.resp_code}'
def __str__(self):
return f'Exception:return code={self.resp_code}'
hostsessions = {}
class HttpClient:
def __init__(self):
self.s = requests.Session()
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)
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))
raise HTTPError(resp.status_code)
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':
return data['data']
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)