diff --git a/Cargo.lock b/Cargo.lock index 7d5e93419..b1b4788f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3019,7 +3019,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.26.0", - "tokio-socks", + "tokio-socks 0.5.1-2", "tokio-util", "toml 0.7.8", "url", @@ -5347,6 +5347,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", + "tokio-socks 0.5.1", "tokio-util", "tower-service", "url", @@ -6606,6 +6607,18 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "tokio-socks" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" +dependencies = [ + "either", + "futures-util", + "thiserror", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.10" diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index b166817c5..9849e39bf 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -10,8 +10,8 @@ import 'package:flutter_hbb/models/peer_model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:get/get.dart'; import 'package:bot_toast/bot_toast.dart'; -import 'package:http/http.dart' as http; +import '../utils/http_service.dart' as http; import '../common.dart'; final syncAbOption = 'sync-ab-with-recent-sessions'; diff --git a/flutter/lib/models/group_model.dart b/flutter/lib/models/group_model.dart index b8bc2722d..c2a50afb3 100644 --- a/flutter/lib/models/group_model.dart +++ b/flutter/lib/models/group_model.dart @@ -7,7 +7,7 @@ import 'package:flutter_hbb/models/peer_model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:get/get.dart'; import 'dart:convert'; -import 'package:http/http.dart' as http; +import '../utils/http_service.dart' as http; class GroupModel { final RxBool groupLoading = false.obs; diff --git a/flutter/lib/models/user_model.dart b/flutter/lib/models/user_model.dart index 12b905ee6..d15764b76 100644 --- a/flutter/lib/models/user_model.dart +++ b/flutter/lib/models/user_model.dart @@ -6,10 +6,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_hbb/common/hbbs/hbbs.dart'; import 'package:flutter_hbb/models/ab_model.dart'; import 'package:get/get.dart'; -import 'package:http/http.dart' as http; import '../common.dart'; -import '../utils/http_service.dart' as httpR; +import '../utils/http_service.dart' as http; import 'model.dart'; import 'platform_model.dart'; @@ -18,6 +17,7 @@ bool refreshingUser = false; class UserModel { final RxString userName = ''.obs; final RxBool isAdmin = false.obs; + bool get isLogin => userName.isNotEmpty; WeakReference parent; @@ -136,7 +136,8 @@ class UserModel { /// throw [RequestException] Future login(LoginRequest loginRequest) async { final url = await bind.mainGetApiServer(); - final resp = await httpR.post('$url/api/login', body: jsonEncode(loginRequest.toJson())); + final resp = await http.post(Uri.parse('$url/api/login'), + body: jsonEncode(loginRequest.toJson())); final Map body; try { diff --git a/flutter/lib/utils/http_service.dart b/flutter/lib/utils/http_service.dart index cd5080c0c..09b4dc7c5 100644 --- a/flutter/lib/utils/http_service.dart +++ b/flutter/lib/utils/http_service.dart @@ -1,13 +1,13 @@ import 'dart:convert'; import 'package:http/http.dart' as http; - import '../models/platform_model.dart'; +export 'package:http/http.dart' show Response; enum HttpMethod { get, post, put, delete } class HttpService { Future sendRequest( - String url, + Uri url, HttpMethod method, { Map? headers, dynamic body, @@ -23,12 +23,8 @@ class HttpService { return await _pollFultterHttp(url, method, headers: headers, body: body); } - if (body is! String) { - throw Exception('Unsupported HTTP body type'); - } - await bind.mainHttpRequest( - url: url, + url: url.toString(), method: methodName.toLowerCase(), body: body, header: headersJson); @@ -38,26 +34,25 @@ class HttpService { } Future _pollFultterHttp( - String url, + Uri url, HttpMethod method, { Map? headers, dynamic body, }) async { var response = http.Response('', 400); // 默认响应 - Uri uri = Uri.parse(url); switch (method) { case HttpMethod.get: - response = await http.get(uri, headers: headers); + response = await http.get(url, headers: headers); break; case HttpMethod.post: - response = await http.post(uri, headers: headers, body: body); + response = await http.post(url, headers: headers, body: body); break; case HttpMethod.put: - response = await http.put(uri, headers: headers, body: body); + response = await http.put(url, headers: headers, body: body); break; case HttpMethod.delete: - response = await http.delete(uri, headers: headers, body: body); + response = await http.delete(url, headers: headers, body: body); break; default: throw Exception('Unsupported HTTP method'); @@ -91,23 +86,23 @@ class HttpService { } } -Future get(String url, {Map? headers}) async { +Future get(Uri url, {Map? headers}) async { return await HttpService().sendRequest(url, HttpMethod.get, headers: headers); } -Future post(String url, +Future post(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.post, body: body, headers: headers); } -Future put(String url, +Future put(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.put, body: body, headers: headers); } -Future delete(String url, +Future delete(Uri url, {Map? headers, Object? body, Encoding? encoding}) async { return await HttpService() .sendRequest(url, HttpMethod.delete, body: body, headers: headers); diff --git a/src/common.rs b/src/common.rs index b565dd5cb..4edbcfe3e 100644 --- a/src/common.rs +++ b/src/common.rs @@ -145,6 +145,7 @@ use hbb_common::{ }; // #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] use hbb_common::{config::RENDEZVOUS_PORT, futures::future::join_all}; +use hbb_common::log::debug; use crate::hbbs_http::create_http_client_async; use crate::ui_interface::{get_option, set_option}; @@ -1090,10 +1091,11 @@ pub async fn post_request_sync(url: String, body: String, header: &str) -> Resul pub async fn http_request_sync( url: String, method: String, - body: String, + body: Option, header: String, ) -> ResultType { let http_client = create_http_client_async(); + debug!("url: {}, method: {}, body: {:?}, header: {}", url, method, body,header); let mut http_client = match method.as_str() { "get" => http_client.get(url), "post" => http_client.post(url), @@ -1106,14 +1108,16 @@ pub async fn http_request_sync( if let Value::Object(obj) = v { for (key, value) in obj.iter() { http_client = http_client.header(key, value.as_str().unwrap_or_default()); - println!("Key: {}, Value: {}", key, value); } } else { return Err(anyhow!("HTTP header information parsing failed!")); } + if let Some(b) = body { + http_client = http_client.body(b); + } + let response = http_client - .body(body) .timeout(std::time::Duration::from_secs(12)) .send() .await?; @@ -1142,6 +1146,7 @@ pub async fn http_request_sync( // Convert map to JSON string serde_json::to_string(&result).map_err(|e| anyhow!("Failed to serialize response: {}", e)) } + #[inline] pub fn make_privacy_mode_msg_with_details( state: back_notification::PrivacyModeState, diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 623c6078f..f22155b64 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -878,7 +878,7 @@ pub fn main_get_api_server() -> String { get_api_server() } -pub fn main_http_request(url: String, method: String, body: String, header: String) { +pub fn main_http_request(url: String, method: String, body: Option, header: String) { http_request(url,method, body, header) } diff --git a/src/hbbs_http/http_client.rs b/src/hbbs_http/http_client.rs index cf3655ad6..00f23e60e 100644 --- a/src/hbbs_http/http_client.rs +++ b/src/hbbs_http/http_client.rs @@ -14,11 +14,9 @@ macro_rules! configure_http_client { match proxy_result { Ok(proxy) => { let proxy_setup = match &proxy.intercept { - ProxyScheme::Http { host, .. } => reqwest::Proxy::http(host), - ProxyScheme::Https { host, .. } => reqwest::Proxy::https(host), - ProxyScheme::Socks5 { addr, .. } => { - reqwest::Proxy::all(&format!("socks5://{}", addr)) - } + ProxyScheme::Http { host, .. } =>{ reqwest::Proxy::http(format!("http://{}", host))}, + ProxyScheme::Https { host, .. } => {reqwest::Proxy::https(format!("https://{}", host))}, + ProxyScheme::Socks5 { addr, .. } => { reqwest::Proxy::all(&format!("socks5://{}", addr)) } }; match proxy_setup { diff --git a/src/ui.rs b/src/ui.rs index c5897b92a..f3bdcce2f 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -548,7 +548,7 @@ impl UI { change_id_shared(id, old_id); } - fn http_request(&self, url: String, method: String, body: String, header: String) { + fn http_request(&self, url: String, method: String, body: Option, header: String) { http_request(url, method, body, header) } diff --git a/src/ui_interface.rs b/src/ui_interface.rs index 4766f046d..1eafcc3d0 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -24,6 +24,7 @@ use std::{ collections::HashMap, sync::{Arc, Mutex}, }; +use hbb_common::log::error; use crate::common::SOFTWARE_UPDATE_URL; #[cfg(feature = "flutter")] @@ -717,12 +718,12 @@ pub fn change_id(id: String) { } #[inline] -pub fn http_request(url: String, method: String, body: String, header: String) { +pub fn http_request(url: String, method: String, body: Option, header: String) { *ASYNC_JOB_STATUS.lock().unwrap() = " ".to_owned(); std::thread::spawn(move || { *ASYNC_JOB_STATUS.lock().unwrap() = match crate::http_request_sync(url, method, body, header) { - Err(err) => err.to_string(), + Err(err) => { error!("{}", err); err.to_string() }, Ok(text) => text, }; });