11"""OpenAPI core contrib requests requests module"""
2+ from typing import Mapping
23from typing import Optional
34from typing import Union
45from urllib .parse import parse_qs
78from requests import PreparedRequest
89from requests import Request
910from requests .cookies import RequestsCookieJar
11+ from requests .utils import rewind_body
1012from werkzeug .datastructures import Headers
1113from werkzeug .datastructures import ImmutableMultiDict
1214
@@ -28,7 +30,9 @@ def __init__(self, request: Union[Request, PreparedRequest]):
2830 "'request' argument is not type of "
2931 f"{ Request } or { PreparedRequest } "
3032 )
33+ self ._request = None
3134 if isinstance (request , Request ):
35+ self ._request = request
3236 request = request .prepare ()
3337
3438 self .request = request
@@ -65,13 +69,28 @@ def method(self) -> str:
6569
6670 @property
6771 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 :
6975 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 )
7392 # TODO: figure out if request._body_position is relevant
74- return self . request . body
93+ return body
7594
7695 @property
7796 def mimetype (self ) -> str :
0 commit comments