ringcentral.http.client

  1#!/usr/bin/env python
  2# encoding: utf-8
  3import json
  4import urllib
  5import requests
  6
  7from .api_response import ApiResponse
  8from .api_exception import ApiException
  9from ..core import urlencode, iterator
 10
 11
 12class Client:
 13    def __init__(self):
 14        pass
 15
 16    def send(self, request):
 17        """
 18            Send the HTTP request and handle the response.
 19
 20            Args:
 21                request (obj): The HTTP request object.
 22
 23            Returns:
 24                obj: The HTTP response object.
 25
 26            Raises:
 27                ApiException: If an error occurs during the request or response handling.
 28        """
 29        response = None
 30
 31        try:
 32            prepared = request
 33            if isinstance(prepared, requests.models.Request): # not a prepared request
 34                prepared = request.prepare()
 35            response = self.load_response(prepared)
 36
 37            if response.ok():
 38                return response
 39            else:
 40                response.response().raise_for_status()
 41
 42        except Exception as e:
 43            if response is None:
 44                response = ApiResponse(request)
 45
 46            raise ApiException(response, e)
 47
 48    def load_response(self, request):
 49        # TODO Persist between requests?
 50        session = None
 51
 52        try:
 53            session = requests.sessions.Session()
 54            response = session.send(request)
 55            session.close()
 56
 57            return ApiResponse(request, response)
 58
 59        except Exception:
 60            if session:
 61                session.close()
 62            raise
 63
 64    def create_request(self, method='', url='', query_params=None, body=None, headers=None):
 65        """
 66            Create an HTTP request object.
 67
 68            Args:
 69                method (str): The HTTP method (e.g., GET, POST).
 70                url (str): The URL for the request.
 71                query_params (dict, optional): Dictionary containing query parameters.
 72                body (dict, optional): Request body data.
 73                headers (dict, optional): Request headers.
 74
 75            Returns:
 76                requests.Request: The HTTP request object.
 77
 78            """
 79        if query_params:
 80            if type(query_params) is dict:
 81                query = ""
 82                for key, value in  iter(query_params.items()):
 83                    if type(value) is list:
 84                        for k in value:
 85                            query += ("%s=%s&" % (key, k))
 86                    else:
 87                        query += ("%s=%s&" % (key, value))
 88                query = query[:-1]
 89            else:
 90                query = urlencode(query_params)
 91            if query:
 92                url = url + ('&' if url.find('?') > 0 else '?') + query
 93
 94        content_type = None
 95
 96        if headers is None:
 97            headers = {}
 98
 99        it = iterator(headers)
100
101        for key, value in it:
102            if key.lower().find('content-type') >= 0:
103                content_type = value
104            if key.lower().find('accept') >= 0:
105                headers['Accept'] = value
106
107        if content_type is None:
108            content_type = 'application/json'
109            headers['Content-Type'] = content_type
110
111        if content_type.lower().find('application/json') >= 0:
112            body = json.dumps(body) if body else None
113        elif content_type.lower().find('application/x-www-form-urlencoded') >= 0:
114            body = urlencode(body) if body else None
115
116        return requests.Request(method, url, headers=headers, data=body)
class Client:
 13class Client:
 14    def __init__(self):
 15        pass
 16
 17    def send(self, request):
 18        """
 19            Send the HTTP request and handle the response.
 20
 21            Args:
 22                request (obj): The HTTP request object.
 23
 24            Returns:
 25                obj: The HTTP response object.
 26
 27            Raises:
 28                ApiException: If an error occurs during the request or response handling.
 29        """
 30        response = None
 31
 32        try:
 33            prepared = request
 34            if isinstance(prepared, requests.models.Request): # not a prepared request
 35                prepared = request.prepare()
 36            response = self.load_response(prepared)
 37
 38            if response.ok():
 39                return response
 40            else:
 41                response.response().raise_for_status()
 42
 43        except Exception as e:
 44            if response is None:
 45                response = ApiResponse(request)
 46
 47            raise ApiException(response, e)
 48
 49    def load_response(self, request):
 50        # TODO Persist between requests?
 51        session = None
 52
 53        try:
 54            session = requests.sessions.Session()
 55            response = session.send(request)
 56            session.close()
 57
 58            return ApiResponse(request, response)
 59
 60        except Exception:
 61            if session:
 62                session.close()
 63            raise
 64
 65    def create_request(self, method='', url='', query_params=None, body=None, headers=None):
 66        """
 67            Create an HTTP request object.
 68
 69            Args:
 70                method (str): The HTTP method (e.g., GET, POST).
 71                url (str): The URL for the request.
 72                query_params (dict, optional): Dictionary containing query parameters.
 73                body (dict, optional): Request body data.
 74                headers (dict, optional): Request headers.
 75
 76            Returns:
 77                requests.Request: The HTTP request object.
 78
 79            """
 80        if query_params:
 81            if type(query_params) is dict:
 82                query = ""
 83                for key, value in  iter(query_params.items()):
 84                    if type(value) is list:
 85                        for k in value:
 86                            query += ("%s=%s&" % (key, k))
 87                    else:
 88                        query += ("%s=%s&" % (key, value))
 89                query = query[:-1]
 90            else:
 91                query = urlencode(query_params)
 92            if query:
 93                url = url + ('&' if url.find('?') > 0 else '?') + query
 94
 95        content_type = None
 96
 97        if headers is None:
 98            headers = {}
 99
