@@ -35,45 +35,51 @@ impl<'py> IntoPyObject<'py> for Request {
3535 type Output = Bound < ' py , Self :: Target > ;
3636 type Error = PyErr ;
3737 fn into_pyobject ( self , py : Python < ' py > ) -> Result < Self :: Output , Self :: Error > {
38- let query_params = self . query_params . clone ( ) ;
39- let headers: Py < Headers > = self . headers . clone ( ) . into_pyobject ( py) ?. extract ( ) ?;
40- let path_params = self . path_params . clone ( ) . into_pyobject ( py) ?. extract ( ) ?;
41- let body = match String :: from_utf8 ( self . body . clone ( ) ) {
42- Ok ( s) => s. into_pyobject ( py) ?. into_any ( ) ,
43- Err ( _) => self . body . clone ( ) . into_pyobject ( py) ?. into_any ( ) ,
38+ let headers: Py < Headers > = self . headers . into_pyobject ( py) ?. extract ( ) ?;
39+ let path_params = self . path_params . into_pyobject ( py) ?. extract ( ) ?;
40+
41+ let body = if self . body . is_empty ( ) {
42+ PyString :: new ( py, "" ) . into_any ( )
43+ } else {
44+ match String :: from_utf8 ( self . body . clone ( ) ) {
45+ Ok ( s) => s. into_pyobject ( py) ?. into_any ( ) ,
46+ Err ( _) => self . body . into_pyobject ( py) ?. into_any ( ) ,
47+ }
4448 } ;
45- let form_data: Py < PyDict > = match & self . form_data {
46- Some ( data) => {
49+
50+ let form_data: Py < PyDict > = match self . form_data {
51+ Some ( data) if !data. is_empty ( ) => {
4752 let dict = PyDict :: new ( py) ;
48- for ( key, value) in data. iter ( ) {
49- dict. set_item ( key, value) . unwrap ( ) ;
53+ // Use with_capacity equivalent by setting items directly
54+ for ( key, value) in data {
55+ dict. set_item ( key, value) ?;
5056 }
5157 dict. into ( )
5258 }
53- None => PyDict :: new ( py) . into ( ) ,
59+ _ => PyDict :: new ( py) . into ( ) ,
5460 } ;
5561
56- let files: Py < PyDict > = match & self . files {
57- Some ( data) => {
62+ let files: Py < PyDict > = match self . files {
63+ Some ( data) if !data . is_empty ( ) => {
5864 let dict = PyDict :: new ( py) ;
59- for ( key, value) in data. iter ( ) {
60- let bytes = PyBytes :: new ( py, value) ;
61- dict. set_item ( key, bytes) . unwrap ( ) ;
65+ for ( key, value) in data {
66+ let bytes = PyBytes :: new ( py, & value) ;
67+ dict. set_item ( key, bytes) ? ;
6268 }
6369 dict. into ( )
6470 }
65- None => PyDict :: new ( py) . into ( ) ,
71+ _ => PyDict :: new ( py) . into ( ) ,
6672 } ;
6773
6874 let request = PyRequest {
69- query_params,
75+ query_params : self . query_params ,
7076 path_params,
7177 headers,
7278 body : body. into ( ) ,
73- method : self . method . clone ( ) ,
74- url : self . url . clone ( ) ,
75- ip_addr : self . ip_addr . clone ( ) ,
76- identity : self . identity . clone ( ) ,
79+ method : self . method ,
80+ url : self . url ,
81+ ip_addr : self . ip_addr ,
82+ identity : self . identity ,
7783 form_data,
7884 files,
7985 } ;
0 commit comments