text: # coding: utf-8
  # -----------------------------------------------------------------------------------
  # <copyright company="Aspose Pty Ltd" file="rest.py">
  #   Copyright (c) 2003-2021 Aspose Pty Ltd
  # </copyright>
  # <summary>
  #   Permission is hereby granted, free of charge, to any person obtaining a copy
  #  of this software and associated documentation files (the "Software"), to deal
  #  in the Software without restriction, including without limitation the rights
  #  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  #  copies of the Software, and to permit persons to whom the Software is
  #  furnished to do so, subject to the following conditions:
  #
  #  The above copyright notice and this permission notice shall be included in all
  #  copies or substantial portions of the Software.
  #
  #  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  #  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  #  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  #  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  #  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  #  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  #  SOFTWARE.
  # </summary>
  # -----------------------------------------------------------------------------------
  
  from __future__ import absolute_import
  
  import io
  import json
  import logging
  import re
  import ssl
  
  import certifi
  # python 2 and python 3 compatibility library
  import six
  from six.moves.urllib.parse import urlencode
  
  try:
      import urllib3
  except ImportError:
      raise ImportError('Swagger python client requires urllib3.')
  
  from groupdocs_signature_cloud.api_exception import ApiException
  
  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
  
          # ca_certs
          if configuration.ssl_ca_cert:
              ca_certs = configuration.ssl_ca_cert
          else:
              # if not set certificate file, use Mozilla's root certificates.
              ca_certs = certifi.where()
  
          addition_pool_args = {}
          if configuration.assert_hostname is not None:
              addition_pool_args['assert_hostname'] = configuration.assert_hostname  # noqa: E501
  
          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=ca_certs,
                  cert_file=configuration.cert_file,
                  key_file=configuration.key_file,
                  proxy_url=configuration.proxy,
                  **addition_pool_args
              )
          else:
              self.pool_manager = urllib3.PoolManager(
                  num_pools=pools_size,
                  maxsize=maxsize,
                  cert_reqs=cert_reqs,
                  ca_certs=ca_certs,
                  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 ValueError(
                  "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, ) if six.PY3 else (int, long)):  #pylint: disable=undefined-variable
                  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 not six.PY3:
                      url = url.encode('utf8')
                  if re.search('json', headers['Content-Type'], re.IGNORECASE):
                      request_body = ''
                      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):
                      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:
              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)
  