diff --git a/frameworks/ets/ani/http/src/callback.rs b/frameworks/ets/ani/http/src/callback.rs index 3ab631ca2dfeb4f501fb4f984ebc6a64d5fc1538..6c18d885dd87711a83e6a3a41934c202155f9735 100644 --- a/frameworks/ets/ani/http/src/callback.rs +++ b/frameworks/ets/ani/http/src/callback.rs @@ -49,11 +49,20 @@ impl TaskCallback { impl RequestCallback for TaskCallback { fn on_success(&mut self, response: netstack_rs::response::Response) { - let code = response.status() as i32; - info!("request success: {:?}", code); + if let Some(callback) = self.on_response.take() { + let code = response.status() as i32; + let response = HttpResponse { + result_type: HttpDataType::String, + response_code: ResponseCodeOutput::I32(BoxI32::new(code)), + header: response.headers(), + cookies: String::new(), + performance_timing: PerformanceTiming::new(), + }; + callback.execute_spawn_thread(None, (response,)); + } + if let Some(callback) = self.on_data_end.take() { - info!("on_data_end callback set"); - callback.execute(None, ()); + callback.execute_spawn_thread(None, ()); } } @@ -65,23 +74,9 @@ impl RequestCallback for TaskCallback { fn on_data_receive(&mut self, data: &[u8], mut task: netstack_rs::task::RequestTask) { let headers = task.headers(); - if let Some(callback) = self.on_response.take() { - let response = task.response(); - let code = response.status() as i32; - let response = HttpResponse { - result_type: HttpDataType::String, - response_code: ResponseCodeOutput::I32(BoxI32::new(code)), - header: response.headers(), - cookies: String::new(), - performance_timing: PerformanceTiming::new(), - }; - info!("on_response callback set"); - callback.execute(None, (response,)); - } - if let Some(callback) = self.on_header_receive.as_ref() { info!("on_header_receive callback set"); - callback.execute(None, (headers.clone(),)); + callback.execute_spawn_thread(None, (headers.clone(),)); } } } diff --git a/frameworks/ets/ani/http/src/http.rs b/frameworks/ets/ani/http/src/http.rs index e7a00efbfc4239f6190e9ac0287a07485a413ec3..476f59ed0022168eff88cb9b240be84b6d33959c 100644 --- a/frameworks/ets/ani/http/src/http.rs +++ b/frameworks/ets/ani/http/src/http.rs @@ -18,7 +18,7 @@ use ani_rs::{ objects::{AniAsyncCallback, AniRef}, AniEnv, }; -use netstack_rs::{request::Request, task::RequestTask}; +use netstack_rs::{request::{has_internet_permission, Request}, task::RequestTask}; use crate::{ bridge::{Cleaner, HttpRequest, HttpRequestOptions, HttpResponseCache}, @@ -64,6 +64,10 @@ pub(crate) fn request( options: Option, ) -> Result<(), BusinessError> { info!("request url :{}", url); + if !has_internet_permission() { + return Err(BusinessError::PERMISSION); + } + let task = unsafe { &mut (*(this.native_ptr as *mut Task)) }; let mut request = Request::::new(); diff --git a/interfaces/innerkits/rust/netstack_rs/BUILD.gn b/interfaces/innerkits/rust/netstack_rs/BUILD.gn index a3ab85caab566f35ffe83e3392d03ff17e5b0573..2a345ce34a6dfaca3299ba0921a9da0138e534b7 100644 --- a/interfaces/innerkits/rust/netstack_rs/BUILD.gn +++ b/interfaces/innerkits/rust/netstack_rs/BUILD.gn @@ -41,6 +41,7 @@ ohos_static_library("netstack_rs_cxx") { ":netstack_rs_cxx_gen", "//third_party/rust/crates/cxx:cxx_cppdeps", "$NETSTACK_INNERKITS_DIR/http_client:http_client", + "$NETSTACK_DIR/utils:stack_utils_common", ] part_name = "netstack" @@ -62,9 +63,14 @@ ohos_rust_shared_library("netstack_rs") { deps = [ ":netstack_rs_cxx", "../ffrt_rs:ffrt_rs", + "$NETSTACK_DIR/frameworks/ets/ani/common:netstack_common", "//third_party/rust/crates/cxx:lib", ] + external_deps = [ + "hilog:hilog_rust", + ] + part_name = "netstack" subsystem_name = "communication" } \ No newline at end of file diff --git a/interfaces/innerkits/rust/netstack_rs/Cargo.toml b/interfaces/innerkits/rust/netstack_rs/Cargo.toml index 72e201ea5777f381bf27d0e953e4db2c50d4e0c1..950e05ecbaf889458b2a9722e86204446835ea4b 100644 --- a/interfaces/innerkits/rust/netstack_rs/Cargo.toml +++ b/interfaces/innerkits/rust/netstack_rs/Cargo.toml @@ -19,3 +19,5 @@ edition = "2021" [dependencies] cxx = "1.0.115" ffrt_rs = { path = "../ffrt_rs" } +hilog_rust = { git = "https://gitee.com/openharmony/hiviewdfx_hilog" } +netstack_common = { path = "../../../../frameworks/ets/ani/common" } diff --git a/interfaces/innerkits/rust/netstack_rs/src/lib.rs b/interfaces/innerkits/rust/netstack_rs/src/lib.rs index 841f3acb63682fbde11354842b2ad629596ced87..03ae21dda5081592b36c95db6ca33993b160bbe1 100644 --- a/interfaces/innerkits/rust/netstack_rs/src/lib.rs +++ b/interfaces/innerkits/rust/netstack_rs/src/lib.rs @@ -33,3 +33,9 @@ pub mod response; pub mod error; mod wrapper; + +const LOG_LABEL: hilog_rust::HiLogLabel = hilog_rust::HiLogLabel { + log_type: hilog_rust::LogType::LogCore, + domain: 0xD0015B0, + tag: "HttpAni", +}; diff --git a/interfaces/innerkits/rust/netstack_rs/src/request.rs b/interfaces/innerkits/rust/netstack_rs/src/request.rs index 535b85c5df2ea14195ac441a2f03c0c99f8de535..81500ed55c782e77e9a55e1059e6e4fe07540942 100644 --- a/interfaces/innerkits/rust/netstack_rs/src/request.rs +++ b/interfaces/innerkits/rust/netstack_rs/src/request.rs @@ -16,6 +16,7 @@ use cxx::{let_cxx_string, UniquePtr}; use crate::error::HttpClientError; use crate::response::Response; use crate::task::RequestTask; +use crate::wrapper; use crate::wrapper::ffi::{HttpClientRequest, NewHttpClientRequest, SetBody}; /// Builder for creating a Request. pub struct Request { @@ -110,3 +111,7 @@ impl Default for Request { Self::new() } } + +pub fn has_internet_permission() -> bool { + wrapper::ffi::HasInternetPermission() +} \ No newline at end of file diff --git a/interfaces/innerkits/rust/netstack_rs/src/wrapper.rs b/interfaces/innerkits/rust/netstack_rs/src/wrapper.rs index 63fd2b68010898204025be0dc27cd9e0bd1abdd6..ed23c2acba5aa8ba97b2a50cab10054839edf6c6 100644 --- a/interfaces/innerkits/rust/netstack_rs/src/wrapper.rs +++ b/interfaces/innerkits/rust/netstack_rs/src/wrapper.rs @@ -18,6 +18,7 @@ use std::sync::{Arc, Mutex, Weak}; use cxx::{let_cxx_string, SharedPtr}; use ffi::{HttpClientRequest, HttpClientTask, NewHttpClientTask, OnCallback}; use ffrt_rs::{ffrt_sleep, ffrt_spawn}; +use netstack_common::debug; use crate::error::{HttpClientError, HttpErrorCode}; use crate::request::RequestCallback; @@ -51,19 +52,12 @@ impl CallbackWrapper { impl CallbackWrapper { fn on_success(&mut self, _request: &HttpClientRequest, response: &ffi::HttpClientResponse) { + debug!("on_success callback is called"); let Some(mut callback) = self.inner.take() else { return; }; let response = Response::from_ffi(response); - if (response.status().clone() as u32 >= 300) || (response.status().clone() as u32) < 200 { - let error = HttpClientError::new( - HttpErrorCode::HttpNoneErr, - (response.status() as u32).to_string(), - ); - callback.on_fail(error); - } else { - callback.on_success(response); - } + callback.on_success(response); } fn on_fail( @@ -251,6 +245,7 @@ pub(crate) mod ffi { include!("http_client_request.h"); include!("wrapper.h"); include!("http_client_task.h"); + include!("netstack_common_utils.h"); #[namespace = "OHOS::NetStack::HttpClient"] type TaskStatus; @@ -293,6 +288,9 @@ pub(crate) mod ffi { fn GetErrorCode(self: &HttpClientError) -> HttpErrorCode; fn GetErrorMessage(self: &HttpClientError) -> &CxxString; + + #[namespace = "OHOS::NetStack::CommonUtils"] + fn HasInternetPermission() -> bool; } #[repr(i32)]