@@ -1029,3 +1029,64 @@ mod tests {
10291029 assert_eq ! ( out. get_pixel( 3 , 3 ) , & image:: Rgba ( [ 5 , 5 , 0 , 255 ] ) ) ;
10301030 }
10311031}
1032+
1033+ // ---- HTTP request proxy (used by the API Client tool) ----
1034+
1035+ #[ derive( serde:: Serialize ) ]
1036+ pub struct HttpResponse {
1037+ pub status : u16 ,
1038+ pub status_text : String ,
1039+ pub headers : std:: collections:: HashMap < String , String > ,
1040+ pub body : String ,
1041+ pub duration_ms : u64 ,
1042+ }
1043+
1044+ #[ tauri:: command]
1045+ pub async fn http_request (
1046+ method : String ,
1047+ url : String ,
1048+ headers : std:: collections:: HashMap < String , String > ,
1049+ body : Option < String > ,
1050+ ) -> Result < HttpResponse , String > {
1051+ let start = std:: time:: Instant :: now ( ) ;
1052+ let client = reqwest:: Client :: builder ( )
1053+ . danger_accept_invalid_certs ( false )
1054+ . redirect ( reqwest:: redirect:: Policy :: limited ( 10 ) )
1055+ . build ( )
1056+ . map_err ( |e| e. to_string ( ) ) ?;
1057+
1058+ let method_parsed = reqwest:: Method :: from_bytes ( method. to_uppercase ( ) . as_bytes ( ) )
1059+ . map_err ( |e| e. to_string ( ) ) ?;
1060+
1061+ let mut builder = client. request ( method_parsed, & url) ;
1062+ for ( k, v) in & headers {
1063+ if let ( Ok ( name) , Ok ( val) ) = (
1064+ reqwest:: header:: HeaderName :: from_bytes ( k. as_bytes ( ) ) ,
1065+ reqwest:: header:: HeaderValue :: from_str ( v) ,
1066+ ) {
1067+ builder = builder. header ( name, val) ;
1068+ }
1069+ }
1070+ if let Some ( b) = body {
1071+ builder = builder. body ( b) ;
1072+ }
1073+
1074+ let res = builder. send ( ) . await . map_err ( |e| e. to_string ( ) ) ?;
1075+ let duration_ms = start. elapsed ( ) . as_millis ( ) as u64 ;
1076+ let status = res. status ( ) . as_u16 ( ) ;
1077+ let status_text = res. status ( ) . canonical_reason ( ) . unwrap_or ( "" ) . to_string ( ) ;
1078+ let mut resp_headers = std:: collections:: HashMap :: new ( ) ;
1079+ for ( k, v) in res. headers ( ) {
1080+ if let Ok ( val) = v. to_str ( ) {
1081+ resp_headers. insert ( k. as_str ( ) . to_string ( ) , val. to_string ( ) ) ;
1082+ }
1083+ }
1084+ let body_str = res. text ( ) . await . map_err ( |e| e. to_string ( ) ) ?;
1085+ Ok ( HttpResponse {
1086+ status,
1087+ status_text,
1088+ headers : resp_headers,
1089+ body : body_str,
1090+ duration_ms,
1091+ } )
1092+ }
0 commit comments