diff --git a/http_client.py b/http_client.py new file mode 100644 index 0000000..0145b1c --- /dev/null +++ b/http_client.py @@ -0,0 +1,120 @@ +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) +