ringcentral.http.api_response
1# !/usr/bin/env python 2# encoding: utf-8 3import json 4import requests 5from email.feedparser import FeedParser 6from .json_object import * 7from ..core import is_third 8 9 10class ApiResponse: 11 def __init__(self, request=None, response=None): 12 self._request = request 13 self._response = response 14 15 def ok(self): 16 return self._response.ok 17 18 def raw(self): 19 return self._response.raw 20 21 def body(self): 22 return self._response.content 23 24 def text(self): 25 return self._response.text 26 27 def json_dict(self): 28 if not self._is_content_type('application/json'): 29 raise Exception('Response is not JSON') 30 31 return self._response.json() 32 33 def json(self): 34 return unfold(self._response.json()) 35 36 def multipart(self): 37 if not self._is_content_type('multipart/mixed'): 38 raise Exception('Response is not Batch (Multipart)') 39 40 parts = self._break_into_parts() 41 42 if len(parts) < 1: 43 raise Exception("Malformed Batch Response (not enough parts)") # sic! not specific extension 44 45 statuses = json.loads(parts[0].get_payload()) 46 47 if len(statuses["response"]) != len(parts) - 1: 48 raise Exception("Malformed Batch Response (not-consistent number of parts)") 49 50 responses = [] 51 52 for response, payload in zip(statuses["response"], parts[1:]): 53 res = create_response(payload, response['status']) 54 55 responses.append(ApiResponse(response=res)) 56 57 return responses 58 59 def error(self): 60 61 if self._response is None or self.ok(): 62 return None 63 64 message = 'HTTP' + str(self._response.status_code) # TODO Status text 65 66 try: 67 data = self.json_dict() 68 69 if 'message' in data: 70 message = data['message'] 71 elif 'error_description' in data: 72 message = data['error_description'] 73 elif 'description' in data: 74 message = data['description'] 75 76 except Exception as e: 77 message = message + ' (and additional error happened during JSON parse: ' + e.message + ')' 78 79 return message 80 81 def request(self): 82 return self._request 83 84 def response(self): 85 return self._response 86 87 def _is_content_type(self, content_type): 88 return self._get_content_type().lower().find(content_type) >= 0 89 90 def _get_content_type(self): 91 return self._response.headers.get('Content-Type') or '' 92 93 def _break_into_parts(self): 94 p = FeedParser() 95 96 for h in self._response.headers: 97 p.feed(h + ':' + self._response.headers[h] + "\r\n") 98 99 p.feed("\r\n") 100 p.feed(self.text()) 101 102 msg = p.close() 103 104 parts = msg.get_payload() 105 106 return parts 107 108 109def create_response(payload, status): 110 res = requests.Response() 111 res.headers = dict(payload) 112 if is_third(): 113 res._content = bytes(payload.get_payload(), 'utf8') 114 res.encoding = 'utf8' 115 else: 116 res._content = str(payload.get_payload()) 117 res.status_code = status 118 return res
class
ApiResponse:
11class ApiResponse: 12 def __init__(self, request=None, response=None): 13 self._request = request 14 self._response = response 15 16 def ok(self): 17 return self._response.ok 18 19 def raw(self): 20 return self._response.raw 21 22 def body(self): 23 return self._response.content 24 25 def text(self): 26 return self._response.text 27 28 def json_dict(self): 29 if not self._is_content_type('application/json'): 30 raise Exception('Response is not JSON') 31 32 return self._response.json() 33 34 def json(self): 35 return unfold(self._response.json()) 36 37 def multipart(self): 38 if not self._is_content_type('multipart/mixed'): 39 raise Exception('Response is not Batch (Multipart)') 40 41 parts = self._break_into_parts() 42 43 if len(parts) < 1: 44 raise Exception("Malformed Batch Response (not enough parts)") # sic! not specific extension 45 46 statuses = json.loads(parts[0].get_payload()) 47 48 if len(statuses["response"]) != len(parts) - 1: 49 raise Exception("Malformed Batch Response (not-consistent number of parts)") 50 51 responses = [] 52 53 for response, payload in zip(statuses["response"], parts[1:]): 54 res = create_response(payload, response['status']) 55 56 responses.append(ApiResponse(response=res)) 57 58 return responses 59 60 def error(self): 61 62 if self._response is None or self.ok(): 63 return None 64 65 message = 'HTTP' + str(self._response.status_code) # TODO Status text 66 67 try: 68 data = self.json_dict() 69 70 if 'message' in data: 71 message = data['message'] 72 elif 'error_description' in data: 73 message = data['error_description'] 74 elif 'description' in data: 75 message = data['description'] 76 77 except Exception as e: 78 message = message + ' (and additional error happened during JSON parse: ' + e.message + ')' 79 80 return message 81 82 def request(self): 83 return self._request 84 85 def response(self): 86 return self._response 87 88 def _is_content_type(self, content_type): 89 return self._get_content_type().lower().find(content_type) >= 0 90 91 def _get_content_type(self): 92 return self._response.headers.get('Content-Type') or '' 93 94 def _break_into_parts(self): 95 p = FeedParser() 96 97 for h in self._response.headers: 98 p.feed(h + ':' + self._response.headers[h] + "\r\n") 99 100 p.feed("\r\n") 101 p.feed(self.text()) 102 103 msg = p.close() 104 105 parts = msg.get_payload() 106 107 return parts
def
multipart(self):
37 def multipart(self): 38 if not self._is_content_type('multipart/mixed'): 39 raise Exception('Response is not Batch (Multipart)') 40 41 parts = self._break_into_parts() 42 43 if len(parts) < 1: 44 raise Exception("Malformed Batch Response (not enough parts)") # sic! not specific extension 45 46 statuses = json.loads(parts[0].get_payload()) 47 48 if len(statuses["response"]) != len(parts) - 1: 49 raise Exception("Malformed Batch Response (not-consistent number of parts)") 50 51 responses = [] 52 53 for response, payload in zip(statuses["response"], parts[1:]): 54 res = create_response(payload, response['status']) 55 56 responses.append(ApiResponse(response=res)) 57 58 return responses
def
error(self):
60 def error(self): 61 62 if self._response is None or self.ok(): 63 return None 64 65 message = 'HTTP' + str(self._response.status_code) # TODO Status text 66 67 try: 68 data = self.json_dict() 69 70 if 'message' in data: 71 message = data['message'] 72 elif 'error_description' in data: 73 message = data['error_description'] 74 elif 'description' in data: 75 message = data['description'] 76 77 except Exception as e: 78 message = message + ' (and additional error happened during JSON parse: ' + e.message + ')' 79 80 return message
def
create_response(payload, status):
110def create_response(payload, status): 111 res = requests.Response() 112 res.headers = dict(payload) 113 if is_third(): 114 res._content = bytes(payload.get_payload(), 'utf8') 115 res.encoding = 'utf8' 116 else: 117 res._content = str(payload.get_payload()) 118 res.status_code = status 119 return res