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
ApiResponse(request=None, response=None)
12    def __init__(self, request=None, response=None):
13        self._request = request
14        self._response = response
def ok(self):
16    def ok(self):
17        return self._response.ok
def raw(self):
19    def raw(self):
20        return self._response.raw
def body(self):
22    def body(self):
23        return self._response.content
def text(self):
25    def text(self):
26        return self._response.text
def json_dict(self):
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()
def json(self):
34    def json(self):
35        return unfold(self._response.json())
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 request(self):
82    def request(self):
83        return self._request
def response(self):
85    def response(self):
86        return self._response
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