1010from werkzeug .datastructures import ImmutableMultiDict
1111
1212
13- def binary_loads (value : Union [str , bytes ], ** parameters : str ) -> bytes :
14- charset = "utf-8"
15- if "charset" in parameters :
16- charset = parameters ["charset" ]
17- if isinstance (value , str ):
18- return value .encode (charset )
13+ def binary_loads (value : bytes , ** parameters : str ) -> bytes :
1914 return value
2015
2116
22- def plain_loads (value : Union [ str , bytes ] , ** parameters : str ) -> str :
17+ def plain_loads (value : bytes , ** parameters : str ) -> str :
2318 charset = "utf-8"
2419 if "charset" in parameters :
2520 charset = parameters ["charset" ]
@@ -32,30 +27,36 @@ def plain_loads(value: Union[str, bytes], **parameters: str) -> str:
3227 return value
3328
3429
35- def json_loads (value : Union [ str , bytes ] , ** parameters : str ) -> Any :
30+ def json_loads (value : bytes , ** parameters : str ) -> Any :
3631 return loads (value )
3732
3833
39- def xml_loads (value : Union [str , bytes ], ** parameters : str ) -> Element :
40- return fromstring (value )
34+ def xml_loads (value : bytes , ** parameters : str ) -> Element :
35+ charset = "utf-8"
36+ if "charset" in parameters :
37+ charset = parameters ["charset" ]
38+ return fromstring (value .decode (charset ))
4139
4240
43- def urlencoded_form_loads (value : Any , ** parameters : str ) -> Mapping [str , Any ]:
44- return ImmutableMultiDict (parse_qsl (value ))
41+ def urlencoded_form_loads (
42+ value : bytes , ** parameters : str
43+ ) -> Mapping [str , Any ]:
44+ # only UTF-8 is conforming
45+ return ImmutableMultiDict (parse_qsl (value .decode ("utf-8" )))
4546
4647
47- def data_form_loads (
48- value : Union [ str , bytes ], ** parameters : str
49- ) -> Mapping [ str , Any ] :
50- if isinstance ( value , bytes ):
51- value = value .decode ("ASCII" , errors = "surrogateescape" )
48+ def data_form_loads (value : bytes , ** parameters : str ) -> Mapping [ str , Any ]:
49+ charset = "ASCII"
50+ if "charset" in parameters :
51+ charset = parameters [ "charset" ]
52+ decoded = value .decode (charset , errors = "surrogateescape" )
5253 boundary = ""
5354 if "boundary" in parameters :
5455 boundary = parameters ["boundary" ]
5556 parser = Parser ()
5657 mimetype = "multipart/form-data"
5758 header = f'Content-Type: { mimetype } ; boundary="{ boundary } "'
58- text = "\n \n " .join ([header , value ])
59+ text = "\n \n " .join ([header , decoded ])
5960 parts = parser .parsestr (text , headersonly = False )
6061 return ImmutableMultiDict (
6162 [
0 commit comments