130 lines
4.8 KiB
Python
130 lines
4.8 KiB
Python
# ***** BEGIN GPL LICENSE BLOCK *****
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
# ***** END GPL LICENCE BLOCK *****
|
|
#
|
|
# (c) 2019, Blender Foundation - Sybren A. Stüvel
|
|
|
|
import urllib.parse
|
|
|
|
import requests.packages.urllib3.util.retry
|
|
import requests.adapters
|
|
|
|
|
|
class ShamanClient:
|
|
"""Thin wrapper around a Requests session to perform Shaman requests."""
|
|
|
|
def __init__(self, auth_token: str, base_url: str):
|
|
self._auth_token = auth_token
|
|
self._base_url = base_url
|
|
|
|
retries = requests.packages.urllib3.util.retry.Retry(
|
|
total=10,
|
|
backoff_factor=0.05,
|
|
)
|
|
http_adapter = requests.adapters.HTTPAdapter(max_retries=retries)
|
|
self._session = requests.session()
|
|
self._session.mount('https://', http_adapter)
|
|
self._session.mount('http://', http_adapter)
|
|
|
|
if auth_token:
|
|
self._session.headers['Authorization'] = 'Bearer ' + auth_token
|
|
|
|
def request(self, method: str, url: str, **kwargs) -> requests.Response:
|
|
kwargs.setdefault('timeout', 300)
|
|
full_url = urllib.parse.urljoin(self._base_url, url)
|
|
return self._session.request(method, full_url, **kwargs)
|
|
|
|
def get(self, url, **kwargs):
|
|
r"""Sends a GET request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
kwargs.setdefault('allow_redirects', True)
|
|
return self.request('GET', url, **kwargs)
|
|
|
|
def options(self, url, **kwargs):
|
|
r"""Sends a OPTIONS request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
kwargs.setdefault('allow_redirects', True)
|
|
return self.request('OPTIONS', url, **kwargs)
|
|
|
|
def head(self, url, **kwargs):
|
|
r"""Sends a HEAD request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
kwargs.setdefault('allow_redirects', False)
|
|
return self.request('HEAD', url, **kwargs)
|
|
|
|
def post(self, url, data=None, json=None, **kwargs):
|
|
r"""Sends a POST request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
|
|
object to send in the body of the :class:`Request`.
|
|
:param json: (optional) json to send in the body of the :class:`Request`.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
return self.request('POST', url, data=data, json=json, **kwargs)
|
|
|
|
def put(self, url, data=None, **kwargs):
|
|
r"""Sends a PUT request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
|
|
object to send in the body of the :class:`Request`.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
return self.request('PUT', url, data=data, **kwargs)
|
|
|
|
def patch(self, url, data=None, **kwargs):
|
|
r"""Sends a PATCH request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
|
|
object to send in the body of the :class:`Request`.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
return self.request('PATCH', url, data=data, **kwargs)
|
|
|
|
def delete(self, url, **kwargs):
|
|
r"""Sends a DELETE request. Returns :class:`Response` object.
|
|
|
|
:param url: URL for the new :class:`Request` object.
|
|
:param kwargs: Optional arguments that ``request`` takes.
|
|
:rtype: requests.Response
|
|
"""
|
|
|
|
return self.request('DELETE', url, **kwargs)
|