2021-10-18 15:54:04 +02:00
|
|
|
# ***** 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()
|
2023-01-10 11:41:55 +01:00
|
|
|
self._session.mount("https://", http_adapter)
|
|
|
|
self._session.mount("http://", http_adapter)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
if auth_token:
|
2023-01-10 11:41:55 +01:00
|
|
|
self._session.headers["Authorization"] = "Bearer " + auth_token
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
def request(self, method: str, url: str, **kwargs) -> requests.Response:
|
2023-01-10 11:41:55 +01:00
|
|
|
kwargs.setdefault("timeout", 300)
|
2021-10-18 15:54:04 +02:00
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
kwargs.setdefault("allow_redirects", True)
|
|
|
|
return self.request("GET", url, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
kwargs.setdefault("allow_redirects", True)
|
|
|
|
return self.request("OPTIONS", url, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
kwargs.setdefault("allow_redirects", False)
|
|
|
|
return self.request("HEAD", url, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
return self.request("POST", url, data=data, json=json, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
return self.request("PUT", url, data=data, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
return self.request("PATCH", url, data=data, **kwargs)
|
2021-10-18 15:54:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
"""
|
|
|
|
|
2023-01-10 11:41:55 +01:00
|
|
|
return self.request("DELETE", url, **kwargs)
|