16
16
17
17
from __future__ import unicode_literals
18
18
19
- from abc import ABCMeta , abstractmethod
19
+ from abc import ABCMeta , abstractmethod , abstractproperty
20
20
21
21
import requests
22
22
from future .utils import with_metaclass
@@ -38,36 +38,20 @@ def __init__(self, timeout=DEFAULT_TIMEOUT):
38
38
self .timeout = timeout
39
39
40
40
@abstractmethod
41
- def get (self , url , headers = None , params = None , timeout = None ):
41
+ def get (self , url , headers = None , params = None , stream = False , timeout = None ):
42
42
"""GET request.
43
43
44
44
:param str url: Request url
45
45
:param dict headers: (optional) Request headers
46
46
:param dict params: (optional) Request query parameter
47
+ :param bool stream: (optional) get content as stream
47
48
:param float|tuple(float, float) timeout: (optional), How long to wait for the server
48
49
to send data before giving up, as a float,
49
50
or a (connect timeout, readtimeout) float tuple.
50
51
Default is DEFAULT_TIMEOUT
51
52
"""
52
53
raise NotImplementedError
53
54
54
- @abstractmethod
55
- def get_stream (self , url , headers = None , params = None , timeout = None ,
56
- chunk_size = 1024 , decode_unicode = False ):
57
- """GET request. Response is chunk content.
58
-
59
- :param str url: Request url
60
- :param dict headers: (optional) Request headers
61
- :param dict params: (optional) Request query parameter
62
- :param float|tuple(float, float) timeout: (optional), How long to wait for the server
63
- to send data before giving up, as a float,
64
- or a (connect timeout, readtimeout) float tuple.
65
- Default is DEFAULT_TIMEOUT
66
- :param int chunk_size: (optional) Chunk size
67
- :param boole decode_unicode: (optional) Decode unicode
68
- """
69
- raise NotImplementedError
70
-
71
55
@abstractmethod
72
56
def post (self , url , headers = None , data = None , timeout = None ):
73
57
"""POST request.
@@ -96,12 +80,13 @@ def __init__(self, timeout=HttpClient.DEFAULT_TIMEOUT):
96
80
"""
97
81
super (RequestsHttpClient , self ).__init__ (timeout )
98
82
99
- def get (self , url , headers = None , params = None , timeout = None ):
83
+ def get (self , url , headers = None , params = None , stream = False , timeout = None ):
100
84
"""GET request.
101
85
102
86
:param str url: Request url
103
87
:param dict headers: (optional) Request headers
104
88
:param dict params: (optional) Request query parameter
89
+ :param bool stream: (optional) get content as stream
105
90
:param float|tuple(float, float) timeout: (optional), How long to wait for the server
106
91
to send data before giving up, as a float,
107
92
or a (connect timeout, readtimeout) float tuple.
@@ -113,48 +98,10 @@ def get(self, url, headers=None, params=None, timeout=None):
113
98
timeout = self .timeout
114
99
115
100
response = requests .get (
116
- url , headers = headers , params = params , timeout = timeout
117
- )
118
-
119
- return HttpResponse (
120
- status_code = response .status_code , headers = response .headers ,
121
- body = response .text )
122
-
123
- def get_stream (self , url , headers = None , params = None , timeout = None ,
124
- chunk_size = 1024 , decode_unicode = False ):
125
- """GET request. Response is chunk content.
126
-
127
- :param str url: Request url
128
- :param dict headers: (optional) Request headers
129
- :param dict params: (optional) Request query parameter
130
- :param float|tuple(float, float) timeout: (optional), How long to wait for the server
131
- to send data before giving up, as a float,
132
- or a (connect timeout, readtimeout) float tuple.
133
- Default is DEFAULT_TIMEOUT
134
- :param int chunk_size: (optional) Chunk size
135
- :param boole decode_unicode: (optional) Decode unicode
136
- :rtype: HttpResponse
137
- :return:
138
- """
139
- if timeout is None :
140
- timeout = self .timeout
141
-
142
- response = requests .get (
143
- url , headers = headers , params = params , timeout = timeout ,
144
- stream = True
101
+ url , headers = headers , params = params , stream = stream , timeout = timeout
145
102
)
146
103
147
- if 200 <= response .status_code < 300 :
148
- return HttpResponse (
149
- status_code = response .status_code , headers = response .headers ,
150
- body_stream = response .iter_content (
151
- chunk_size = chunk_size , decode_unicode = decode_unicode
152
- )
153
- )
154
- else :
155
- return HttpResponse (
156
- status_code = response .status_code , headers = response .headers ,
157
- body = response .text )
104
+ return RequestsHttpResponse (response )
158
105
159
106
def post (self , url , headers = None , data = None , timeout = None ):
160
107
"""POST request.
@@ -176,23 +123,82 @@ def post(self, url, headers=None, data=None, timeout=None):
176
123
url , headers = headers , data = data , timeout = timeout
177
124
)
178
125
179
- return HttpResponse (
180
- status_code = response .status_code , headers = response .headers ,
181
- body = response .text )
126
+ return RequestsHttpResponse (response )
127
+
128
+
129
+ class HttpResponse (with_metaclass (ABCMeta )):
130
+ """HttpResponse."""
182
131
132
+ @abstractproperty
133
+ def status_code (self ):
134
+ """Get status code."""
135
+ raise NotImplementedError
183
136
184
- class HttpResponse (object ):
185
- """HttpResponse container."""
137
+ @abstractproperty
138
+ def headers (self ):
139
+ """Get headers."""
140
+ raise NotImplementedError
186
141
187
- def __init__ (self , status_code = None , body = None , headers = None , body_stream = None ):
142
+ @abstractproperty
143
+ def text (self ):
144
+ """Get request body as text-decoded."""
145
+ raise NotImplementedError
146
+
147
+ @abstractproperty
148
+ def content (self ):
149
+ """Get request body as binary."""
150
+ raise NotImplementedError
151
+
152
+ @abstractproperty
153
+ def json (self ):
154
+ """Get request body as json-decoded."""
155
+ raise NotImplementedError
156
+
157
+ @abstractmethod
158
+ def iter_content (self , chunk_size = 1024 , decode_unicode = False ):
159
+ """Get request body as iterator content (stream)."""
160
+ raise NotImplementedError
161
+
162
+
163
+ class RequestsHttpResponse (HttpResponse ):
164
+ """HttpResponse implemented by requests lib's response."""
165
+
166
+ def __init__ (self , response ):
188
167
"""__init__ method.
189
168
190
- :param str status_code: Status code
191
- :param str body: Response body as text
192
- :param dict headers: Response headers
193
- :param iterator body_stream:
169
+ :param response: requests lib's response
170
+ """
171
+ self .response = response
172
+
173
+ @property
174
+ def status_code (self ):
175
+ """Get status code."""
176
+ return self .response .status_code
177
+
178
+ @property
179
+ def headers (self ):
180
+ """Get headers."""
181
+ return self .response .headers
182
+
183
+ @property
184
+ def text (self ):
185
+ """Get request body as text-decoded."""
186
+ return self .response .text
187
+
188
+ @property
189
+ def content (self ):
190
+ """Get request body as binary."""
191
+ return self .response .content
192
+
193
+ @property
194
+ def json (self ):
195
+ """Get request body as json-decoded."""
196
+ return self .response .json ()
197
+
198
+ def iter_content (self , chunk_size = 1024 , decode_unicode = False ):
199
+ """Get request body as iterator content (stream).
200
+
201
+ :param chunk_size:
202
+ :param decode_unicode:
194
203
"""
195
- self .status_code = status_code
196
- self .headers = headers
197
- self .body = body
198
- self .body_stream = body_stream
204
+ return self .response .iter_content (chunk_size = chunk_size , decode_unicode = decode_unicode )
0 commit comments