diff options
author | JinRonin <jin@xyz.de> | 2018-01-18 20:23:15 +0100 |
---|---|---|
committer | Martijn Kaijser <martijn@xbmc.org> | 2018-01-24 18:14:39 +0100 |
commit | 376c75a827b3064a02968888744fd25e5dd5e255 (patch) | |
tree | de33e32c55ef0403e27883848f7de1d61fd8ae7d /plugin.video.eurosportplayer/resources/lib/simple_requests/api.py | |
parent | ecc83e939343fbc3a00fe76fc429f1b322648761 (diff) |
[plugin.video.eurosportplayer] 2.0.6
Diffstat (limited to 'plugin.video.eurosportplayer/resources/lib/simple_requests/api.py')
-rw-r--r-- | plugin.video.eurosportplayer/resources/lib/simple_requests/api.py | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/plugin.video.eurosportplayer/resources/lib/simple_requests/api.py b/plugin.video.eurosportplayer/resources/lib/simple_requests/api.py new file mode 100644 index 0000000..42b01b8 --- /dev/null +++ b/plugin.video.eurosportplayer/resources/lib/simple_requests/api.py @@ -0,0 +1,170 @@ +__author__ = 'bromix' + +import urllib +import urllib2 +from StringIO import StringIO +import gzip + +import json as real_json + +class ErrorHandler(urllib2.HTTPDefaultErrorHandler): + def http_error_default(self, req, fp, code, msg, hdrs): + infourl = urllib.addinfourl(fp, hdrs, req.get_full_url()) + infourl.status = code + infourl.code = code + return infourl + + +class NoRedirectHandler(urllib2.HTTPRedirectHandler): + def http_error_302(self, req, fp, code, msg, headers): + infourl = urllib.addinfourl(fp, headers, req.get_full_url()) + infourl.status = code + infourl.code = code + return infourl + + http_error_300 = http_error_302 + http_error_301 = http_error_302 + http_error_303 = http_error_302 + http_error_307 = http_error_302 + + +class Response(): + def __init__(self): + self.headers = {} + self.code = -1 + self.text = u'' + self.status_code = -1 + + def read(self): + return self.text + + def json(self): + return real_json.loads(self.text) + + +def _request(method, url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=False, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None): + if not headers: + headers = {} + + url = urllib.quote(url, safe="%/:=&?~#+!$,;'@()*[]") + handlers = [] + + import sys + # starting with python 2.7.9 urllib verifies every https request + if False == verify and sys.version_info >= (2, 7, 9): + import ssl + + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + handlers.append(urllib2.HTTPSHandler(context=ssl_context)) + + # handlers.append(urllib2.HTTPCookieProcessor()) + # handlers.append(ErrorHandler) + if not allow_redirects: + handlers.append(NoRedirectHandler) + opener = urllib2.build_opener(*handlers) + + query = '' + if params: + for key in params: + value = params[key] + if isinstance(value, str): + value = value.decode('utf-8') + params[key] = value.encode('utf-8') + query = urllib.urlencode(params) + if query: + url += '?%s' % query + request = urllib2.Request(url) + if headers: + for key in headers: + request.add_header(key, str(unicode(headers[key]).encode('utf-8'))) + if data or json: + if headers.get('Content-Type', '').startswith('application/x-www-form-urlencoded') or data: + # transform a string into a map of values + if isinstance(data, basestring): + _data = data.split('&') + data = {} + for item in _data: + name, value = item.split('=') + data[name] = value + + # encode each value + for key in data: + data[key] = data[key] + if isinstance(data[key], unicode): + data[key] = data[key].encode('utf-8') + + # urlencode + request.data = urllib.urlencode(data) + elif headers.get('Content-Type', '').startswith('application/json') and data: + request.data = real_json.dumps(data).encode('utf-8') + elif json: + request.data = real_json.dumps(json).encode('utf-8') + else: + if not isinstance(data, basestring): + data = str(data) + + if isinstance(data, str): + data = data.encode('utf-8') + request.data = data + elif method.upper() in ['POST', 'PUT']: + request.data = "null" + request.get_method = lambda: method + result = Response() + response = None + try: + response = opener.open(request, timeout=timeout) + except urllib2.HTTPError as e: + # HTTPError implements addinfourl, so we can use the exception to construct a response + if isinstance(e, urllib2.addinfourl): + response = e + + # process response + result.headers.update(response.headers) + result.status_code = response.getcode() + if response.headers.get('Content-Encoding', '').startswith('gzip'): + buf = StringIO(response.read()) + f = gzip.GzipFile(fileobj=buf) + result.text = f.read() + elif stream: + return result + else: + result.text = response.read() + return result + + +def get(url, **kwargs): + kwargs.setdefault('allow_redirects', True) + return _request('GET', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + kwargs.setdefault('allow_redirects', True) + return _request('POST', url, data=data, json=json, **kwargs) + + +def put(url, data=None, json=None, **kwargs): + return _request('PUT', url, data=data, json=json, **kwargs) + + +def delete(url, **kwargs): + return _request('DELETE', url, **kwargs) + + +def head(url, **kwargs): + return _request('HEAD', url, **kwargs)
\ No newline at end of file |