1
1
"""OpenAPI core contrib requests requests module"""
2
+ from typing import Mapping
2
3
from typing import Optional
3
4
from typing import Union
4
5
from urllib .parse import parse_qs
7
8
from requests import PreparedRequest
8
9
from requests import Request
9
10
from requests .cookies import RequestsCookieJar
11
+ from requests .utils import rewind_body
10
12
from werkzeug .datastructures import Headers
11
13
from werkzeug .datastructures import ImmutableMultiDict
12
14
@@ -28,7 +30,9 @@ def __init__(self, request: Union[Request, PreparedRequest]):
28
30
"'request' argument is not type of "
29
31
f"{ Request } or { PreparedRequest } "
30
32
)
33
+ self ._request = None
31
34
if isinstance (request , Request ):
35
+ self ._request = request
32
36
request = request .prepare ()
33
37
34
38
self .request = request
@@ -65,13 +69,28 @@ def method(self) -> str:
65
69
66
70
@property
67
71
def body (self ) -> Optional [str ]:
68
- if self .request .body is None :
72
+ import ipdb ; ipdb .set_trace ()
73
+ body = self .request .body
74
+ if body is None :
69
75
return None
70
- if isinstance (self .request .body , bytes ):
71
- return self .request .body .decode ("utf-8" )
72
- assert isinstance (self .request .body , str )
76
+ chunks = None
77
+ is_stream = all (
78
+ [
79
+ hasattr (body , "__iter__" ),
80
+ not isinstance (body , (bytes , str , list , tuple , Mapping )),
81
+ ]
82
+ )
83
+ if is_stream :
84
+ chunks = list (body )
85
+ body = b"" .join (chunks )
86
+ if isinstance (body , bytes ):
87
+ body = body .decode ("utf-8" )
88
+ assert isinstance (body , str )
89
+ # recreate request stream from evaluated chunks
90
+ if chunks is not None :
91
+ self .request .body = (x for x in chunks )
73
92
# TODO: figure out if request._body_position is relevant
74
- return self . request . body
93
+ return body
75
94
76
95
@property
77
96
def mimetype (self ) -> str :
0 commit comments