text: """
      Kleister OpenAPI
  
      API definition for Kleister, manage mod packs for Minecraft  # noqa: E501
  
      The version of the OpenAPI document: 1.0.0-alpha1
      Generated by: https://openapi-generator.tech
  """
  
  
  import io
  import json
  import logging
  import re
  import ssl
  from urllib.parse import urlencode
  
  import urllib3
  
  from kleister.exceptions import (
      ApiException,
      UnauthorizedException,
      ForbiddenException,
      NotFoundException,
      ServiceException,
      ApiValueError,
  )
  
  
  logger = logging.getLogger(__name__)
  
  
  class RESTResponse(io.IOBase):
      def __init__(self, resp):
          self.urllib3_response = resp
          self.status = resp.status
          self.reason = resp.reason
          self.data = resp.data
  
      def getheaders(self):
          """Returns a dictionary of the response headers."""
          return self.urllib3_response.getheaders()
  
      def getheader(self, name, default=None):
          """Returns a given response header."""
          return self.urllib3_response.getheader(name, default)
  
  
  class RESTClientObject(object):
      def __init__(self, configuration, pools_size=4, maxsize=None):
          # urllib3.PoolManager will pass all kw parameters to connectionpool
          # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75  # noqa: E501
          # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680  # noqa: E501
          # maxsize is the number of requests to host that are allowed in parallel  # noqa: E501
          # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html  # noqa: E501
  
          # cert_reqs
          if configuration.verify_ssl:
              cert_reqs = ssl.CERT_REQUIRED
          else:
              cert_reqs = ssl.CERT_NONE
  
          addition_pool_args = {}
          if configuration.assert_hostname is not None:
              addition_pool_args[
                  "assert_hostname"
              ] = configuration.assert_hostname  # noqa: E501
  
          if configuration.retries is not None:
              addition_pool_args["retries"] = configuration.retries
  
          if configuration.socket_options is not None:
              addition_pool_args["socket_options"] = configuration.socket_options
  
          if maxsize is None:
              if configuration.connection_pool_maxsize is not None:
                  maxsize = configuration.connection_pool_maxsize
              else:
                  maxsize = 4
  
          # https pool manager
          if configuration.proxy:
              self.pool_manager = urllib3.ProxyManager(
                  num_pools=pools_size,
                  maxsize=maxsize,
                  cert_reqs=cert_reqs,
                  ca_certs=configuration.ssl_ca_cert,
                  cert_file=configuration.cert_file,
                  key_file=configuration.key_file,
                  proxy_url=configuration.proxy,
                  proxy_headers=configuration.proxy_headers,
                  **addition_pool_args
              )
          else:
              self.pool_manager = urllib3.PoolManager(
                  num_pools=pools_size,
                  maxsize=maxsize,
                  cert_reqs=cert_reqs,
                  ca_certs=configuration.ssl_ca_cert,
                  cert_file=configuration.cert_file,
                  key_file=configuration.key_file,
                  **addition_pool_args
              )
  
      def request(
          self,
          method,
          url,
          query_params=None,
          headers=None,
          body=None,
          post_params=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          """Perform requests.
  
          :param method: http request method
          :param url: http request url
          :param query_params: query parameters in the url
          :param headers: http request headers
          :param body: request json body, for `application/json`
          :param post_params: request post parameters,
                              `application/x-www-form-urlencoded`
                              and `multipart/form-data`
          :param _preload_content: if False, the urllib3.HTTPResponse object will
                                   be returned without reading/decoding response
                                   data. Default is True.
          :param _request_timeout: timeout setting for this request. If one
                                   number provided, it will be total request
                                   timeout. It can also be a pair (tuple) of
                                   (connection, read) timeouts.
          """
          method = method.upper()
          assert method in ["GET", "HEAD", "DELETE", "POST", "PUT", "PATCH", "OPTIONS"]
  
          if post_params and body:
              raise ApiValueError(
                  "body parameter cannot be used with post_params parameter."
              )
  
          post_params = post_params or {}
          headers = headers or {}
  
          timeout = None
          if _request_timeout:
              if isinstance(_request_timeout, (int, float)):  # noqa: E501,F821
                  timeout = urllib3.Timeout(total=_request_timeout)
              elif isinstance(_request_timeout, tuple) and len(_request_timeout) == 2:
                  timeout = urllib3.Timeout(
                      connect=_request_timeout[0], read=_request_timeout[1]
                  )
  
          if "Content-Type" not in headers:
              headers["Content-Type"] = "application/json"
  
          try:
              # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
              if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]:
                  if query_params:
                      url += "?" + urlencode(query_params)
                  if re.search("json", headers["Content-Type"], re.IGNORECASE):
                      request_body = None
                      if body is not None:
                          request_body = json.dumps(body)
                      r = self.pool_manager.request(
                          method,
                          url,
                          body=request_body,
                          preload_content=_preload_content,
                          timeout=timeout,
                          headers=headers,
                      )
                  elif (
                      headers["Content-Type"] == "application/x-www-form-urlencoded"
                  ):  # noqa: E501
                      r = self.pool_manager.request(
                          method,
                          url,
                          fields=post_params,
                          encode_multipart=False,
                          preload_content=_preload_content,
                          timeout=timeout,
                          headers=headers,
                      )
                  elif headers["Content-Type"] == "multipart/form-data":
                      # must del headers['Content-Type'], or the correct
                      # Content-Type which generated by urllib3 will be
                      # overwritten.
                      del headers["Content-Type"]
                      r = self.pool_manager.request(
                          method,
                          url,
                          fields=post_params,
                          encode_multipart=True,
                          preload_content=_preload_content,
                          timeout=timeout,
                          headers=headers,
                      )
                  # Pass a `string` parameter directly in the body to support
                  # other content types than Json when `body` argument is
                  # provided in serialized form
                  elif isinstance(body, str) or isinstance(body, bytes):
                      request_body = body
                      r = self.pool_manager.request(
                          method,
                          url,
                          body=request_body,
                          preload_content=_preload_content,
                          timeout=timeout,
                          headers=headers,
                      )
                  else:
                      # Cannot generate the request from given parameters
                      msg = """Cannot prepare a request message for provided
                               arguments. Please check that your arguments match
                               declared content type."""
                      raise ApiException(status=0, reason=msg)
              # For `GET`, `HEAD`
              else:
                  r = self.pool_manager.request(
                      method,
                      url,
                      fields=query_params,
                      preload_content=_preload_content,
                      timeout=timeout,
                      headers=headers,
                  )
          except urllib3.exceptions.SSLError as e:
              msg = "{0}\n{1}".format(type(e).__name__, str(e))
              raise ApiException(status=0, reason=msg)
  
          if _preload_content:
              r = RESTResponse(r)
  
              # log response body
              logger.debug("response body: %s", r.data)
  
          if not 200 <= r.status <= 299:
              if r.status == 401:
                  raise UnauthorizedException(http_resp=r)
  
              if r.status == 403:
                  raise ForbiddenException(http_resp=r)
  
              if r.status == 404:
                  raise NotFoundException(http_resp=r)
  
              if 500 <= r.status <= 599:
                  raise ServiceException(http_resp=r)
  
              raise ApiException(http_resp=r)
  
          return r
  
      def GET(
          self,
          url,
          headers=None,
          query_params=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "GET",
              url,
              headers=headers,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              query_params=query_params,
          )
  
      def HEAD(
          self,
          url,
          headers=None,
          query_params=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "HEAD",
              url,
              headers=headers,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              query_params=query_params,
          )
  
      def OPTIONS(
          self,
          url,
          headers=None,
          query_params=None,
          post_params=None,
          body=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "OPTIONS",
              url,
              headers=headers,
              query_params=query_params,
              post_params=post_params,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              body=body,
          )
  
      def DELETE(
          self,
          url,
          headers=None,
          query_params=None,
          body=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "DELETE",
              url,
              headers=headers,
              query_params=query_params,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              body=body,
          )
  
      def POST(
          self,
          url,
          headers=None,
          query_params=None,
          post_params=None,
          body=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "POST",
              url,
              headers=headers,
              query_params=query_params,
              post_params=post_params,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              body=body,
          )
  
      def PUT(
          self,
          url,
          headers=None,
          query_params=None,
          post_params=None,
          body=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "PUT",
              url,
              headers=headers,
              query_params=query_params,
              post_params=post_params,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              body=body,
          )
  
      def PATCH(
          self,
          url,
          headers=None,
          query_params=None,
          post_params=None,
          body=None,
          _preload_content=True,
          _request_timeout=None,
      ):
          return self.request(
              "PATCH",
              url,
              headers=headers,
              query_params=query_params,
              post_params=post_params,
              _preload_content=_preload_content,
              _request_timeout=_request_timeout,
              body=body,
          )
  