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.