100        it = iterator(headers)
101
102        for key, value in it:
103            if key.lower().find('content-type') >= 0:
104                content_type = value
105            if key.lower().find('accept') >= 0:
106                headers['Accept'] = value
107
108        if content_type is None:
109            content_type = 'application/json'
110            headers['Content-Type'] = content_type
111
112        if content_type.lower().find('application/json') >= 0:
113            body = json.dumps(body) if body else None
114        elif content_type.lower().find('application/x-www-form-urlencoded') >= 0:
115            body = urlencode(body) if body else None
116
117        return requests.Request(method, url, headers=headers, data=body)
def send(self, request):
17    def send(self, request):
18        """
19            Send the HTTP request and handle the response.
20
21            Args:
22                request (obj): The HTTP request object.
23
24            Returns:
25                obj: The HTTP response object.
26
27            Raises:
28                ApiException: If an error occurs during the request or response handling.
29        """
30        response = None
31
32        try:
33            prepared = request
34            if isinstance(prepared, requests.models.Request): # not a prepared request
35                prepared = request.prepare()
36            response = self.load_response(prepared)
37
38            if response.ok():
39                return response
40            else:
41                response.response().raise_for_status()
42
43        except Exception as e:
44            if response is None:
45                response = ApiResponse(request)
46
47            raise ApiException(response, e)

Send the HTTP request and handle the response.

Args: request (obj): The HTTP request object.

Returns: obj: The HTTP response object.

Raises: ApiException: If an error occurs during the request or response handling.

def load_response(self, request):
49    def load_response(self, request):
50        # TODO Persist between requests?
51        session = None
52
53        try:
54            session = requests.sessions.Session()
55            response = session.send(request)
56            session.close()
57
58            return ApiResponse(request, response)
59
60        except Exception:
61            if session:
62                session.close()
63            raise
def create_request(self, method='', url='', query_params=None, body=None, headers=None):
 65    def create_request(self, method='', url='', query_params=None, body=None, headers=None):
 66        """
 67            Create an HTTP request object.
 68
 69            Args:
 70                method (str): The HTTP method (e.g., GET, POST).
 71                url (str): The URL for the request.
 72                query_params (dict, optional): Dictionary containing query parameters.
 73                body (dict, optional): Request body data.
 74                headers (dict, optional): Request headers.
 75
 76            Returns:
 77                requests.Request: The HTTP request object.
 78
 79            """
 80        if query_params:
 81            if type(query_params) is dict:
 82                query = ""
 83                for key, value in  iter(query_params.items()):
 84                    if type(value) is list:
 85                        for k in value:
 86                            query += ("%s=%s&" % (key, k))
 87                    else:
 88                        query += ("%s=%s&" % (key, value))
 89                query = query[:-1]
 90            else:
 91                query = urlencode(query_params)
 92            if query:
 93                url = url + ('&' if url.find('?') > 0 else '?') + query
 94
 95        content_type = None
 96
 97        if headers is None:
 98            headers = {}
 99
100        it = iterator(headers)
101
102        for key, value in it:
103            if key.lower().find('content-type') >= 0:
104                content_type = value
105            if key.lower().find('accept') >= 0:
106                headers['Accept'] = value
107
108        if content_type is None:
109            content_type = 'application/json'
110            headers['Content-Type'] = content_type
111
112        if content_type.lower().find('application/json') >= 0:
113            body = json.dumps(body) if body else None
114        elif content_type.lower().find('application/x-www-form-urlencoded') >= 0:
115            body = urlencode(body) if body else None
116
117        return requests.Request(method, url, headers=headers, data=body)

Create an HTTP request object.

Args: method (str): The HTTP method (e.g., GET, POST). url (str): The URL for the request. query_params (dict, optional): Dictionary containing query parameters. body (dict, optional): Request body data. headers (dict, optional): Request headers.

Returns: requests.Request: The HTTP request object.