1
1
import asyncio
2
2
import json as _json
3
- from .aiohttpclient_ws import (
3
+ from .aiohttp_ws import (
4
4
_WSRequestContextManager ,
5
5
ClientWebSocketResponse ,
6
6
WebSocketClient ,
@@ -12,7 +12,7 @@ def __init__(self, reader):
12
12
self .content = reader
13
13
14
14
def read (self , sz = - 1 ):
15
- return ( yield from self .content .read (sz ) )
15
+ return self .content .read (sz )
16
16
17
17
def text (self , sz = - 1 ):
18
18
return self .read (sz = sz )
@@ -29,22 +29,20 @@ def __init__(self, reader):
29
29
self .content = reader
30
30
self .chunk_size = 0
31
31
32
- def read (self , sz = 4 * 1024 * 1024 ):
32
+ async def read (self , sz = 4 * 1024 * 1024 ):
33
33
if self .chunk_size == 0 :
34
- l = yield from self .content .readline ()
35
- # print("chunk line:", l)
34
+ l = await self .content .readline ()
36
35
l = l .split (b";" , 1 )[0 ]
37
36
self .chunk_size = int (l , 16 )
38
- # print("chunk size:", self.chunk_size)
39
37
if self .chunk_size == 0 :
40
38
# End of message
41
- sep = yield from self .content .read (2 )
39
+ sep = await self .content .read (2 )
42
40
assert sep == b"\r \n "
43
41
return b""
44
- data = yield from self .content .read (min (sz , self .chunk_size ))
42
+ data = await self .content .read (min (sz , self .chunk_size ))
45
43
self .chunk_size -= len (data )
46
44
if self .chunk_size == 0 :
47
- sep = yield from self .content .read (2 )
45
+ sep = await self .content .read (2 )
48
46
assert sep == b"\r \n "
49
47
return data
50
48
@@ -115,6 +113,13 @@ async def _request(self, method, url, data=None, json=None, ssl=None):
115
113
resp = ClientResponse (reader )
116
114
resp .status = status
117
115
resp .headers = headers
116
+ try :
117
+ resp .headers = {
118
+ val .split (":" , 1 )[0 ]: val .split (":" , 1 )[- 1 ].strip ()
119
+ for val in [hed .decode ().strip () for hed in headers ]
120
+ }
121
+ except Exception :
122
+ pass
118
123
self ._reader = reader
119
124
return resp
120
125
@@ -174,9 +179,7 @@ async def request_raw(self, method, url, data=None, json=None, ssl=None):
174
179
return reader
175
180
176
181
def get (self , url , ssl = None ):
177
- return _RequestContextManager (
178
- self , self ._request ("GET" , self ._base_url + url , ssl = ssl )
179
- )
182
+ return _RequestContextManager (self , self ._request ("GET" , self ._base_url + url , ssl = ssl ))
180
183
181
184
def post (self , url , data = None , json = None , ssl = None ):
182
185
return _RequestContextManager (
@@ -222,76 +225,3 @@ async def _ws_connect(self, url, ssl=None):
222
225
await ws_client .connect (url , ssl = ssl )
223
226
self ._reader = ws_client .reader
224
227
return ClientWebSocketResponse (ws_client )
225
-
226
-
227
- def request_raw (method , url ):
228
- try :
229
- proto , dummy , host , path = url .split ("/" , 3 )
230
- except ValueError :
231
- proto , dummy , host = url .split ("/" , 2 )
232
- path = ""
233
-
234
- if proto == "http:" :
235
- port = 80
236
- elif proto == "https:" :
237
- port = 443
238
- else :
239
- raise ValueError ("Unsupported protocol: " + proto )
240
-
241
- if ":" in host :
242
- host , port = host .split (":" , 1 )
243
- port = int (port )
244
-
245
- reader , writer = yield from asyncio .open_connection (
246
- host , port , ssl = proto == "https:"
247
- )
248
- # Use protocol 1.0, because 1.1 always allows to use chunked transfer-encoding
249
- # But explicitly set Connection: close, even though this should be default for 1.0,
250
- # because some servers misbehave w/o it.
251
- query = (
252
- "%s /%s HTTP/1.0\r \n Host: %s\r \n Connection: close\r \n User-Agent: compat\r \n \r \n "
253
- % (
254
- method ,
255
- path ,
256
- host ,
257
- )
258
- )
259
- yield from writer .awrite (query .encode ("latin-1" ))
260
- # yield from writer.aclose()
261
- return reader
262
-
263
-
264
- def request (method , url ):
265
- redir_cnt = 0
266
- redir_url = None
267
- while redir_cnt < 2 :
268
- reader = yield from request_raw (method , url )
269
- headers = []
270
- sline = yield from reader .readline ()
271
- sline = sline .split (None , 2 )
272
- status = int (sline [1 ])
273
- chunked = False
274
- while True :
275
- line = yield from reader .readline ()
276
- if not line or line == b"\r \n " :
277
- break
278
- headers .append (line )
279
- if line .startswith (b"Transfer-Encoding:" ):
280
- if b"chunked" in line :
281
- chunked = True
282
- elif line .startswith (b"Location:" ):
283
- url = line .rstrip ().split (None , 1 )[1 ].decode ("latin-1" )
284
-
285
- if 301 <= status <= 303 :
286
- redir_cnt += 1
287
- yield from reader .aclose ()
288
- continue
289
- break
290
-
291
- if chunked :
292
- resp = ChunkedClientResponse (reader )
293
- else :
294
- resp = ClientResponse (reader )
295
- resp .status = status
296
- resp .headers = headers
297
- return resp
0 commit comments