From 6cb17e438781b3a7b6f1f19aaa2a76c5c68d279b Mon Sep 17 00:00:00 2001 From: zj94 Date: Thu, 20 Mar 2025 21:43:57 +0800 Subject: [PATCH 001/126] [cj]: Add cangjie so to innerkit Signed-off-by: zj94 Change-Id: Ic639c6207646e95094cbfd5af13afc9ec797ae44 --- bundle.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/bundle.json b/bundle.json index 90ca8ccbb..b36133680 100644 --- a/bundle.json +++ b/bundle.json @@ -62,8 +62,6 @@ "build": { "group_type": { "base_group": [ - "//foundation/communication/netstack/frameworks/cj/http:cj_net_http_ffi", - "//foundation/communication/netstack/frameworks/cj/websocket:cj_net_websocket_ffi", "//foundation/communication/netstack/frameworks/js/napi/http:http", "//foundation/communication/netstack/frameworks/js/napi/socket:socket", "//foundation/communication/netstack/frameworks/js/napi/websocket:websocket", @@ -119,6 +117,20 @@ "header_files": [] }, "name": "//foundation/communication/netstack/interfaces/innerkits/rust/ylong_http_client:ylong_http_client" + }, + { + "header": { + "header_base": "//foundation/communication/netstack/frameworks/cj/websocket/include", + "header_files": [] + }, + "name": "//foundation/communication/netstack/frameworks/cj/websocket:cj_net_websocket_ffi" + }, + { + "header": { + "header_base": "//foundation/communication/netstack/frameworks/cj/http/include", + "header_files": [] + }, + "name": "//foundation/communication/netstack/frameworks/cj/http:cj_net_http_ffi" } ], "test": [ -- Gitee From 7e4a0832722ae0205ff6e0e82d490624a08b7e71 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:40:31 +0000 Subject: [PATCH 002/126] update test/unittest/http/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/http/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/http/BUILD.gn b/test/unittest/http/BUILD.gn index 1de211f16..ecf3f050a 100644 --- a/test/unittest/http/BUILD.gn +++ b/test/unittest/http/BUILD.gn @@ -38,7 +38,7 @@ ohos_unittest("http_unittest") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/http_unittest" + module_out_path = "netstack/netstack/http_unittest" include_dirs = [ "$NETSTACK_NAPI_ROOT/http/async_context/include", -- Gitee From 54723f356bbba109deacebf8ad23da67198d7a31 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:41:24 +0000 Subject: [PATCH 003/126] update test/unittest/http/cache/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/http/cache/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/http/cache/BUILD.gn b/test/unittest/http/cache/BUILD.gn index 7bf965af4..88aa15167 100644 --- a/test/unittest/http/cache/BUILD.gn +++ b/test/unittest/http/cache/BUILD.gn @@ -37,7 +37,7 @@ ohos_unittest("http_cache_unittest") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/http_cache_unittest" + module_out_path = "netstack/netstack/http_cache_unittest" include_dirs = [ "$NETSTACK_NAPI_ROOT/http/cache/cache_constant/include", -- Gitee From 31a8793c851ae3af653d71e3e65f36ed7d283b85 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:42:08 +0000 Subject: [PATCH 004/126] update test/unittest/http_client/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/http_client/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/http_client/BUILD.gn b/test/unittest/http_client/BUILD.gn index 37f255ea9..d98e700c3 100644 --- a/test/unittest/http_client/BUILD.gn +++ b/test/unittest/http_client/BUILD.gn @@ -35,7 +35,7 @@ ohos_unittest("http_client_unittest") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/http_client_unittest" + module_out_path = "netstack/netstack/http_client_unittest" include_dirs = [ "$NETSTACK_INNERKITS_DIR/http_client/include" ] include_dirs += utils_include -- Gitee From 37e0d1e21a4e0539060b69a86885c3359fc2987e Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:42:46 +0000 Subject: [PATCH 005/126] update test/unittest/netssl/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/netssl/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/netssl/BUILD.gn b/test/unittest/netssl/BUILD.gn index 0507c25ff..53d6ff358 100644 --- a/test/unittest/netssl/BUILD.gn +++ b/test/unittest/netssl/BUILD.gn @@ -30,7 +30,7 @@ common_external_deps = [ ] ohos_unittest("netssl_unittest") { - module_out_path = "netstack/netssl_unittest" + module_out_path = "netstack/netstack/netssl_unittest" include_dirs = [ "$NETSTACK_DIR/utils/napi_utils/include", -- Gitee From 6638a4a1f75b2f844b923d185f8df2a086ea39ae Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:43:16 +0000 Subject: [PATCH 006/126] update test/unittest/socket/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/socket/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/socket/BUILD.gn b/test/unittest/socket/BUILD.gn index 3af8172c2..73dec80e5 100644 --- a/test/unittest/socket/BUILD.gn +++ b/test/unittest/socket/BUILD.gn @@ -39,7 +39,7 @@ ohos_unittest("socket_unittest") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/socket_unittest" + module_out_path = "netstack/netstack/socket_unittest" include_dirs = [ "$NETSTACK_DIR/frameworks/js/napi/proxy/include", -- Gitee From 2cce2d62574fffdf252bb78685ef54ad25c0c256 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:44:43 +0000 Subject: [PATCH 007/126] update test/unittest/tlssocket/client/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/tlssocket/client/BUILD.gn | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/unittest/tlssocket/client/BUILD.gn b/test/unittest/tlssocket/client/BUILD.gn index 717965aa0..c6fa3b722 100644 --- a/test/unittest/tlssocket/client/BUILD.gn +++ b/test/unittest/tlssocket/client/BUILD.gn @@ -153,7 +153,7 @@ ohos_unittest("two_way_tls_socket_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -197,7 +197,7 @@ ohos_unittest("one_way_tls_socket_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -241,7 +241,7 @@ ohos_unittest("two_way_tls_socket_certchain_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -285,7 +285,7 @@ ohos_unittest("one_way_tls_socket_certchain_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -332,7 +332,7 @@ ohos_unittest("tls_socket_unilateral_connection") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -359,7 +359,7 @@ ohos_unittest("secure_data_unittest") { "hilog:libhilog", ] - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -402,7 +402,7 @@ ohos_unittest("tls_key_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -445,7 +445,7 @@ ohos_unittest("tls_cert_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -488,7 +488,7 @@ ohos_unittest("tls_configuration_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -531,7 +531,7 @@ ohos_unittest("tls_context_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -574,7 +574,7 @@ ohos_unittest("socket_error_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -620,7 +620,7 @@ ohos_unittest("tls_socket_branch_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } -- Gitee From 99296b2c14aa39fcc413155419d86456512b3d34 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:45:15 +0000 Subject: [PATCH 008/126] update test/unittest/tlssocket/core/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/tlssocket/core/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/tlssocket/core/BUILD.gn b/test/unittest/tlssocket/core/BUILD.gn index d4c097530..f562b4fc9 100644 --- a/test/unittest/tlssocket/core/BUILD.gn +++ b/test/unittest/tlssocket/core/BUILD.gn @@ -159,7 +159,7 @@ ohos_unittest("tls_socket_core_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } -- Gitee From 8e8567802915d64baf69b0fd019aa81e9db2edc5 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:45:55 +0000 Subject: [PATCH 009/126] update test/unittest/tlssocket/server/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/tlssocket/server/BUILD.gn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/tlssocket/server/BUILD.gn b/test/unittest/tlssocket/server/BUILD.gn index 200d1b635..32fc0de3d 100644 --- a/test/unittest/tlssocket/server/BUILD.gn +++ b/test/unittest/tlssocket/server/BUILD.gn @@ -155,7 +155,7 @@ ohos_unittest("two_way_tls_socket_server_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } @@ -199,7 +199,7 @@ ohos_unittest("tls_socket_server_mock_branch_test") { defines += [ "HAS_NETMANAGER_BASE=0" ] } - module_out_path = "netstack/tls_socket_unittest" + module_out_path = "netstack/netstack/tls_socket_unittest" part_name = "netstack" subsystem_name = "communication" } -- Gitee From e85186a24d20bf80c1622a66f2d40acc918e1d46 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:46:22 +0000 Subject: [PATCH 010/126] update test/unittest/utils/common_utils/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/utils/common_utils/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/utils/common_utils/BUILD.gn b/test/unittest/utils/common_utils/BUILD.gn index 8ce8dd906..d9687cbb0 100644 --- a/test/unittest/utils/common_utils/BUILD.gn +++ b/test/unittest/utils/common_utils/BUILD.gn @@ -34,7 +34,7 @@ ohos_unittest("netstack_common_utils_test") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/utils_unittest" + module_out_path = "netstack/netstack/utils_unittest" include_dirs = [ "$NETSTACK_UTILS_ROOT/common_utils/include" ] -- Gitee From 286b34a39edd1960439f8c646390bc8bc7fa6555 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:46:54 +0000 Subject: [PATCH 011/126] update test/unittest/utils/profiler_utils/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/utils/profiler_utils/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/utils/profiler_utils/BUILD.gn b/test/unittest/utils/profiler_utils/BUILD.gn index 9c532004f..3d41f9a49 100644 --- a/test/unittest/utils/profiler_utils/BUILD.gn +++ b/test/unittest/utils/profiler_utils/BUILD.gn @@ -35,7 +35,7 @@ ohos_unittest("netstack_network_profiler_utils_test") { branch_protector_ret = "pac_ret" - module_out_path = "netstack/netstack_network_profiler_utils_test" + module_out_path = "netstack/netstack/netstack_network_profiler_utils_test" include_dirs = [ "$NETSTACK_INNERKITS_DIR/http_client/include", -- Gitee From e3f3c41833c8e261990048aedae8aef6ac622324 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:47:26 +0000 Subject: [PATCH 012/126] update test/unittest/websocket/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/websocket/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 0b2c33894..961d724f7 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -29,7 +29,7 @@ common_external_deps = [ ] ohos_unittest("websocket_unittest") { - module_out_path = "netstack/websocket_unittest" + module_out_path = "netstack/netstack/websocket_unittest" include_dirs = [ "$NETSTACK_DIR/utils/napi_utils/include", -- Gitee From d5477230dad93d3c773a1fa866e8e77da4e5fa7f Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:47:55 +0000 Subject: [PATCH 013/126] update test/unittest/websocket_capi_unittest/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/websocket_capi_unittest/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/websocket_capi_unittest/BUILD.gn b/test/unittest/websocket_capi_unittest/BUILD.gn index 2c6bc4b39..f2e2871cb 100755 --- a/test/unittest/websocket_capi_unittest/BUILD.gn +++ b/test/unittest/websocket_capi_unittest/BUILD.gn @@ -28,7 +28,7 @@ common_external_deps = [ ] ohos_unittest("websocket_capi_unittest") { - module_out_path = "netstack/websocket_capi_unittest" + module_out_path = "netstack/netstack/websocket_capi_unittest" include_dirs = [ "$NETSTACK_DIR/interfaces/kits/c/net_websocket/include", -- Gitee From 3ead546eeb7e043c867d5e408e5eeda265d89e49 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 25 Mar 2025 11:48:22 +0000 Subject: [PATCH 014/126] update test/unittest/websocket_inner_unittest/BUILD.gn. Signed-off-by: zhengsiwen960323 --- test/unittest/websocket_inner_unittest/BUILD.gn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/websocket_inner_unittest/BUILD.gn b/test/unittest/websocket_inner_unittest/BUILD.gn index ec04d29aa..7e7b7b40d 100755 --- a/test/unittest/websocket_inner_unittest/BUILD.gn +++ b/test/unittest/websocket_inner_unittest/BUILD.gn @@ -31,7 +31,7 @@ common_external_deps = [ ] ohos_unittest("websocket_inner_unittest") { - module_out_path = "netstack/websocket_inner_unittest" + module_out_path = "netstack/netstack/websocket_inner_unittest" include_dirs = [ "$NETSTACK_DIR/utils/napi_utils/include", -- Gitee From f365d362acd4dc5afaa4951e8cb6835787fbd356 Mon Sep 17 00:00:00 2001 From: l00635678 Date: Wed, 26 Mar 2025 17:05:31 +0800 Subject: [PATCH 015/126] =?UTF-8?q?ssl=E6=A0=A1=E9=AA=8C=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00635678 --- .../js/napi/net_ssl/async_context/src/cert_context.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp b/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp index ffb1d5598..ca8950f31 100644 --- a/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp +++ b/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp @@ -56,7 +56,12 @@ static const std::map SSL_ERR_MAP = { }; CertContext::CertContext(napi_env env, const std::shared_ptr &manager) - : BaseContext(env, manager), certBlob_(nullptr), certBlobClient_(nullptr) {} + : BaseContext(env, manager), certBlob_(nullptr), certBlobClient_(nullptr) +{ + if (sharedManager_ == nullptr) { + sharedManager_ = std::make_shared(); + } +} void CertContext::ParseParams(napi_value *params, size_t paramsCount) { -- Gitee From 25319c6eb6dd2f1a19b08b93de62cf273e79991f Mon Sep 17 00:00:00 2001 From: k-lee9575 Date: Thu, 27 Mar 2025 22:28:08 +0800 Subject: [PATCH 016/126] =?UTF-8?q?XTS=20=E7=94=A8=E4=BE=8B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: k-lee9575 --- .../js/napi/net_ssl/async_context/src/cert_context.cpp | 7 +------ .../js/napi/net_ssl/net_ssl_exec/src/net_ssl_exec.cpp | 6 ------ 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp b/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp index ca8950f31..ffb1d5598 100644 --- a/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp +++ b/frameworks/js/napi/net_ssl/async_context/src/cert_context.cpp @@ -56,12 +56,7 @@ static const std::map SSL_ERR_MAP = { }; CertContext::CertContext(napi_env env, const std::shared_ptr &manager) - : BaseContext(env, manager), certBlob_(nullptr), certBlobClient_(nullptr) -{ - if (sharedManager_ == nullptr) { - sharedManager_ = std::make_shared(); - } -} + : BaseContext(env, manager), certBlob_(nullptr), certBlobClient_(nullptr) {} void CertContext::ParseParams(napi_value *params, size_t paramsCount) { diff --git a/frameworks/js/napi/net_ssl/net_ssl_exec/src/net_ssl_exec.cpp b/frameworks/js/napi/net_ssl/net_ssl_exec/src/net_ssl_exec.cpp index fcefcef4c..805f6dffd 100644 --- a/frameworks/js/napi/net_ssl/net_ssl_exec/src/net_ssl_exec.cpp +++ b/frameworks/js/napi/net_ssl/net_ssl_exec/src/net_ssl_exec.cpp @@ -24,10 +24,6 @@ namespace OHOS::NetStack::Ssl { bool SslExec::ExecVerify(CertContext *context) { context->SetPermissionDenied(true); - auto sharedManager = context->GetSharedManager(); - if (sharedManager == nullptr || sharedManager->IsEventDestroy()) { - return false; - } if (context->GetErrorCode() == PARSE_ERROR_CODE) { return false; @@ -42,14 +38,12 @@ bool SslExec::ExecVerify(CertContext *context) NETSTACK_LOGD("verifyResult is %{public}d\n", context->GetErrorCode()); if (context->GetErrorCode() != 0) { - NapiUtils::CreateUvQueueWorkEnhanced(context->GetEnv(), context, NetSslAsyncWork::VerifyCallback); return false; } } else { context->SetErrorCode(NetStackVerifyCertification(context->GetCertBlob(), context->GetCertBlobClient())); NETSTACK_LOGD("verifyResult is %{public}d\n", context->GetErrorCode()); if (context->GetErrorCode() != 0) { - NapiUtils::CreateUvQueueWorkEnhanced(context->GetEnv(), context, NetSslAsyncWork::VerifyCallback); return false; } } -- Gitee From 85db6514e6df67dcc27f336888a4b3d223d9cfc9 Mon Sep 17 00:00:00 2001 From: fanqibing Date: Fri, 28 Mar 2025 02:24:39 +0800 Subject: [PATCH 017/126] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=B9=E7=AB=AFFin?= =?UTF-8?q?=E5=90=8E=EF=BC=8Ctcp=E6=8E=A5=E6=94=B6=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=8D=E9=80=80=E5=87=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: fanqibing --- .../socket/socket_exec/src/socket_exec.cpp | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index e49bd4075..264ccae1f 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -649,9 +649,6 @@ static int UpdateRecvBuffer(int sock, int &bufferSize, std::unique_ptr & static int ExitOrAbnormal(int sock, ssize_t recvLen, const MessageCallback &callback) { - if (errno == EAGAIN || errno == EINTR) { - return 0; - } if (!IsTCPSocket(sock) && errno != EBADF) { NETSTACK_LOGI("not tcpsocket, continue loop, recvLen: %{public}zd, err: %{public}d", recvLen, errno); if (errno == ENOTSOCK) { @@ -659,15 +656,19 @@ static int ExitOrAbnormal(int sock, ssize_t recvLen, const MessageCallback &call } return 0; } - if (errno == 0 && recvLen == 0) { + if (recvLen == 0) { NETSTACK_LOGI("closed by peer, socket:%{public}d, recvLen:%{public}zd", sock, recvLen); callback.OnCloseMessage(callback.GetEventManager()); - } else { - if (callback.GetEventManager() != nullptr && static_cast( - reinterpret_cast(callback.GetEventManager()->GetData())) > 0) { - NETSTACK_LOGE("recv fail, socket:%{public}d, recvLen:%{public}zd, errno:%{public}d", sock, recvLen, errno); - callback.OnError(errno); - } + return -1; + } + if (errno == EAGAIN || errno == EINTR) { + return 0; + } + + if (callback.GetEventManager() != nullptr && static_cast( + reinterpret_cast(callback.GetEventManager()->GetData())) > 0) { + NETSTACK_LOGE("recv fail, socket:%{public}d, recvLen:%{public}zd, errno:%{public}d", sock, recvLen, errno); + callback.OnError(errno); } return -1; } @@ -729,12 +730,12 @@ static bool ProcessRecvFds(std::pair &, int> &bufInfo, std::unordered_map &socketCallbackMap) { for (auto &fd : fds) { -#if !defined(CROSS_PLATFORM) - if ((static_cast(fd.revents) & POLLRDHUP) || (static_cast(fd.revents) & POLLERR) || - (static_cast(fd.revents) & POLLNVAL)) { -#else if ((static_cast(fd.revents) & POLLERR) || (static_cast(fd.revents) & POLLNVAL)) { -#endif + NETSTACK_LOGE("recv fail, socket:%{public}d, errno:%{public}d, revent:%{public}x", fd.fd, errno, fd.revents); + if (callback.GetEventManager() != nullptr && static_cast( + reinterpret_cast(callback.GetEventManager()->GetData())) > 0) { + callback.OnError(errno); + } return false; } if ((static_cast(fd.revents) & POLLIN) == 0) { -- Gitee From 12045bea04090d7d51c33c68b71d2cfb893978c3 Mon Sep 17 00:00:00 2001 From: fanqibing Date: Fri, 28 Mar 2025 10:27:07 +0000 Subject: [PATCH 018/126] update frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp. Signed-off-by: fanqibing --- frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 264ccae1f..20c5cf644 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -731,7 +731,8 @@ static bool ProcessRecvFds(std::pair &, int> &bufInfo, { for (auto &fd : fds) { if ((static_cast(fd.revents) & POLLERR) || (static_cast(fd.revents) & POLLNVAL)) { - NETSTACK_LOGE("recv fail, socket:%{public}d, errno:%{public}d, revent:%{public}x", fd.fd, errno, fd.revents); + NETSTACK_LOGE("recv fail, socket:%{public}d, errno:%{public}d, revent:%{public}x", + fd.fd, errno, fd.revents); if (callback.GetEventManager() != nullptr && static_cast( reinterpret_cast(callback.GetEventManager()->GetData())) > 0) { callback.OnError(errno); -- Gitee From 4395d052c26beb837c747a611c9e7723443599d7 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 8 Apr 2025 08:57:18 +0000 Subject: [PATCH 019/126] update test/unittest/tlssocket/client/TlsSocketBranchTest.cpp. Signed-off-by: zhengsiwen960323 --- test/unittest/tlssocket/client/TlsSocketBranchTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unittest/tlssocket/client/TlsSocketBranchTest.cpp b/test/unittest/tlssocket/client/TlsSocketBranchTest.cpp index d930127ff..610979728 100644 --- a/test/unittest/tlssocket/client/TlsSocketBranchTest.cpp +++ b/test/unittest/tlssocket/client/TlsSocketBranchTest.cpp @@ -262,7 +262,6 @@ HWTEST_F(TlsSocketBranchTest, BranchTest5, TestSize.Level2) tlsSocket->GetProtocol([](int32_t errCode, const std::string &protocol) { EXPECT_EQ(errCode, TLSSOCKET_SUCCESS); }); tlsSocket->GetRemoteCertificate( [](int32_t errCode, const X509CertRawData &cert) { EXPECT_EQ(errCode, TLS_ERR_SSL_NULL); }); - (void)tlsSocket->Close([](int32_t errCode) { EXPECT_FALSE(errCode == TLSSOCKET_SUCCESS); }); } HWTEST_F(TlsSocketBranchTest, BranchTest6, TestSize.Level2) -- Gitee From 3d0f8bbf663f609ee3baf39921a63923177460d6 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 15 Apr 2025 02:38:17 +0000 Subject: [PATCH 020/126] add loginfo to solve issue Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- frameworks/js/napi/http/http_exec/src/http_exec.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frameworks/js/napi/http/http_exec/src/http_exec.cpp b/frameworks/js/napi/http/http_exec/src/http_exec.cpp index 92e59d7a7..8d4215801 100755 --- a/frameworks/js/napi/http/http_exec/src/http_exec.cpp +++ b/frameworks/js/napi/http/http_exec/src/http_exec.cpp @@ -351,6 +351,17 @@ bool HttpExec::RequestWithoutCache(RequestContext *context) }); context->SetCurlHeaderList(MakeHeaders(vec)); + static auto logCallback = +[](CURL *curl, + curl_infotype type, + char *data, + size_t size, + void *userptr) { + if (type == CURLINFO_STATE) { + NETSTACK_LOGI("CURL_TRACE: type = %{public}d, data = %{public}s", type, data); + } + }; + curl_easy_setopt(handle, CURLOPT_VERBOSE, 1); + curl_easy_setopt(handle, CURLOPT_DEBUGFUNCTION, logCallback); if (!SetOption(handle, context, context->GetCurlHeaderList())) { NETSTACK_LOGE("set option failed"); return false; -- Gitee From 9798d8617243e3810adc3ed65729566f9455a193 Mon Sep 17 00:00:00 2001 From: xhttt123 <2317512661@qq.com> Date: Tue, 15 Apr 2025 13:25:46 +0000 Subject: [PATCH 021/126] update frameworks/js/napi/tls/src/tlssocket_exec.cpp. Signed-off-by: xhttt123 <2317512661@qq.com> --- frameworks/js/napi/tls/src/tlssocket_exec.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/tls/src/tlssocket_exec.cpp b/frameworks/js/napi/tls/src/tlssocket_exec.cpp index 2dd0f85fe..a95a5aa55 100644 --- a/frameworks/js/napi/tls/src/tlssocket_exec.cpp +++ b/frameworks/js/napi/tls/src/tlssocket_exec.cpp @@ -114,6 +114,7 @@ bool TLSSocketExec::ExecGetCertificate(GetCertificateContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetCertificate tlsSocket is null"); @@ -205,6 +206,7 @@ bool TLSSocketExec::ExecConnect(TLSConnectContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecConnect tlsSocket is null"); @@ -239,6 +241,7 @@ bool TLSSocketExec::ExecGetCipherSuites(GetCipherSuitesContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetCipherSuites tlsSocket is null"); @@ -268,6 +271,7 @@ bool TLSSocketExec::ExecGetRemoteCertificate(GetRemoteCertificateContext *contex NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetRemoteCertificate tlsSocket is null"); @@ -297,6 +301,7 @@ bool TLSSocketExec::ExecGetProtocol(GetProtocolContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetProtocol tlsSocket is null"); @@ -326,6 +331,7 @@ bool TLSSocketExec::ExecGetSignatureAlgorithms(GetSignatureAlgorithmsContext *co NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetSignatureAlgorithms tlsSocket is null"); @@ -419,7 +425,7 @@ bool TLSSocketExec::ExecBind(TLSBindContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } - + std::unique_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket != nullptr) { NETSTACK_LOGI("TLSSocket has been constructed"); @@ -455,6 +461,7 @@ bool TLSSocketExec::ExecGetRemoteAddress(TLSGetRemoteAddressContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetRemoteAddress tlsSocket is null"); @@ -489,6 +496,7 @@ bool TLSSocketExec::ExecGetLocalAddress(TLSGetLocalAddressContext *context) TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND)); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND, @@ -538,6 +546,7 @@ bool TLSSocketExec::ExecGetState(TLSGetStateContext *context) context->SetError(TLS_ERR_SYS_EINVAL, MakeErrorMessage(TLS_ERR_SYS_EINVAL)); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetState tlsSocket is null"); @@ -564,6 +573,7 @@ bool TLSSocketExec::ExecSetExtraOptions(TLSSetExtraOptionsContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecSetExtraOptions tlsSocket is null"); @@ -592,6 +602,7 @@ bool TLSSocketExec::ExecGetSocketFd(TLSGetSocketFdContext *context) NETSTACK_LOGE("manager is nullptr"); return false; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("ExecGetSocketFd tlsSocket is null"); @@ -755,6 +766,7 @@ napi_value TLSSocketExec::GetLocalAddressCallback(TLSGetLocalAddressContext *con NETSTACK_LOGE("manager is nullptr"); return obj; } + std::shared_lock lock(manager->GetDataMutex()); auto tlsSocket = reinterpret_cast *>(manager->GetData()); if (tlsSocket == nullptr) { NETSTACK_LOGE("get localAddress callback tlsSocketServer is null"); -- Gitee From 1f413dd51fd12bcf4f871af4751433d84d7fa0e3 Mon Sep 17 00:00:00 2001 From: xhttt123 <2317512661@qq.com> Date: Tue, 15 Apr 2025 14:01:04 +0000 Subject: [PATCH 022/126] update frameworks/js/napi/tls/src/tlssocket_exec.cpp. Signed-off-by: xhttt123 <2317512661@qq.com> --- frameworks/js/napi/tls/src/tlssocket_exec.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frameworks/js/napi/tls/src/tlssocket_exec.cpp b/frameworks/js/napi/tls/src/tlssocket_exec.cpp index a95a5aa55..df6aa8030 100644 --- a/frameworks/js/napi/tls/src/tlssocket_exec.cpp +++ b/frameworks/js/napi/tls/src/tlssocket_exec.cpp @@ -484,6 +484,13 @@ bool TLSSocketExec::ExecGetRemoteAddress(TLSGetRemoteAddressContext *context) return context->errorNumber_ == TLSSOCKET_SUCCESS; } +void TLSSocketExec::SetContext(TLSGetLocalAddressContext *context) +{ + context->SetNeedThrowException(true); + context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND, + TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND)); +} + bool TLSSocketExec::ExecGetLocalAddress(TLSGetLocalAddressContext *context) { if (context == nullptr) { @@ -491,9 +498,7 @@ bool TLSSocketExec::ExecGetLocalAddress(TLSGetLocalAddressContext *context) } auto manager = context->GetSharedManager(); if (manager == nullptr) { - context->SetNeedThrowException(true); - context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND, - TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND)); + SetContext(context); return false; } std::shared_lock lock(manager->GetDataMutex()); -- Gitee From bfaeee4006313a8ae58007a20cc149574c7896ac Mon Sep 17 00:00:00 2001 From: xhttt123 <2317512661@qq.com> Date: Tue, 15 Apr 2025 14:01:32 +0000 Subject: [PATCH 023/126] update frameworks/js/napi/tls/include/tlssocket_exec.h. Signed-off-by: xhttt123 <2317512661@qq.com> --- frameworks/js/napi/tls/include/tlssocket_exec.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/js/napi/tls/include/tlssocket_exec.h b/frameworks/js/napi/tls/include/tlssocket_exec.h index 2792d3cbd..926d59f7e 100644 --- a/frameworks/js/napi/tls/include/tlssocket_exec.h +++ b/frameworks/js/napi/tls/include/tlssocket_exec.h @@ -64,6 +64,8 @@ public: static napi_value GetLocalAddressCallback(TLSGetLocalAddressContext *context); static napi_value SetExtraOptionsCallback(TLSSetExtraOptionsContext *context); static napi_value GetSocketFdCallback(TLSGetSocketFdContext *context); +private: + static void SetContext(TLSGetLocalAddressContext *context); }; } // namespace TlsSocket } // namespace NetStack -- Gitee From 708b34e35dbd2124783dc571038cd7a6536fcfe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:38:28 +0000 Subject: [PATCH 024/126] update frameworks/js/napi/websocket/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- frameworks/js/napi/websocket/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/js/napi/websocket/BUILD.gn b/frameworks/js/napi/websocket/BUILD.gn index fe9dd3782..d0a6f5421 100644 --- a/frameworks/js/napi/websocket/BUILD.gn +++ b/frameworks/js/napi/websocket/BUILD.gn @@ -62,6 +62,7 @@ ohos_shared_library("websocket") { "libwebsockets:websockets", "napi:ace_napi", "openssl:libssl_shared", + "samgr:samgr_proxy", ] if (defined(global_parts_info) && -- Gitee From 7089b6459897abca385a5d25eed589befafd1d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:39:55 +0000 Subject: [PATCH 025/126] update frameworks/js/napi/net_ssl/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- frameworks/js/napi/net_ssl/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/js/napi/net_ssl/BUILD.gn b/frameworks/js/napi/net_ssl/BUILD.gn index 49910f8b4..cf32a6df8 100644 --- a/frameworks/js/napi/net_ssl/BUILD.gn +++ b/frameworks/js/napi/net_ssl/BUILD.gn @@ -87,6 +87,7 @@ ohos_shared_library("networksecurity_napi") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] } defines = [] -- Gitee From 3127900ae4c4b50033315c1f0fc456d9ed6960ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:41:25 +0000 Subject: [PATCH 026/126] update frameworks/cj/http/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- frameworks/cj/http/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/cj/http/BUILD.gn b/frameworks/cj/http/BUILD.gn index f65f44e92..e69198a93 100644 --- a/frameworks/cj/http/BUILD.gn +++ b/frameworks/cj/http/BUILD.gn @@ -82,6 +82,7 @@ ohos_shared_library("cj_net_http_ffi") { "napi:cj_bind_native", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] if (build_ohos_sdk) { -- Gitee From 79b477a215503e00daf0aa998671151051639cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:42:02 +0000 Subject: [PATCH 027/126] update frameworks/cj/websocket/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- frameworks/cj/websocket/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/cj/websocket/BUILD.gn b/frameworks/cj/websocket/BUILD.gn index 69c9f08e7..6c35eadb5 100644 --- a/frameworks/cj/websocket/BUILD.gn +++ b/frameworks/cj/websocket/BUILD.gn @@ -62,6 +62,7 @@ ohos_shared_library("cj_net_websocket_ffi") { "napi:cj_bind_ffi", "napi:cj_bind_native", "openssl:libssl_shared", + "samgr:samgr_proxy", ] if (defined(global_parts_info) && -- Gitee From c0f7bc458c7cd118707e3fb0f49bc9c238163a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:44:06 +0000 Subject: [PATCH 028/126] update frameworks/js/napi/socket/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- frameworks/js/napi/socket/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/js/napi/socket/BUILD.gn b/frameworks/js/napi/socket/BUILD.gn index 57033c328..20b498be3 100644 --- a/frameworks/js/napi/socket/BUILD.gn +++ b/frameworks/js/napi/socket/BUILD.gn @@ -143,6 +143,7 @@ ohos_shared_library("socket") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] if (defined(global_parts_info) && -- Gitee From 19afb45fbbd0dd1125ea12d9bc014cec31a16e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:45:07 +0000 Subject: [PATCH 029/126] update interfaces/kits/c/net_ssl/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- interfaces/kits/c/net_ssl/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/interfaces/kits/c/net_ssl/BUILD.gn b/interfaces/kits/c/net_ssl/BUILD.gn index 03c9a847b..9d0b684da 100644 --- a/interfaces/kits/c/net_ssl/BUILD.gn +++ b/interfaces/kits/c/net_ssl/BUILD.gn @@ -43,6 +43,7 @@ ohos_shared_library("net_ssl_ndk") { "netmanager_base:net_conn_manager_if", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] cflags_cc = [ -- Gitee From 29118f5370b2901698bd27228c8d305cc878c5e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Thu, 17 Apr 2025 01:46:48 +0000 Subject: [PATCH 030/126] update utils/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- utils/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 252016c4f..9ca616c7d 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -69,6 +69,7 @@ ohos_shared_library("stack_utils_common") { "bounds_checking_function:libsec_shared", "hilog:libhilog", "hisysevent:libhisysevent", + "samgr:samgr_proxy", ] if (defined(global_parts_info) && -- Gitee From 491d9b1b350eee6dfc65f1ed6624a1cfdb3b837e Mon Sep 17 00:00:00 2001 From: l00635678 Date: Tue, 22 Apr 2025 20:51:37 +0800 Subject: [PATCH 031/126] com.huawei.hmos.email-CPP_CRASH Signed-off-by: l00635678 --- .../napi/socket/socket_exec/src/socket_exec.cpp | 1 + utils/napi_utils/include/event_manager.h | 1 - utils/napi_utils/src/event_manager.cpp | 17 +++++++---------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 20c5cf644..e57c43aa1 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -767,6 +767,7 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, return false; } + std::shared_lock lock(manager->GetDataMutex()); currentFd = static_cast(reinterpret_cast(manager->GetData())); if (currentFd <= 0) { NETSTACK_LOGE("currentFd: %{public}d is error", currentFd); diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index e68f4b26b..12eb644e6 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -119,7 +119,6 @@ public: private: std::shared_mutex mutexForListenersAndEmitByUv_; - std::mutex mutexForEmitAndEmitByUv_; std::shared_mutex dataMutex_; std::mutex dataQueueMutex_; std::list listeners_; diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 058122b89..545a75411 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -37,7 +37,7 @@ EventManager::~EventManager() void EventManager::AddListener(napi_env env, const std::string &type, napi_value callback, bool once, bool asyncCallback) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); if (it != listeners_.end()) { @@ -49,7 +49,7 @@ void EventManager::AddListener(napi_env env, const std::string &type, napi_value void EventManager::DeleteListener(const std::string &type, napi_value callback) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type, callback](const EventListener &listener) -> bool { return listener.Match(type, callback); @@ -59,10 +59,8 @@ void EventManager::DeleteListener(const std::string &type, napi_value callback) void EventManager::Emit(const std::string &type, const std::pair &argv) { - std::shared_lock lock2(mutexForListenersAndEmitByUv_); - auto listeners = listeners_; - lock2.unlock(); - std::for_each(listeners.begin(), listeners.end(), [type, argv](const EventListener &listener) { + std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::for_each(listeners_.begin(), listeners_.end(), [type, argv](const EventListener &listener) { if (listener.IsAsyncCallback()) { /* AsyncCallback(BusinessError error, T data) */ napi_value arg[ASYNC_CALLBACK_PARAM_NUM] = {argv.first, argv.second}; @@ -74,7 +72,6 @@ void EventManager::Emit(const std::string &type, const std::pair bool { return listener.MatchOnce(type); }); listeners_.erase(it, listeners_.end()); @@ -92,7 +89,7 @@ void *EventManager::GetData() void EventManager::EmitByUvWithoutCheckShared(const std::string &type, void *data, void (*Handler)(uv_work_t *, int)) { - std::shared_lock lock2(mutexForListenersAndEmitByUv_); + std::shared_lock lock(mutexForListenersAndEmitByUv_); bool foundHeader = std::find_if(listeners_.begin(), listeners_.end(), [](const EventListener &listener) { return listener.MatchType(ON_HEADER_RECEIVE); }) != listeners_.end(); @@ -145,14 +142,14 @@ void *EventManager::GetQueueData() bool EventManager::HasEventListener(const std::string &type) { - std::shared_lock lock(mutexForListenersAndEmitByUv_); + std::shared_lock lock(mutexForListenersAndEmitByUv_); return std::any_of(listeners_.begin(), listeners_.end(), [&type](const EventListener &listener) -> bool { return listener.MatchType(type); }); } void EventManager::DeleteListener(const std::string &type) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); + std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); listeners_.erase(it, listeners_.end()); -- Gitee From 3be8386f0b64b0bd25cddb5d72235b83aee699be Mon Sep 17 00:00:00 2001 From: HuangHaitao Date: Wed, 23 Apr 2025 09:32:24 +0000 Subject: [PATCH 032/126] =?UTF-8?q?Finalize=E6=96=B9=E6=B3=95=E8=B0=83?= =?UTF-8?q?=E7=94=A8close=E6=8A=A5socket=20fd=E4=B8=BA0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: HuangHaitao --- .../js/napi/socket/socket_module/src/socket_module.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/socket/socket_module/src/socket_module.cpp b/frameworks/js/napi/socket/socket_module/src/socket_module.cpp index 0b67ba88a..bfbcad5ed 100644 --- a/frameworks/js/napi/socket/socket_module/src/socket_module.cpp +++ b/frameworks/js/napi/socket/socket_module/src/socket_module.cpp @@ -135,7 +135,9 @@ void Finalize(napi_env, void *data, void *) if (sharedManager != nullptr && *sharedManager != nullptr) { auto manager = *sharedManager; int sock = static_cast(reinterpret_cast(manager->GetData())); - if (sock != -1) { + if (sock == 0) { + NETSTACK_LOGE("manager->GetData() got nullptr, Finalize() called before creating socket?"); + } else if (sock != -1) { SocketExec::SingletonSocketConfig::GetInstance().RemoveServerSocket(sock); close(sock); manager->SetData(reinterpret_cast(-1)); @@ -226,6 +228,7 @@ static bool SetSocket(napi_env env, napi_value thisVal, BaseContext *context, in if (manager == nullptr) { return false; } + NETSTACK_LOGD("SetSocket: sock %{public}d", sock); manager->SetData(reinterpret_cast(sock)); NapiUtils::SetInt32Property(env, thisVal, KEY_SOCKET_FD, sock); return true; @@ -367,6 +370,7 @@ static bool SetSocketManager(napi_env env, napi_value thisVal, BaseContext *cont if (manager == nullptr) { return false; } + NETSTACK_LOGD("SetSocketManager setData"); manager->SetData(reinterpret_cast(mgr)); NapiUtils::SetInt32Property(env, thisVal, KEY_SOCKET_FD, mgr->sockfd_); return true; -- Gitee From f46b1fce6ae41ba2922980040a45c63ee004ff76 Mon Sep 17 00:00:00 2001 From: l00635678 Date: Thu, 24 Apr 2025 17:23:47 +0800 Subject: [PATCH 033/126] =?UTF-8?q?=E5=A4=9A=E5=BA=94=E7=94=A8=E8=A7=A6?= =?UTF-8?q?=E5=8F=91freeze=20Signed-off-by:=20l00635678=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/napi_utils/include/event_manager.h | 2 +- utils/napi_utils/src/event_manager.cpp | 58 +++++++++++++----------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index 12eb644e6..e89679050 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -121,7 +121,7 @@ private: std::shared_mutex mutexForListenersAndEmitByUv_; std::shared_mutex dataMutex_; std::mutex dataQueueMutex_; - std::list listeners_; + std::list> listeners_; void *data_; std::queue dataQueue_; static EventManagerMagic magic_; diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 545a75411..bf48781e0 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -39,41 +39,43 @@ void EventManager::AddListener(napi_env env, const std::string &type, napi_value { std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), - [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); + [type](const std::shared_ptr &listener) -> bool { return listener->MatchType(type); }); if (it != listeners_.end()) { listeners_.erase(it, listeners_.end()); } - - listeners_.emplace_back(GetCurrentThreadId(), env, type, callback, once, asyncCallback); + auto listener = std::make_shared(GetCurrentThreadId(), env, type, callback, once, asyncCallback); + listeners_.emplace_back(std::move(listener)); } void EventManager::DeleteListener(const std::string &type, napi_value callback) { std::unique_lock lock(mutexForListenersAndEmitByUv_); - auto it = - std::remove_if(listeners_.begin(), listeners_.end(), [type, callback](const EventListener &listener) -> bool { - return listener.Match(type, callback); + auto it = std::remove_if(listeners_.begin(), listeners_.end(), + [type, callback] (const std::shared_ptr &listener) -> bool { + return listener->Match(type, callback); }); listeners_.erase(it, listeners_.end()); } void EventManager::Emit(const std::string &type, const std::pair &argv) { - std::unique_lock lock(mutexForListenersAndEmitByUv_); - std::for_each(listeners_.begin(), listeners_.end(), [type, argv](const EventListener &listener) { - if (listener.IsAsyncCallback()) { + std::shared_lock lock(mutexForListenersAndEmitByUv_); + auto listeners = listeners_; + mutexForListenersAndEmitByUv_.lock(); + std::for_each(listeners.begin(), listeners.end(), [type, argv] (const std::shared_ptr &listener) { + if (listener->IsAsyncCallback()) { /* AsyncCallback(BusinessError error, T data) */ napi_value arg[ASYNC_CALLBACK_PARAM_NUM] = {argv.first, argv.second}; - listener.Emit(type, ASYNC_CALLBACK_PARAM_NUM, arg); + listener->Emit(type, ASYNC_CALLBACK_PARAM_NUM, arg); } else { /* Callback(T data) */ napi_value arg[CALLBACK_PARAM_NUM] = {argv.second}; - listener.Emit(type, CALLBACK_PARAM_NUM, arg); + listener->Emit(type, CALLBACK_PARAM_NUM, arg); } }); - + std::unique_lock lock2(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), - [type](const EventListener &listener) -> bool { return listener.MatchOnce(type); }); + [type] (const std::shared_ptr &listener) -> bool { return listener->MatchOnce(type); }); listeners_.erase(it, listeners_.end()); } @@ -90,13 +92,14 @@ void *EventManager::GetData() void EventManager::EmitByUvWithoutCheckShared(const std::string &type, void *data, void (*Handler)(uv_work_t *, int)) { std::shared_lock lock(mutexForListenersAndEmitByUv_); - bool foundHeader = std::find_if(listeners_.begin(), listeners_.end(), [](const EventListener &listener) { - return listener.MatchType(ON_HEADER_RECEIVE); - }) != listeners_.end(); + bool foundHeader = std::find_if(listeners_.begin(), listeners_.end(), + [] (const std::shared_ptr &listener) { return listener->MatchType(ON_HEADER_RECEIVE); }) != + listeners_.end(); + + bool foundHeaders = std::find_if(listeners_.begin(), listeners_.end(), + [] (const std::shared_ptr &listener) { return listener->MatchType(ON_HEADERS_RECEIVE);}) != + listeners_.end(); - bool foundHeaders = std::find_if(listeners_.begin(), listeners_.end(), [](const EventListener &listener) { - return listener.MatchType(ON_HEADERS_RECEIVE); - }) != listeners_.end(); if (!foundHeader && !foundHeaders) { if (type == ON_HEADER_RECEIVE || type == ON_HEADERS_RECEIVE) { auto tempMap = static_cast *>(data); @@ -114,12 +117,13 @@ void EventManager::EmitByUvWithoutCheckShared(const std::string &type, void *dat } } - std::for_each(listeners_.begin(), listeners_.end(), [type, data, Handler, this](const EventListener &listener) { - if (listener.MatchType(type)) { - auto workWrapper = new UvWorkWrapperShared(data, listener.GetEnv(), type, shared_from_this()); - listener.EmitByUv(type, workWrapper, Handler); - } - }); + std::for_each(listeners_.begin(), listeners_.end(), + [type, data, Handler, this] (const std::shared_ptr &listener) { + if (listener->MatchType(type)) { + auto workWrapper = new UvWorkWrapperShared(data, listener->GetEnv(), type, shared_from_this()); + listener->EmitByUv(type, workWrapper, Handler); + } + }); } void EventManager::SetQueueData(void *data) @@ -144,14 +148,14 @@ bool EventManager::HasEventListener(const std::string &type) { std::shared_lock lock(mutexForListenersAndEmitByUv_); return std::any_of(listeners_.begin(), listeners_.end(), - [&type](const EventListener &listener) -> bool { return listener.MatchType(type); }); + [&type] (const std::shared_ptr &listener) -> bool { return listener->MatchType(type); }); } void EventManager::DeleteListener(const std::string &type) { std::unique_lock lock(mutexForListenersAndEmitByUv_); auto it = std::remove_if(listeners_.begin(), listeners_.end(), - [type](const EventListener &listener) -> bool { return listener.MatchType(type); }); + [type] (const std::shared_ptr &listener) -> bool { return listener->MatchType(type); }); listeners_.erase(it, listeners_.end()); } -- Gitee From b00e260b3371a4bb19e9f986e929c51abe8419d0 Mon Sep 17 00:00:00 2001 From: l00635678 Date: Thu, 24 Apr 2025 20:04:16 +0800 Subject: [PATCH 034/126] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00635678 --- utils/napi_utils/src/event_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index bf48781e0..6af88933b 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -61,7 +61,7 @@ void EventManager::Emit(const std::string &type, const std::pair lock(mutexForListenersAndEmitByUv_); auto listeners = listeners_; - mutexForListenersAndEmitByUv_.lock(); + mutexForListenersAndEmitByUv_.unlock(); std::for_each(listeners.begin(), listeners.end(), [type, argv] (const std::shared_ptr &listener) { if (listener->IsAsyncCallback()) { /* AsyncCallback(BusinessError error, T data) */ -- Gitee From b05003ebbc943b674adc19b1f3d4493a8af2957f Mon Sep 17 00:00:00 2001 From: l00635678 Date: Thu, 24 Apr 2025 22:39:34 +0800 Subject: [PATCH 035/126] =?UTF-8?q?=E9=94=81=E4=BC=98=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E6=95=88=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00635678 --- utils/napi_utils/src/event_manager.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 6af88933b..3eaf45f5d 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -61,7 +61,7 @@ void EventManager::Emit(const std::string &type, const std::pair lock(mutexForListenersAndEmitByUv_); auto listeners = listeners_; - mutexForListenersAndEmitByUv_.unlock(); + lock.unlock(); std::for_each(listeners.begin(), listeners.end(), [type, argv] (const std::shared_ptr &listener) { if (listener->IsAsyncCallback()) { /* AsyncCallback(BusinessError error, T data) */ @@ -247,25 +247,21 @@ bool EventManager::GetReuseAddr() std::shared_ptr EventManager::GetProxyData() { - std::unique_lock lock(dataMutex_); return proxyData_; } void EventManager::SetProxyData(std::shared_ptr data) { - std::unique_lock lock(dataMutex_); proxyData_ = data; } void EventManager::SetWebSocketUserData(const std::shared_ptr &userData) { - std::unique_lock lock(dataMutex_); webSocketUserData_ = userData; } std::shared_ptr EventManager::GetWebSocketUserData() { - std::unique_lock lock(dataMutex_); return webSocketUserData_; } -- Gitee From 235ccd788f2532a34ed9ff29c6bd42b1b97b2a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 01:56:54 +0000 Subject: [PATCH 036/126] update test/fuzztest/netsslinner_fuzzer/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/fuzztest/netsslinner_fuzzer/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzztest/netsslinner_fuzzer/BUILD.gn b/test/fuzztest/netsslinner_fuzzer/BUILD.gn index 868ca8bb1..4312aa91e 100644 --- a/test/fuzztest/netsslinner_fuzzer/BUILD.gn +++ b/test/fuzztest/netsslinner_fuzzer/BUILD.gn @@ -33,6 +33,7 @@ common_external_deps = [ "netmanager_base:net_conn_manager_if", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] ohos_fuzztest("NetsslInnerFuzzTest") { -- Gitee From 110addd94369ed50c8ee97c577cb97ce6ac48f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 01:58:10 +0000 Subject: [PATCH 037/126] update test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn b/test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn index b4a82503e..6a091da7b 100644 --- a/test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn +++ b/test/fuzztest/socket/fuzztest/socketexec_fuzzer/BUILD.gn @@ -139,6 +139,7 @@ ohos_fuzztest("SocketExecFuzzTest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ -- Gitee From 573b8d10a4a8f287bc21a16072a766fe2fff8f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 01:59:36 +0000 Subject: [PATCH 038/126] update test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn b/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn index 07ec0d369..4aa60a3db 100644 --- a/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn +++ b/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/BUILD.gn @@ -138,6 +138,7 @@ ohos_fuzztest("TlsSocketFuzzTest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ -- Gitee From b20799867834fe0aedcf1b597ba8eb761ede2868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:00:42 +0000 Subject: [PATCH 039/126] update test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn b/test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn index c1879ffc7..0b66fd172 100644 --- a/test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn +++ b/test/fuzztest/websocket/fuzztest/websocketexec_fuzzer/BUILD.gn @@ -65,6 +65,7 @@ ohos_fuzztest("WebSocketExecFuzzTest") { "libwebsockets:websockets", "napi:ace_napi", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ -- Gitee From 5f6cae6d86fbcf4caecd8bd159c3568cdb5fc7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:01:38 +0000 Subject: [PATCH 040/126] update test/unittest/tlssocket/client/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/client/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/tlssocket/client/BUILD.gn b/test/unittest/tlssocket/client/BUILD.gn index c6fa3b722..c0c291afc 100644 --- a/test/unittest/tlssocket/client/BUILD.gn +++ b/test/unittest/tlssocket/client/BUILD.gn @@ -273,6 +273,7 @@ ohos_unittest("one_way_tls_socket_certchain_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 2c9a661fee08ca7d32ee8397806aca4f5edb0723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:03:00 +0000 Subject: [PATCH 041/126] update test/unittest/tlssocket/client/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/client/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/tlssocket/client/BUILD.gn b/test/unittest/tlssocket/client/BUILD.gn index c0c291afc..4c62149b2 100644 --- a/test/unittest/tlssocket/client/BUILD.gn +++ b/test/unittest/tlssocket/client/BUILD.gn @@ -185,6 +185,7 @@ ohos_unittest("one_way_tls_socket_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 77c0fe6528d949b30337e7298ee7f285dc86a75e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:03:39 +0000 Subject: [PATCH 042/126] update test/unittest/tlssocket/client/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/client/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/tlssocket/client/BUILD.gn b/test/unittest/tlssocket/client/BUILD.gn index 4c62149b2..fe5efa366 100644 --- a/test/unittest/tlssocket/client/BUILD.gn +++ b/test/unittest/tlssocket/client/BUILD.gn @@ -564,6 +564,7 @@ ohos_unittest("socket_error_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 63b2a584021b46b3f4a3683718bcca7792f34450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:07:28 +0000 Subject: [PATCH 043/126] update test/unittest/tlssocket/client/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/client/BUILD.gn | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/unittest/tlssocket/client/BUILD.gn b/test/unittest/tlssocket/client/BUILD.gn index fe5efa366..210b1fd63 100644 --- a/test/unittest/tlssocket/client/BUILD.gn +++ b/test/unittest/tlssocket/client/BUILD.gn @@ -141,6 +141,7 @@ ohos_unittest("two_way_tls_socket_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -230,6 +231,7 @@ ohos_unittest("two_way_tls_socket_certchain_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -322,6 +324,7 @@ ohos_unittest("tls_socket_unilateral_connection") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -392,6 +395,7 @@ ohos_unittest("tls_key_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -435,6 +439,7 @@ ohos_unittest("tls_cert_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -478,6 +483,7 @@ ohos_unittest("tls_configuration_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -521,6 +527,7 @@ ohos_unittest("tls_context_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] @@ -611,6 +618,7 @@ ohos_unittest("tls_socket_branch_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 6a1c73a16218afb6b0c8f3dabba27d0681d16539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:08:04 +0000 Subject: [PATCH 044/126] update test/unittest/tlssocket/core/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/core/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/tlssocket/core/BUILD.gn b/test/unittest/tlssocket/core/BUILD.gn index f562b4fc9..b24356724 100644 --- a/test/unittest/tlssocket/core/BUILD.gn +++ b/test/unittest/tlssocket/core/BUILD.gn @@ -147,6 +147,7 @@ ohos_unittest("tls_socket_core_test") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 2543b8d686ab535f76f6546986e398670f434248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:08:42 +0000 Subject: [PATCH 045/126] update test/unittest/tlssocket/server/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/tlssocket/server/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/tlssocket/server/BUILD.gn b/test/unittest/tlssocket/server/BUILD.gn index 32fc0de3d..fdc531233 100644 --- a/test/unittest/tlssocket/server/BUILD.gn +++ b/test/unittest/tlssocket/server/BUILD.gn @@ -143,6 +143,7 @@ ohos_unittest("two_way_tls_socket_server_unittest") { "napi:ace_napi", "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ] -- Gitee From 1b31b71da94d7bb14cff1a7fbd9bd34fdd9ab583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:09:54 +0000 Subject: [PATCH 046/126] update test/unittest/websocket/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/websocket/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 961d724f7..2aadbf9eb 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -60,6 +60,7 @@ ohos_unittest("websocket_unittest") { external_deps += [ "libwebsockets:websockets", "openssl:libssl_shared", + "samgr:samgr_proxy", ] if (defined(global_parts_info) && -- Gitee From 01fbf8d0080853ac3476c08ee22a2eb02e016bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:10:18 +0000 Subject: [PATCH 047/126] update test/unittest/socket/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/socket/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/socket/BUILD.gn b/test/unittest/socket/BUILD.gn index 73dec80e5..2f864be3f 100644 --- a/test/unittest/socket/BUILD.gn +++ b/test/unittest/socket/BUILD.gn @@ -139,6 +139,7 @@ ohos_unittest("socket_unittest") { external_deps += [ "openssl:libcrypto_shared", "openssl:libssl_shared", + "samgr:samgr_proxy", ] defines = [ -- Gitee From 5724c2b712b42dc76b912d90a2c324a9814b5c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B3=BD=E5=87=A1?= Date: Fri, 25 Apr 2025 02:10:58 +0000 Subject: [PATCH 048/126] update test/unittest/http_client/BUILD.gn. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李泽凡 --- test/unittest/http_client/BUILD.gn | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unittest/http_client/BUILD.gn b/test/unittest/http_client/BUILD.gn index d98e700c3..9cff47b9f 100644 --- a/test/unittest/http_client/BUILD.gn +++ b/test/unittest/http_client/BUILD.gn @@ -57,6 +57,7 @@ ohos_unittest("http_client_unittest") { "curl:curl_shared", "googletest:gmock_main", "openssl:libssl_shared", + "samgr:samgr_proxy", ] if (defined(global_parts_info) && -- Gitee From e0fe1d4362acc4ede2a7f60c1b1f55e22774d062 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 29 Apr 2025 17:48:04 +0800 Subject: [PATCH 049/126] websocketServer Signed-off-by: wendan4 --- bundle.json | 3 +- frameworks/js/napi/websocket/BUILD.gn | 12 + .../async_work/include/websocket_async_work.h | 24 + .../async_work/src/websocket_async_work.cpp | 55 + .../websocket/constant/include/constant.h | 23 + .../napi/websocket/constant/src/constant.cpp | 16 + .../websocket_exec/include/websocket_exec.h | 121 ++ .../websocket_exec/src/websocket_exec.cpp | 1225 ++++++++++++++++- .../include/websocket_module.h | 30 +- .../websocket_module/src/websocket_module.cpp | 83 +- netstack_config.gni | 1 + .../unittest/websocket_test/WebSocketTest.cpp | 2 +- utils/BUILD.gn | 5 + .../include/netstack_common_utils.h | 3 + .../src/netstack_common_utils.cpp | 9 + utils/napi_utils/BUILD.gn | 10 + utils/napi_utils/include/event_manager.h | 37 + utils/napi_utils/src/event_manager.cpp | 78 ++ utils/napi_utils/src/module_template.cpp | 7 +- 19 files changed, 1724 insertions(+), 20 deletions(-) diff --git a/bundle.json b/bundle.json index b36133680..c648b56b7 100644 --- a/bundle.json +++ b/bundle.json @@ -25,7 +25,8 @@ "features": [ "netstack_feature_http3", "netstack_http_boringssl", - "netstack_feature_communication_http3" + "netstack_feature_communication_http3", + "netstack_websocket_server_enable" ], "adapted_system_type": [ "standard" diff --git a/frameworks/js/napi/websocket/BUILD.gn b/frameworks/js/napi/websocket/BUILD.gn index d0a6f5421..a8a4f0afd 100644 --- a/frameworks/js/napi/websocket/BUILD.gn +++ b/frameworks/js/napi/websocket/BUILD.gn @@ -27,6 +27,7 @@ ohos_shared_library("websocket") { "async_context/include", "async_work/include", "constant/include", + "utils/include", "websocket_exec/include", "websocket_module/include", ] @@ -74,6 +75,17 @@ ohos_shared_library("websocket") { defines += [ "HAS_NETMANAGER_BASE=0" ] } + if (netstack_websocket_server_enable) { + defines += [ "NETSTACK_WEBSOCKETSERVER" ] + sources += [ + "async_context/src/list_all_connections_context.cpp", + "async_context/src/server_close_context.cpp", + "async_context/src/server_send_context.cpp", + "async_context/src/server_start_context.cpp", + "async_context/src/server_stop_context.cpp", + ] + } + if (product_name != "ohos-sdk") { external_deps += [ "init:libbegetutil" ] } diff --git a/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h b/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h index ad326dfc8..738cbd5cd 100644 --- a/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h +++ b/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h @@ -30,12 +30,36 @@ public: static void ExecClose(napi_env env, void *data); +#ifdef NETSTACK_WEBSOCKETSERVER + static void ExecServerStart(napi_env env, void *data); + + static void ExecListAllConnections(napi_env env, void *data); + + static void ExecServerClose(napi_env env, void *data); + + static void ExecServerSend(napi_env env, void *data); + + static void ExecServerStop(napi_env env, void *data); +#endif + /* callback */ static void ConnectCallback(napi_env env, napi_status status, void *data); static void SendCallback(napi_env env, napi_status status, void *data); static void CloseCallback(napi_env env, napi_status status, void *data); + +#ifdef NETSTACK_WEBSOCKETSERVER + static void ServerStartCallback(napi_env env, napi_status status, void *data); + + static void ListAllConnectionsCallback(napi_env env, napi_status status, void *data); + + static void ServerCloseCallback(napi_env env, napi_status status, void *data); + + static void ServerSendCallback(napi_env env, napi_status status, void *data); + + static void ServerStopCallback(napi_env env, napi_status status, void *data); +#endif }; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_ASYNC_WORK_H */ diff --git a/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp b/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp index 07bfd9dd5..576336804 100644 --- a/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp +++ b/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp @@ -33,6 +33,33 @@ void WebSocketAsyncWork::ExecClose(napi_env env, void *data) BaseAsyncWork::ExecAsyncWork(env, data); } +#ifdef NETSTACK_WEBSOCKETSERVER +void WebSocketAsyncWork::ExecServerStart(napi_env env, void *data) +{ + BaseAsyncWork::ExecAsyncWork(env, data); +} + +void WebSocketAsyncWork::ExecListAllConnections(napi_env env, void *data) +{ + BaseAsyncWork::ExecAsyncWork(env, data); +} + +void WebSocketAsyncWork::ExecServerClose(napi_env env, void *data) +{ + BaseAsyncWork::ExecAsyncWork(env, data); +} + +void WebSocketAsyncWork::ExecServerSend(napi_env env, void *data) +{ + BaseAsyncWork::ExecAsyncWork(env, data); +} + +void WebSocketAsyncWork::ExecServerStop(napi_env env, void *data) +{ + BaseAsyncWork::ExecAsyncWork(env, data); +} +#endif + void WebSocketAsyncWork::ConnectCallback(napi_env env, napi_status status, void *data) { BaseAsyncWork::AsyncWorkCallback(env, status, data); @@ -47,4 +74,32 @@ void WebSocketAsyncWork::CloseCallback(napi_env env, napi_status status, void *d { BaseAsyncWork::AsyncWorkCallback(env, status, data); } + +#ifdef NETSTACK_WEBSOCKETSERVER +void WebSocketAsyncWork::ServerStartCallback(napi_env env, napi_status status, void *data) +{ + BaseAsyncWork::AsyncWorkCallback(env, status, data); +} + +void WebSocketAsyncWork::ListAllConnectionsCallback(napi_env env, napi_status status, void *data) +{ + BaseAsyncWork::AsyncWorkCallback(env, status, data); +} + +void WebSocketAsyncWork::ServerCloseCallback(napi_env env, napi_status status, void *data) +{ + BaseAsyncWork::AsyncWorkCallback(env, status, data); +} + +void WebSocketAsyncWork::ServerSendCallback(napi_env env, napi_status status, void *data) +{ + BaseAsyncWork::AsyncWorkCallback(env, status, data); +} + +void WebSocketAsyncWork::ServerStopCallback(napi_env env, napi_status status, void *data) +{ + BaseAsyncWork::AsyncWorkCallback(env, status, data); +} +#endif } // namespace OHOS::NetStack::Websocket diff --git a/frameworks/js/napi/websocket/constant/include/constant.h b/frameworks/js/napi/websocket/constant/include/constant.h index 9eb594058..d6b6d5f2b 100644 --- a/frameworks/js/napi/websocket/constant/include/constant.h +++ b/frameworks/js/napi/websocket/constant/include/constant.h @@ -33,6 +33,9 @@ enum WebsocketErrorCode { WEBSOCKET_ERROR_CODE_URL_ERROR = WEBSOCKET_ERROR_CODE_BASE + 1, WEBSOCKET_ERROR_CODE_FILE_NOT_EXIST = WEBSOCKET_ERROR_CODE_BASE + 2, WEBSOCKET_ERROR_CODE_CONNECT_AlREADY_EXIST = WEBSOCKET_ERROR_CODE_BASE + 3, + WEBSOCKET_ERROR_CODE_INVALID_NIC = WEBSOCKET_ERROR_CODE_BASE + 4, + WEBSOCKET_ERROR_CODE_INVALID_PORT = WEBSOCKET_ERROR_CODE_BASE + 5, + WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST = WEBSOCKET_ERROR_CODE_BASE + 6, WEBSOCKET_NOT_ALLOWED_HOST = 2302998, WEBSOCKET_UNKNOWN_OTHER_ERROR = 2302999 }; @@ -42,6 +45,9 @@ static const std::map WEBSOCKET_ERR_MAP = { {WEBSOCKET_ERROR_CODE_URL_ERROR, "Websocket url error"}, {WEBSOCKET_ERROR_CODE_FILE_NOT_EXIST, "Websocket file not exist"}, {WEBSOCKET_ERROR_CODE_CONNECT_AlREADY_EXIST, "Websocket connection exist"}, + {WEBSOCKET_ERROR_CODE_INVALID_NIC, "Can't listen to the given NIC"}, + {WEBSOCKET_ERROR_CODE_INVALID_PORT, "Can't listen to the given Port"}, + {WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST, "websocket connection does not exist"}, {WEBSOCKET_NOT_ALLOWED_HOST, "It is not allowed to access this domain"}, {WEBSOCKET_UNKNOWN_OTHER_ERROR, "Websocket Unknown Other Error"}}; @@ -92,6 +98,17 @@ public: static const char *CODE; static const char *REASON; +/* WebSocketConnection */ + static const char *CLIENT_PORT; + static const char *CLIENT_IP; + +/* WebSocketServerConfig */ + static const char *SERVER_PORT; + static const char *MAX_CLIENT_NUMBER; + static const char *MAX_CONNECTIONS_FOR_ONE_CLIENT; + static const char *SERVER_IP; + static const char *SERVER_CERT; + static const char *PROTOCOL; }; class EventName final { @@ -102,6 +119,12 @@ public: static const char *EVENT_ERROR; static const char *EVENT_DATA_END; static const char *EVENT_HEADER_RECEIVE; + +/* websocketServer */ + static const char *EVENT_SERVER_ERROR; + static const char *EVENT_SERVER_CONNECT; + static const char *EVENT_SERVER_MESSAGE_RECEIVE; + static const char *EVENT_SERVER_CLOSE; }; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_CONSTANT_H */ diff --git a/frameworks/js/napi/websocket/constant/src/constant.cpp b/frameworks/js/napi/websocket/constant/src/constant.cpp index 9b6db629f..d7605f8ca 100644 --- a/frameworks/js/napi/websocket/constant/src/constant.cpp +++ b/frameworks/js/napi/websocket/constant/src/constant.cpp @@ -23,6 +23,17 @@ const char *ContextKey::CLIENT_CERT = "clientCert"; const char *ContextKey::CERT_PATH = "certPath"; const char *ContextKey::KEY_PATH = "keyPath"; const char *ContextKey::KEY_PASSWD = "keyPassword"; +/* WebSocketConnection */ +const char *ContextKey::CLIENT_PORT = "clientPort"; +const char *ContextKey::CLIENT_IP = "clientIP"; + +/* WebSocketServerConfig */ +const char *ContextKey::SERVER_PORT = "serverPort"; +const char *ContextKey::MAX_CLIENT_NUMBER = "maxConcurrentClientsNumber"; +const char *ContextKey::MAX_CONNECTIONS_FOR_ONE_CLIENT = "maxConnectionsForOneClient"; +const char *ContextKey::SERVER_IP = "serverIP"; +const char *ContextKey::SERVER_CERT = "serverCert"; +const char *ContextKey::PROTOCOL = "protocol"; const char *ContextKey::PROXY = "proxy"; const char *ContextKey::PROTCOL = "protocol"; @@ -43,4 +54,9 @@ const char *EventName::EVENT_CLOSE = "close"; const char *EventName::EVENT_ERROR = "error"; const char *EventName::EVENT_DATA_END = "dataEnd"; const char *EventName::EVENT_HEADER_RECEIVE = "headerReceive"; +/* websocketServer */ +const char *EventName::EVENT_SERVER_ERROR = "error"; +const char *EventName::EVENT_SERVER_CONNECT = "connect"; +const char *EventName::EVENT_SERVER_MESSAGE_RECEIVE = "messageReceive"; +const char *EventName::EVENT_SERVER_CLOSE = "close"; } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h index 2340bcf39..0ae7e35b3 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h @@ -19,8 +19,29 @@ #include "close_context.h" #include "connect_context.h" #include "send_context.h" +#ifdef NETSTACK_WEBSOCKETSERVER +#include "server_start_context.h" +#include "list_all_connections_context.h" +#include "server_send_context.h" +#include "server_close_context.h" +#include "server_stop_context.h" +#include "websocket_utils.h" +#endif // NETSTACK_WEBSOCKETSERVER namespace OHOS::NetStack::Websocket { + +#ifdef NETSTACK_WEBSOCKETSERVER +struct ClientInfo { + int32_t cnt; + uint64_t lastConnectionTime; +}; + +struct WebSocketMessage { + std::string data; + WebSocketConnection connection; +}; +#endif + class WebSocketExec final { public: static bool CreatConnectInfo(ConnectContext *context, lws_context *lwsContext, @@ -32,6 +53,18 @@ public: static bool ExecClose(CloseContext *context); +#ifdef NETSTACK_WEBSOCKETSERVER + static bool ExecServerStart(ServerStartContext *context); + + static bool ExecListAllConnections(ListAllConnectionsContext *context); + + static bool ExecServerClose(ServerCloseContext *context); + + static bool ExecServerSend(ServerSendContext *context); + + static bool ExecServerStop(ServerStopContext *context); +#endif + /* async work callback */ static napi_value ConnectCallback(ConnectContext *context); @@ -41,6 +74,20 @@ public: static int LwsCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + static int lwsServerCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + +#ifdef NETSTACK_WEBSOCKETSERVER + static napi_value ServerStartCallback(ServerStartContext *context); + + static napi_value ListAllConnectionsCallback(ListAllConnectionsContext *context); + + static napi_value ServerCloseCallback(ServerCloseContext *context); + + static napi_value ServerSendCallback(ServerSendContext *context); + + static napi_value ServerStopCallback(ServerStopContext *context); +#endif + private: static bool ParseUrl(ConnectContext *context, char *prefix, size_t prefixLen, char *address, size_t addressLen, char *path, size_t pathLen, int *port); @@ -93,6 +140,80 @@ private: static void GetWebsocketProxyInfo(ConnectContext *context, std::string &host, uint32_t &port, std::string &exclusions); static void HandleRcvMessage(EventManager *manager, void *data, size_t length, bool isBinary, bool isFinal); + +#ifdef NETSTACK_WEBSOCKETSERVER + static int RaiseServerError(EventManager *manager, uint32_t httpResponse); + + static int LwsCallbackEstablished(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static int LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static int LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static void OnConnect(lws *wsi, EventManager *manager); + + static void OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, + const std::string &closeReason); + + static void OnServerMessage(lws *wsi, EventManager *manager, void *data, size_t length, + bool isBinary, bool isFinal); + + static void OnServerError(EventManager *manager, int32_t code); + + static void HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal); + + static void SetWebsocketMessage(lws *wsi, EventManager *manager, const std::string &msg, void *dataMsg); + + static bool IsOverMaxClientConns(EventManager *manager); + + static bool IsAllowedProtocol(lws *wsi); + + static bool IsAllowConnection(const std::string &clientId); + + static bool IsIpInBlacklist(const std::string &id); + + static bool IsHighFreqConnection(const std::string &id); + + static void AddBlackList(const std::string &id); + + static void UpdataClientList(const std::string &id); + + static lws* GetClientWsi(const std::string clientId); + + static uint64_t GetCurrentSecond(); + + static void CloseAllConnection(); + + static void FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, + lws_context_creation_info &info); + + static bool FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info); + + static void StartService(lws_context_creation_info &info, std::shared_ptr &manager); + + static void AddConnections(const std::string &Id, lws *wsi, std::shared_ptr &userData, + WebSocketConnection &conn); + + static void RemoveConnections(const std::string &Id, UserData &userData); + + static bool GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn); + + static std::vector GetConnections(); +#endif }; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_H */ diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index d3e683824..5168a8c0c 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include #include "constant.h" #include "napi_utils.h" @@ -31,6 +34,7 @@ #include "http_proxy.h" #include "net_conn_client.h" #endif +#define LWS_PLUGIN_STATIC static constexpr const char *PROTOCOL_DELIMITER = "//"; @@ -76,7 +80,50 @@ static constexpr const char *WEBSOCKET_SYSTEM_PREPARE_CA_PATH = "/etc/security/c static constexpr const char *WEBSOCKET_CLIENT_THREAD_RUN = "OS_NET_WSJsCli"; +#ifdef NETSTACK_WEBSOCKETSERVER +static constexpr const char *EVENT_KEY_CLIENT_PORT = "clientPort"; + +static constexpr const char *EVENT_KEY_CLIENT_IP = "clientIP"; + +static constexpr const char *EVENT_KEY_CONNECTION = "clientConnection"; + +static constexpr const char *EVENT_KEY_RESULT = "result"; + +static constexpr const char *EVENT_KEY_DATA = "data"; + +static constexpr const char *WEBSOCKET_SERVER_THREAD_RUN = "OS_NET_WSJsSer"; + +static constexpr const uint32_t MAX_CONCURRENT_CLIENTS_NUMBER = 10; + +static constexpr const uint32_t MAX_CONNECTIONS_FOR_ONE_CLIENT = 10; + +static constexpr const uint64_t ONE_MINUTE_IN_SEC = 60; + +static constexpr const int32_t MAX_CONNECTIONS_PER_MINUTE = 50; +#endif + namespace OHOS::NetStack::Websocket { + +#ifdef NETSTACK_WEBSOCKETSERVER +static std::shared_mutex wsMutex_; + +static std::shared_mutex connListMutex_; + +static std::shared_mutex blackListMutex_; + +static std::unordered_map blackList; + +static std::unordered_map clientList; + +static std::unordered_map> webSocketConnection_; + +static const lws_protocols LWS_SERVER_PROTOCOLS[] = { + {"lws_server", WebSocketExec::lwsServerCallback, 0, 0 }, + { NULL, NULL, 0, 0 }, // this line is needed +}; +#endif + static const lws_protocols LWS_PROTOCOLS[] = { {"lws-minimal-client", WebSocketExec::LwsCallback, 0, 0}, {nullptr, nullptr, 0, 0}, // this line is needed @@ -99,6 +146,38 @@ struct OnOpenClosePara { std::string message; }; +#ifdef NETSTACK_WEBSOCKETSERVER +struct CloseResult { + uint32_t code; + std::string reason; +}; + +struct ClientConnectionCloseCallback { + WebSocketConnection connection; + CloseResult closeResult; +}; + +static const lws_http_mount mount = { + NULL, + "/", + "./mount-origin", + "index.html", + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 0, + 0, + LWSMPRO_FILE, + 1, + NULL, +}; +#endif + static const std::vector WS_PREFIX = {PREFIX_WSS, PREFIX_WS}; class UserData { @@ -294,6 +373,7 @@ void RunService(std::shared_ptr userData, std::shared_ptr= 0 && !userData->IsThreadStop()) { res = lws_service(context, 0); } + NETSTACK_LOGE("lws_service stop"); lws_context_destroy(context); userData->SetContext(nullptr); manager->SetWebSocketUserData(nullptr); @@ -306,6 +386,14 @@ int WebSocketExec::RaiseError(EventManager *manager, uint32_t httpResponse) return -1; } +#ifdef NETSTACK_WEBSOCKETSERVER +int WebSocketExec::RaiseServerError(EventManager *manager, uint32_t httpResponse) +{ + OnServerError(manager, COMMON_ERROR_CODE); + return -1; +} +#endif + uint32_t WebSocketExec::GetHttpResponseFromWsi(lws *wsi) { if (wsi == nullptr) { @@ -595,15 +683,448 @@ int WebSocketExec::LwsCallback(lws *wsi, lws_callback_reasons reason, void *user {LWS_CALLBACK_PROTOCOL_DESTROY, LwsCallbackProtocolDestroy}, {LWS_CALLBACK_VHOST_CERT_AGING, LwsCallbackVhostCertAging}, }; + for (const auto dispatcher : dispatchers) { + if (dispatcher.reason == reason) { + return dispatcher.callback(wsi, reason, user, in, len); + } + } + return HttpDummy(wsi, reason, user, in, len); +} +#ifdef NETSTACK_WEBSOCKETSERVER +int WebSocketExec::lwsServerCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +{ + NETSTACK_LOGI("lws server callback reason is %{public}d", reason); + CallbackDispatcher dispatchers[] = { + {LWS_CALLBACK_ESTABLISHED, LwsCallbackEstablished}, + {LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, LwsCallbackFilterProtocolConnection}, + {LWS_CALLBACK_RECEIVE, LwsCallbackReceive}, + {LWS_CALLBACK_SERVER_WRITEABLE, LwsCallbackServerWriteable}, + {LWS_CALLBACK_WS_PEER_INITIATED_CLOSE, LwsCallbackWsPeerInitiatedCloseServer}, + {LWS_CALLBACK_CLOSED, LwsCallbackClosed}, + {LWS_CALLBACK_WSI_DESTROY, LwsCallbackWsiDestroyServer}, + {LWS_CALLBACK_PROTOCOL_DESTROY, LwsCallbackProtocolDestroyServer}, + }; for (const auto dispatcher : dispatchers) { if (dispatcher.reason == reason) { return dispatcher.callback(wsi, reason, user, in, len); } } + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketExec::LwsCallbackEstablished(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback server established"); + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } +// bind clientuserdata with wsi + lws_context* lwsContext = lws_get_context(wsi); + std::shared_ptr clientUserData; + clientUserData = std::make_shared(lwsContext); + lws_set_wsi_user(wsi, clientUserData.get()); + + std::string clientId; + WebSocketConnection connection; + bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); + if (!ret) { + NETSTACK_LOGE("GetPeerConnMsg failed"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + NETSTACK_LOGI("connection clientip=%{public}s, clientport=%{public}d", + connection.clientIP.c_str(), connection.clientPort); + AddConnections(clientId, wsi, userData, connection); + clientUserData->SetLws(wsi); + clientUserData->TriggerWritable(); + OnConnect(wsi, manager); + return HttpDummy(wsi, reason, user, in, len); +} + +bool WebSocketExec::GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn) +{ + struct sockaddr_storage addr{}; + socklen_t addrLen = sizeof(addr); + int ret = getpeername(lws_get_socket_fd(wsi), reinterpret_cast(&addr), &addrLen); + if (ret != 0) { + NETSTACK_LOGE("getpeername failed"); + return false; + } + char ipStr[INET6_ADDRSTRLEN] = {0}; + if (addr.ss_family == AF_INET) { + NETSTACK_LOGI("family is ipv4"); + auto *addrIn = reinterpret_cast(&addr); + inet_ntop(AF_INET, &addrIn->sin_addr, ipStr, sizeof(ipStr)); + uint16_t port = ntohs(addrIn->sin_port); + conn.clientPort = static_cast(port); + conn.clientIP = ipStr; + clientId = std::string(ipStr) + ":" + std::to_string(port); + } else if (addr.ss_family == AF_INET6) { + NETSTACK_LOGI("family is ipv6"); + auto *addrIn6 = reinterpret_cast(&addr); + inet_ntop(AF_INET6, &addrIn6->sin6_addr, ipStr, sizeof(ipStr)); + uint16_t port = ntohs(addrIn6->sin6_port); + conn.clientPort = static_cast(port); + conn.clientIP = ipStr; + clientId = std::string(ipStr) + ":" + std::to_string(port); + } else { + NETSTACK_LOGE("getpeer Ipv4 or Ipv6 failed"); + return false; + } + return true; +} + +bool WebSocketExec::IsOverMaxClientConns(EventManager *manager) +{ + std::vector connection = GetConnections(); + if (connection.size() >= manager->GetMaxConnClientCnt() * manager->GetMaxConnForOneClient()) { + NETSTACK_LOGE("current connections is over limit"); + return true; + } + return false; +} + +void WebSocketExec::AddConnections(const std::string &Id, lws *wsi, + std::shared_ptr &userData, WebSocketConnection &conn) +{ + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("AddConnections failed: session %s", userData->IsClosed() ? "closed" : "thread stopped"); + return; + } + { + std::unique_lock lock(wsMutex_); + webSocketConnection_[Id].first = wsi; + webSocketConnection_[Id].second = conn; + NETSTACK_LOGI("AddConnections success"); + } +} + +int WebSocketExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +{ + NETSTACK_LOGD("lws callback server closed"); + if (wsi ==nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + auto clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUserData is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + clientUserData->SetThreadStop(true); + if ((clientUserData->closeReason).empty()) { + clientUserData->Close(clientUserData->closeStatus, LINK_DOWN); + } + if (clientUserData->closeStatus == LWS_CLOSE_STATUS_NOSTATUS) { + NETSTACK_LOGE("The link is down, onError"); + OnServerError(manager, COMMON_ERROR_CODE); + } + std::string clientId; + { + std::shared_lock lock(wsMutex_); + for (auto it = webSocketConnection_.begin(); it != webSocketConnection_.end(); ++it) { + if (it->second.first == wsi) { + clientId = it->first; + } + } + } + OnServerClose(wsi, manager, clientUserData->closeStatus, clientUserData->closeReason); + RemoveConnections(clientId, *clientUserData); + if (userData->IsClosed() && webSocketConnection_.empty()) { + NETSTACK_LOGI("server service is stopped"); + userData->SetThreadStop(true); + } + return HttpDummy(wsi, reason, user, in, len); +} + +void WebSocketExec::RemoveConnections(const std::string &id, UserData &userData) +{ + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("connection list is empty"); + return; + } + { + std::unique_lock lock(wsMutex_); + if (webSocketConnection_.find(id) == webSocketConnection_.end()) { + NETSTACK_LOGE("connection list find clientId failed"); + return; + } + webSocketConnection_.erase(id); + NETSTACK_LOGI("connection erase success"); + } +} + +int WebSocketExec::LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback wsi destroy"); + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + userData->SetLws(nullptr); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketExec::LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback protocol destroy"); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketExec::LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback Server writable"); + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + // server + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + if (userData->IsThreadStop()) { + NETSTACK_LOGI("session is stopped"); + return -1; + } + // client + auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUserData is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + if (clientUserData->IsClosed()) { + NETSTACK_LOGI("client is closed, need to close"); + lws_close_reason(wsi, clientUserData->closeStatus, + reinterpret_cast(const_cast(clientUserData->closeReason.c_str())), + strlen(clientUserData->closeReason.c_str())); + return -1; + } + auto sendData = clientUserData->Pop(); + if (sendData.data == nullptr || sendData.length == 0) { + NETSTACK_LOGE("send data is empty"); + return HttpDummy(wsi, reason, user, in, len); + } + int sendLength = lws_write(wsi, reinterpret_cast(sendData.data) + LWS_SEND_BUFFER_PRE_PADDING, + sendData.length, sendData.protocol); + free(sendData.data); + NETSTACK_LOGD("lws send data length is %{public}d", sendLength); + if (!userData->IsEmpty()) { + NETSTACK_LOGE("userData is not empty"); + userData->TriggerWritable(); + } + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback ws peer initiated close"); + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + + if (in == nullptr || len < sizeof(uint16_t)) { + NETSTACK_LOGI("No close reason"); + userData->Close(LWS_CLOSE_STATUS_NORMAL, ""); + return HttpDummy(wsi, reason, user, in, len); + } + + uint16_t closeStatus = ntohs(*reinterpret_cast(in)); + std::string closeReason; + closeReason.append(reinterpret_cast(in) + sizeof(uint16_t), len - sizeof(uint16_t)); + auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + clientUserData->Close(static_cast(closeStatus), closeReason); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback filter ProtocolConnection"); + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or thread is stopped"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + if (!IsAllowedProtocol(wsi)) { + NETSTACK_LOGE("protocol is not allowed"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + /* 是否超过最大连接数 */ + if (IsOverMaxClientConns(manager)) { + NETSTACK_LOGE("current connections count is more than limit, need to close"); + return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); + } + /* 添加防止恶意连接的业务逻辑 */ + std::string clientId; + WebSocketConnection connection; + bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); + if (!ret) { + NETSTACK_LOGE("GetPeerConnMsg failed"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + if (!IsAllowConnection(clientId)) { + NETSTACK_LOGE("Rejected malicious connection"); + return RaiseError(manager, GetHttpResponseFromWsi(wsi)); + } + return HttpDummy(wsi, reason, user, in, len); +} + +bool WebSocketExec::IsAllowConnection(const std::string &clientId) +{ + if (IsIpInBlacklist(clientId)) { + NETSTACK_LOGE("clientid is in blacklist"); + return false; + } + if (IsHighFreqConnection(clientId)) { + NETSTACK_LOGE("clientid reach high frequency connection"); + AddBlackList(clientId); + return false; + } + UpdataClientList(clientId); + return true; +} + +void WebSocketExec::UpdataClientList(const std::string &id) +{ + std::shared_lock lock(connListMutex_); + auto it = clientList.find(id); + if (it == clientList.end()) { + NETSTACK_LOGI("add clientid to blacklist"); + clientList[id] = {1, GetCurrentSecond()}; + } else { + auto now = GetCurrentSecond() - it->second.lastConnectionTime; + if (now > ONE_MINUTE_IN_SEC) { + NETSTACK_LOGI("reset clientid connections cnt"); + it->second = {1, GetCurrentSecond()}; + } else { + it->second.cnt++; + } + } +} + +void WebSocketExec::AddBlackList(const std::string &id) +{ + std::shared_lock lock(blackListMutex_); + blackList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; +} + +bool WebSocketExec::IsIpInBlacklist(const std::string &id) +{ + std::shared_lock lock(blackListMutex_); + auto it = blackList.find(id); + if (it != blackList.end()) { + auto now = GetCurrentSecond(); + if (now < it->second) { + return true; + } else { + blackList.erase(it); + } + } + return false; +} + +uint64_t WebSocketExec::GetCurrentSecond() +{ + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()) + .count(); +} + +bool WebSocketExec::IsHighFreqConnection(const std::string &id) +{ + std::shared_lock lock(connListMutex_); + auto it = clientList.find(id); + if (it != clientList.end()) { + auto duration = GetCurrentSecond() - it->second.lastConnectionTime; + if (duration <= ONE_MINUTE_IN_SEC) { + return it->second.cnt > MAX_CONNECTIONS_PER_MINUTE; + } + } + return false; +} + +bool WebSocketExec::IsAllowedProtocol(lws *wsi) +{ + char requested_protocol[128] = {0}; + int32_t res = lws_hdr_copy(wsi, requested_protocol, sizeof(requested_protocol), WSI_TOKEN_PROTOCOL); + if (res < 0) { + NETSTACK_LOGE("fail to read protocol"); + return true; + } + if (strcmp(requested_protocol, "lws_server") != 0) { + NETSTACK_LOGE("Protocol mismatch: client requested: %{public}s, server expects lws_server", requested_protocol); + return true; + } + return true; +} +int WebSocketExec::LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback server receive"); + lws_context* context = lws_get_context(wsi); + EventManager* manager = static_cast(lws_context_user(context)); + auto isFinal = lws_is_final_fragment(wsi); + OnServerMessage(wsi, manager, in, len, lws_frame_is_binary(wsi), isFinal); return HttpDummy(wsi, reason, user, in, len); } +#endif void WebSocketExec::FillContextInfo(ConnectContext *context, lws_context_creation_info &info, char *proxyAds) { @@ -956,23 +1477,268 @@ static napi_value CreateBinaryMessagePara(napi_env env, void *callbackPara) return NapiUtils::GetUndefined(env); } -void WebSocketExec::OnError(EventManager *manager, int32_t code, uint32_t httpResponse) +#ifdef NETSTACK_WEBSOCKETSERVER +static napi_value CreateServerClosePara(napi_env env, void *callbackPara) { - NETSTACK_LOGI("OnError %{public}d", code); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; + auto para = reinterpret_cast(callbackPara); + auto deleter = [](const ClientConnectionCloseCallback *p) { delete p; }; + std::unique_ptr handler(para, deleter); + napi_value obj = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, obj) != napi_object) { + return NapiUtils::GetUndefined(env); } - if (!manager->HasEventListener(EventName::EVENT_ERROR)) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_ERROR); - return; + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); } - auto pair = new std::pair; - pair->first = code; - pair->second = httpResponse; - manager->EmitByUvWithoutCheckShared(EventName::EVENT_ERROR, pair, CallbackTemplate); -} - + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, para->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, para->connection.clientPort); + NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_CONNECTION, jsConn); + napi_value jsRes = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsRes) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetUint32Property(env, jsRes, EVENT_KEY_CODE, para->closeResult.code); + NapiUtils::SetStringPropertyUtf8(env, jsRes, EVENT_KEY_REASON, para->closeResult.reason); + NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_RESULT, jsConn); + return obj; +} + +static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessage* msg) +{ + napi_value jsMsg = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + return NapiUtils::GetUndefined(env); + } + void *data = nullptr; + napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(env, msg->data.size(), &data); + if (data != nullptr && NapiUtils::ValueIsArrayBuffer(env, arrayBuffer) && + memcpy_s(data, msg->data.size(), msg->data.c_str(), msg->data.size()) >= 0) { + NapiUtils::SetNamedProperty(env, jsMsg, "data", arrayBuffer); + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); + NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); + return jsMsg; + } + return NapiUtils::GetUndefined(env); +} + +static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) +{ + auto pair = reinterpret_cast> *>(callbackPara); + if (pair == nullptr) { + NETSTACK_LOGE("pair is nullptr"); + return NapiUtils::GetUndefined(env); + } + lws *wsi = pair->first; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return NapiUtils::GetUndefined(env); + } + auto &manager = pair->second; + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is nullptr"); + return NapiUtils::CreateStringUtf8(env, ""); + } + auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); + if (!msg) { + NETSTACK_LOGE("msg is nullptr"); + return NapiUtils::GetUndefined(env); + } + napi_value jsMsg = ConvertWsBinaryMessageToJs(env, msg); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + delete msg; + return NapiUtils::GetUndefined(env); + } + delete msg; + return jsMsg; +} + +static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage* msg) +{ + napi_value jsMsg = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsMsg, EVENT_KEY_DATA, msg->data); + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); + NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); + return jsMsg; +} + +static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) +{ + auto pair = reinterpret_cast> *>(callbackPara); + if (pair == nullptr) { + NETSTACK_LOGE("pair is nullptr"); + return NapiUtils::GetUndefined(env); + } + lws *wsi = pair->first; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return NapiUtils::GetUndefined(env); + } + auto &manager = pair->second; + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is nullptr"); + return NapiUtils::CreateStringUtf8(env, ""); + } + auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); + if (!msg) { + NETSTACK_LOGE("msg is nullptr"); + return NapiUtils::GetUndefined(env); + } + napi_value jsMsg = ConvertWsTextMessageToJs(env, msg); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + NETSTACK_LOGE("jsMsg is not object"); + delete msg; + return NapiUtils::GetUndefined(env); + } + delete msg; + return jsMsg; +} + +static napi_value CreateConnectPara(napi_env env, void *callbackPara) +{ + auto para = reinterpret_cast(callbackPara); + auto deleter = [](const WebSocketConnection *p) { delete p;}; + std::unique_ptr handler(para, deleter); + napi_value obj = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, obj) != napi_object) { + NETSTACK_LOGE("napi_object not found"); + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetUint32Property(env, obj, EVENT_KEY_CLIENT_PORT, para->clientPort); + NapiUtils::SetStringPropertyUtf8(env, obj, EVENT_KEY_CLIENT_IP, para->clientIP); + return obj; +} + +static napi_value CreateServerError(napi_env env, void *callbackPara) +{ + auto code = reinterpret_cast(callbackPara); + if (code == nullptr) { + NETSTACK_LOGE("code is nullptr"); + } + auto deleter = [](int32_t *p) { delete p; }; + std::unique_ptr handler(code, deleter); + napi_value err = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, err) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetInt32Property(env, err, EVENT_KEY_CODE, *code); + return err; +} + +void WebSocketExec::OnServerError(EventManager *manager, int32_t code) +{ + NETSTACK_LOGI("OnServerError %{public}d", code); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_ERROR); + if (!hasServerEventListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_ERROR); + return; + } + auto para = new int32_t(code); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); +} + +void WebSocketExec::OnConnect(lws *wsi, EventManager *manager) +{ + NETSTACK_LOGI("OnConnect enter"); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerConnectListener = manager->HasEventListener(EventName::EVENT_SERVER_CONNECT); + if (!hasServerConnectListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CONNECT); + return; + } + { + std::shared_lock lock(wsMutex_); + auto para = new WebSocketConnection; + for (auto [id, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + para->clientIP = connPair.second.clientIP; + para->clientPort = connPair.second.clientPort; + NETSTACK_LOGI("connection find ok, clientId:%{public}s", id.c_str()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CONNECT, + para, CallbackTemplate); + return; + } + } + } + NETSTACK_LOGE("not found client msg"); +} + +void WebSocketExec::OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, + const std::string &closeReason) +{ + NETSTACK_LOGI("OnServerClose %{public}u %{public}s", closeStatus, closeReason.c_str()); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerCloseListener = manager->HasEventListener(EventName::EVENT_SERVER_CLOSE); + if (!hasServerCloseListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CLOSE); + return; + } + auto conn = new ClientConnectionCloseCallback; + if (conn == nullptr) { + return; + } + conn->closeResult.code = closeStatus; + conn->closeResult.reason = closeReason; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return; + } + { + std::shared_lock lock(wsMutex_); + for (auto [id, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + conn->connection = connPair.second; + NETSTACK_LOGI("clientId: %{public}s", id.c_str()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CLOSE, + conn, CallbackTemplate); + return; + } + } + } + NETSTACK_LOGE("not found client msg"); +} +#endif + +void WebSocketExec::OnError(EventManager *manager, int32_t code, uint32_t httpResponse) +{ + NETSTACK_LOGI("OnError %{public}d", code); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + if (!manager->HasEventListener(EventName::EVENT_ERROR)) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_ERROR); + return; + } + auto pair = new std::pair; + pair->first = code; + pair->second = httpResponse; + manager->EmitByUvWithoutCheckShared(EventName::EVENT_ERROR, pair, CallbackTemplate); +} + napi_value CreateResponseHeader(napi_env env, void *callbackPara) { auto para = reinterpret_cast *>(callbackPara); @@ -1076,6 +1842,101 @@ void WebSocketExec::HandleRcvMessage(EventManager *manager, void *data, size_t l } } +#ifdef NETSTACK_WEBSOCKETSERVER +void WebSocketExec::OnServerMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal) +{ + NETSTACK_LOGD("server OnMessage %{public}d", isBinary); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_MESSAGE_RECEIVE); + if (!hasServerEventListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_MESSAGE_RECEIVE); + return; + } + if (length > INT32_MAX) { + NETSTACK_LOGE("data length too long"); + return; + } + HandleServerRcvMessage(wsi, manager, data, length, isBinary, isFinal); +} + + +void WebSocketExec::HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal) +{ + if (isBinary) { + manager->AppendWsServerBinaryData(wsi, data, length); + if (isFinal) { + const std::string &msgFromManager = manager->GetWsServerBinaryData(wsi); + auto msg = new WebSocketMessage; + if (msg == nullptr) { + return; + } + SetWebsocketMessage(wsi, manager, msgFromManager, msg); + manager->SetServerQueueData(wsi, msg); + auto callbackPara = std::make_shared>>(wsi, + manager->shared_from_this()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + CallbackTemplate); + manager->ClearWsServerBinaryData(wsi); + } + } else { + manager->AppendWsServerTextData(wsi, data, length); + if (isFinal) { + const std::string &msgFromManager = manager->GetWsServerTextData(wsi); + if (msgFromManager.empty()) { + NETSTACK_LOGE("msgFromManager is empty"); + return; + } + auto msg = new WebSocketMessage; + if (msg == nullptr) { + return; + } + SetWebsocketMessage(wsi, manager, msgFromManager, msg); + manager->SetServerQueueData(wsi, msg); + auto callbackPara = std::make_shared>>(wsi, + manager->shared_from_this()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + CallbackTemplate); + manager->ClearWsServerTextData(wsi); + } + } +} + +void WebSocketExec::SetWebsocketMessage(lws *wsi, EventManager *manager, + const std::string &msgFromManager, void *dataMsg) +{ + NETSTACK_LOGD("SetWebsocketMessage enter"); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return; + } + auto webSocketMessage = static_cast(dataMsg); + webSocketMessage->data = msgFromManager; + { + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection_ is empty"); + return; + } + for (auto [_, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + webSocketMessage->connection = connPair.second; + return; + } + } + } + NETSTACK_LOGE("not found client msgFromManager"); +} +#endif + void WebSocketExec::OnHeaderReceive(EventManager *manager, const std::map &headers) { if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -1107,4 +1968,340 @@ void WebSocketExec::GetWebsocketProxyInfo(ConnectContext *context, std::string & context->GetSpecifiedWebsocketProxy(host, port, exclusions); } } + +#ifdef NETSTACK_WEBSOCKETSERVER +bool WebSocketExec::ExecServerStart(ServerStartContext *context) +{ + NETSTACK_LOGD("websocket server start exec"); + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + if (!CommonUtils::IsValidIPV4(context->GetServerIP()) && + !CommonUtils::IsValidIPV6(context->GetServerIP())) { + NETSTACK_LOGE("IPV4 and IPV6 are not valid"); + context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_NIC); + return false; + } + if (!CommonUtils::IsValidPort(context->GetServerPort())) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_PORT); + NETSTACK_LOGE("Port is not valid"); + return false; + } + if (context->GetMaxConcurrentClientsNumber() > MAX_CONCURRENT_CLIENTS_NUMBER) { + NETSTACK_LOGE("concurrent clients number is over limit"); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + return false; + } + manager->SetMaxConnClientCnt(context->GetMaxConcurrentClientsNumber()); + if (context->GetMaxConnectionsForOneClient() > MAX_CONNECTIONS_FOR_ONE_CLIENT) { + NETSTACK_LOGE("connection number for one client is over limit"); + return false; + } + manager->SetMaxConnForOneClient(context->GetMaxConnectionsForOneClient()); + + lws_context_creation_info info = {}; + FillServerContextInfo(context, manager, info); + if (!FillServerCertPath(context, info)) { + NETSTACK_LOGE("FillServerCertPath error"); + return false; + } + StartService(info, manager); + return true; +} + +void WebSocketExec::StartService(lws_context_creation_info &info, std::shared_ptr &manager) +{ + lws_context *lwsContext = nullptr; + std::shared_ptr userData; + lwsContext = lws_create_context(&info); + userData = std::make_shared(lwsContext); + manager->SetWebSocketUserData(userData); + std::thread serviceThread(RunService, userData, manager); + +#if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) + pthread_setname_np(WEBSOCKET_SERVER_THREAD_RUN); +#else + pthread_setname_np(serviceThread.native_handle(), WEBSOCKET_SERVER_THREAD_RUN); +#endif + serviceThread.detach(); +} + +void WebSocketExec::FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, + lws_context_creation_info &info) +{ + info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; + info.port = context->GetServerPort(); + info.mounts = &mount; + info.protocols = LWS_SERVER_PROTOCOLS; + info.vhost_name = "localhost"; + info.user = manager.get(); +// maybe + info.gid = -1; + info.uid = -1; + info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; +} + +bool WebSocketExec::FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info) +{ + if (!context->certPath_.empty()) { + if (!CheckFilePath(context->certPath_) || !CheckFilePath(context->keyPath_)) { + NETSTACK_LOGE("client cert not exist"); + context->SetErrorCode(WEBSOCKET_ERROR_CODE_FILE_NOT_EXIST); + return false; + } + info.ssl_cert_filepath = context->certPath_.c_str(); + info.ssl_private_key_filepath = context->keyPath_.c_str(); + } + return true; +} + +bool WebSocketExec::ExecListAllConnections(ListAllConnectionsContext *context) +{ + NETSTACK_LOGD("ListAllConnections start exec"); + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is nullptr"); + return false; + } + + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + std::vector connection = GetConnections(); + context->SetAllConnections(connection); + NETSTACK_LOGI("ExecListAllConnections OK"); + return true; +} + +std::vector WebSocketExec::GetConnections() +{ + std::shared_lock lock(wsMutex_); + std::vector conn; + if (!webSocketConnection_.empty()) { + for (auto [_, connPair] : webSocketConnection_) { + conn.emplace_back(connPair.second); + } + } + return conn; +} + +bool WebSocketExec::ExecServerClose(ServerCloseContext *context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + if (context->GetSharedManager() == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + WebSocketConnection conn = context->GetConnection(); + if (conn.clientIP.empty()) { + NETSTACK_LOGE("connection is empty"); + return false; + } + std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); + NETSTACK_LOGI("ExecServerClose, clientID:%{public}s", clientId.c_str()); + auto wsi = GetClientWsi(clientId); + if (wsi == nullptr) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); + NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); + return false; + } + auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUser data is nullptr"); + return false; + } + if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + clientUserData->Close(static_cast(context->code), context->reason); + clientUserData->TriggerWritable(); + NETSTACK_LOGI("ExecServerClose OK"); + return true; +} + +bool WebSocketExec::ExecServerSend(ServerSendContext *context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + WebSocketConnection conn = context->GetConnection(); + if (conn.clientIP.empty()) { + NETSTACK_LOGE("connection is empty"); + return false; + } + std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); + NETSTACK_LOGI("connection clientid:%{public}s", clientId.c_str()); + auto wsi = GetClientWsi(clientId); + if (wsi == nullptr) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); + NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); + return false; + } + auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUser data is nullptr"); + return false; + } + if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + clientUserData->Push(context->data, context->length, context->protocol); + clientUserData->TriggerWritable(); + NETSTACK_LOGD("lws ts send success"); + return true; +} + +lws* WebSocketExec::GetClientWsi(const std::string clientId) +{ + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection is empty"); + return nullptr; + } + auto it = webSocketConnection_.find(clientId); + if (it == webSocketConnection_.end()) { + NETSTACK_LOGE("can't find clientId"); + return nullptr; + } + return it->second.first; +} + +bool WebSocketExec::ExecServerStop(ServerStopContext *context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is nullptr"); + return false; + } + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + CloseAllConnection(); + userData->Close(LWS_CLOSE_STATUS_GOINGAWAY, ""); + NETSTACK_LOGI("ExecServerStop OK"); + return true; +} + +void WebSocketExec::CloseAllConnection() +{ + decltype(webSocketConnection_) connListTmp; + { + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection is empty"); + return; + } + connListTmp = webSocketConnection_; + } + const char* closeReason = "server is going away"; + for (auto [id, connPair] : connListTmp) { + if (connPair.first == nullptr) { + NETSTACK_LOGE("clientId not found:%{public}s", id.c_str()); + continue; + } + auto* clientUserData = reinterpret_cast(lws_wsi_user(connPair.first)); + clientUserData->Close(LWS_CLOSE_STATUS_GOINGAWAY, closeReason); + clientUserData->TriggerWritable(); + } + NETSTACK_LOGI("CloseAllConnection OK"); +} + +napi_value WebSocketExec::ServerStartCallback(ServerStartContext *context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketExec::ListAllConnectionsCallback(ListAllConnectionsContext *context) +{ + if (context == nullptr) { + NETSTACK_LOGE("Context is null"); + return nullptr; + } + napi_value connectionsArray = NapiUtils::CreateArray(context->GetEnv(), 0); + const std::vector connections = context->GetAllConnections(); + if (connections.empty()) { + NETSTACK_LOGE("connections list is null"); + return connectionsArray; + } + uint32_t index = 0; + for (const auto &conn : connections) { + napi_value jsConn = NapiUtils::CreateObject(context->GetEnv()); + NapiUtils::SetUint32Property(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_PORT, conn.clientPort); + NapiUtils::SetStringPropertyUtf8(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_IP, conn.clientIP); + NapiUtils::SetArrayElement(context->GetEnv(), connectionsArray, index, jsConn); + ++index; + } + return connectionsArray; +} + +napi_value WebSocketExec::ServerSendCallback(ServerSendContext *context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketExec::ServerCloseCallback(ServerCloseContext *context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketExec::ServerStopCallback(ServerStopContext *context) +{ + auto manager = context->GetSharedManager(); + if (manager != nullptr) { + NETSTACK_LOGD("websocket close, delete js ref"); + manager->DeleteEventReference(context->GetEnv()); + } + return NapiUtils::GetBoolean(context->GetEnv(), true); +} +#endif } // namespace OHOS::NetStack::Websocket diff --git a/frameworks/js/napi/websocket/websocket_module/include/websocket_module.h b/frameworks/js/napi/websocket/websocket_module/include/websocket_module.h index e6632af8e..eec420f60 100644 --- a/frameworks/js/napi/websocket/websocket_module/include/websocket_module.h +++ b/frameworks/js/napi/websocket/websocket_module/include/websocket_module.h @@ -40,9 +40,31 @@ public: static napi_value Off(napi_env env, napi_callback_info info); }; +#ifdef NETSTACK_WEBSOCKETSERVER + class WebSocketServer { + public: + static constexpr const char *FUNCTION_START = "start"; + static constexpr const char *FUNCTION_LISTALLCONNECTIONS = "listAllConnections"; + static constexpr const char *FUNCTION_CLOSE = "close"; + static constexpr const char *FUNCTION_ON = "on"; + static constexpr const char *FUNCTION_OFF = "off"; + static constexpr const char *FUNCTION_SEND = "send"; + static constexpr const char *FUNCTION_STOP = "stop"; + + static napi_value Start(napi_env env, napi_callback_info info); + static napi_value ListAllConnections(napi_env env, napi_callback_info info); + static napi_value Close(napi_env env, napi_callback_info info); + static napi_value On(napi_env env, napi_callback_info info); + static napi_value Off(napi_env env, napi_callback_info info); + static napi_value Send(napi_env env, napi_callback_info info); + static napi_value Stop(napi_env env, napi_callback_info info); + }; +#endif + static constexpr const char *FUNCTION_CREATE_WEB_SOCKET = "createWebSocket"; static constexpr const char *INTERFACE_WEB_SOCKET = "WebSocket"; - + static constexpr const char *FUNCTION_CREATE_WEB_SOCKET_SERVER = "createWebSocketServer"; + static constexpr const char *INTERFACE_WEB_SOCKET_SERVER = "WebSocketServer"; static napi_value InitWebSocketModule(napi_env env, napi_value exports); private: @@ -53,6 +75,12 @@ private: static void FinalizeWebSocketInstance(napi_env env, void *data, void *hint); static void InitWebSocketProperties(napi_env env, napi_value exports); + +#ifdef NETSTACK_WEBSOCKETSERVER + static napi_value CreateWebSocketServer(napi_env env, napi_callback_info info); + + static void DefineWebSocketServerClass(napi_env env, napi_value exports); +#endif }; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_MODULE_H */ diff --git a/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp b/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp index bceed2ca4..74c78b0ce 100644 --- a/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp +++ b/frameworks/js/napi/websocket/websocket_module/src/websocket_module.cpp @@ -29,12 +29,15 @@ static std::string g_appBundleName; napi_value WebSocketModule::InitWebSocketModule(napi_env env, napi_value exports) { DefineWebSocketClass(env, exports); +#ifdef NETSTACK_WEBSOCKETSERVER + DefineWebSocketServerClass(env, exports); +#endif InitWebSocketProperties(env, exports); NapiUtils::SetEnvValid(env); std::call_once(g_isAtomicServiceFlag, []() { g_appIsAtomicService = CommonUtils::IsAtomicService(g_appBundleName); NETSTACK_LOGI("IsAtomicService bundleName is %{public}s, isAtomicService is %{public}d", - g_appBundleName.c_str(), g_appIsAtomicService); + g_appBundleName.c_str(), g_appIsAtomicService); }); auto envWrapper = new (std::nothrow)napi_env; if (envWrapper == nullptr) { @@ -50,6 +53,14 @@ napi_value WebSocketModule::CreateWebSocket(napi_env env, napi_callback_info inf return ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_WEB_SOCKET, FinalizeWebSocketInstance); } +#ifdef NETSTACK_WEBSOCKETSERVER +napi_value WebSocketModule::CreateWebSocketServer(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_WEB_SOCKET_SERVER, + FinalizeWebSocketInstance); +} +#endif + void WebSocketModule::DefineWebSocketClass(napi_env env, napi_value exports) { std::initializer_list properties = { @@ -62,10 +73,29 @@ void WebSocketModule::DefineWebSocketClass(napi_env env, napi_value exports) ModuleTemplate::DefineClass(env, exports, properties, INTERFACE_WEB_SOCKET); } +#ifdef NETSTACK_WEBSOCKETSERVER +void WebSocketModule::DefineWebSocketServerClass(napi_env env, napi_value exports) +{ + std::initializer_list properties = { + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_START, WebSocketServer::Start), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_LISTALLCONNECTIONS, WebSocketServer::ListAllConnections), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_CLOSE, WebSocketServer::Close), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_ON, WebSocketServer::On), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_OFF, WebSocketServer::Off), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_SEND, WebSocketServer::Send), + DECLARE_NAPI_FUNCTION(WebSocketServer::FUNCTION_STOP, WebSocketServer::Stop), + }; + ModuleTemplate::DefineClass(env, exports, properties, INTERFACE_WEB_SOCKET_SERVER); +} +#endif + void WebSocketModule::InitWebSocketProperties(napi_env env, napi_value exports) { std::initializer_list properties = { DECLARE_NAPI_FUNCTION(FUNCTION_CREATE_WEB_SOCKET, CreateWebSocket), +#ifdef NETSTACK_WEBSOCKETSERVER + DECLARE_NAPI_FUNCTION(FUNCTION_CREATE_WEB_SOCKET_SERVER, CreateWebSocketServer), +#endif }; NapiUtils::DefineProperties(env, exports, properties); } @@ -117,6 +147,57 @@ napi_value WebSocketModule::WebSocket::Off(napi_env env, napi_callback_info info EventName::EVENT_HEADER_RECEIVE}); } +#ifdef NETSTACK_WEBSOCKETSERVER +napi_value WebSocketModule::WebSocketServer::Start(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::InterfaceWithSharedManager( + env, info, "WebSocketServerStart", nullptr, WebSocketAsyncWork::ExecServerStart, + WebSocketAsyncWork::ServerStartCallback); +} + +napi_value WebSocketModule::WebSocketServer::ListAllConnections(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::InterfaceWithSharedManager( + env, info, "WebSocketServerListAllConnections", nullptr, WebSocketAsyncWork::ExecListAllConnections, + WebSocketAsyncWork::ListAllConnectionsCallback); +} + +napi_value WebSocketModule::WebSocketServer::Close(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::InterfaceWithSharedManager( + env, info, "WebSocketServerClose", nullptr, WebSocketAsyncWork::ExecServerClose, + WebSocketAsyncWork::ServerCloseCallback); +} + +napi_value WebSocketModule::WebSocketServer::Send(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::InterfaceWithSharedManager( + env, info, "WebSocketServerSend", nullptr, WebSocketAsyncWork::ExecServerSend, + WebSocketAsyncWork::ServerSendCallback); +} + +napi_value WebSocketModule::WebSocketServer::Stop(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::InterfaceWithSharedManager( + env, info, "WebSocketServerStop", nullptr, WebSocketAsyncWork::ExecServerStop, + WebSocketAsyncWork::ServerStopCallback); +} + +napi_value WebSocketModule::WebSocketServer::On(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::OnSharedManager(env, info, + {EventName::EVENT_SERVER_CONNECT, EventName::EVENT_SERVER_MESSAGE_RECEIVE, + EventName::EVENT_SERVER_ERROR, EventName::EVENT_SERVER_CLOSE}, false); +} + +napi_value WebSocketModule::WebSocketServer::Off(napi_env env, napi_callback_info info) +{ + return ModuleTemplate::OffSharedManager(env, info, + {EventName::EVENT_SERVER_ERROR, EventName::EVENT_SERVER_CONNECT, + EventName::EVENT_SERVER_CLOSE, EventName::EVENT_SERVER_MESSAGE_RECEIVE}); +} +#endif + static napi_module g_websocketModule = { .nm_version = 1, .nm_flags = 0, diff --git a/netstack_config.gni b/netstack_config.gni index 7a91bec1a..52dd3ffe7 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,4 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false + netstack_websocket_server_enable = false } diff --git a/test/unittest/websocket_test/WebSocketTest.cpp b/test/unittest/websocket_test/WebSocketTest.cpp index 7cb481a89..f81082d77 100644 --- a/test/unittest/websocket_test/WebSocketTest.cpp +++ b/test/unittest/websocket_test/WebSocketTest.cpp @@ -130,4 +130,4 @@ HWTEST_F(WebSocketTest, WebSocketTest008, TestSize.Level1) EXPECT_EQ(getExclusions, "www.httpbin.org"); EXPECT_EQ(ret, false); } -} // namespace \ No newline at end of file +} // namespace \ No newline at end of file diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 9ca616c7d..945683a10 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -69,6 +69,7 @@ ohos_shared_library("stack_utils_common") { "bounds_checking_function:libsec_shared", "hilog:libhilog", "hisysevent:libhisysevent", + "libwebsockets:websockets", "samgr:samgr_proxy", ] @@ -85,6 +86,10 @@ ohos_shared_library("stack_utils_common") { defines = [ "HAS_NETMANAGER_BASE=0" ] } + if (netstack_websocket_server_enable) { + defines += [ "NETSTACK_WEBSOCKETSERVER" ] + } + innerapi_tags = [ "platformsdk" ] part_name = "netstack" subsystem_name = "communication" diff --git a/utils/common_utils/include/netstack_common_utils.h b/utils/common_utils/include/netstack_common_utils.h index 3f04c6420..e8728d43a 100644 --- a/utils/common_utils/include/netstack_common_utils.h +++ b/utils/common_utils/include/netstack_common_utils.h @@ -26,6 +26,7 @@ namespace OHOS::NetStack::CommonUtils { static const std::string DOMAIN_TYPE_HTTP_REQUEST = "httpRequest"; static const std::string DOMAIN_TYPE_WEBSOCKET_REQUEST = "webSocket"; const int INVALID_IP_TYPE = -1; +const int MAX_PORT = 65535; enum SdkVersion { FIVE = 5, SIX, @@ -100,5 +101,7 @@ bool Sha256sum(unsigned char *buf, size_t buflen, std::string &digestStr); bool IsCertPubKeyInPinned(const std::string &certPubKeyDigest, const std::string &pinnedPubkey); bool IsCleartextPermitted(const std::string &url, const std::string &protocol); + +bool IsValidPort(const uint32_t &Port); } // namespace OHOS::NetStack::CommonUtils #endif /* COMMUNICATIONNETSTACK_COMMON_UTILS_H */ diff --git a/utils/common_utils/src/netstack_common_utils.cpp b/utils/common_utils/src/netstack_common_utils.cpp index c86542433..4e0c1f25e 100644 --- a/utils/common_utils/src/netstack_common_utils.cpp +++ b/utils/common_utils/src/netstack_common_utils.cpp @@ -603,4 +603,13 @@ bool IsCleartextPermitted(const std::string &url, const std::string &protocol) #endif return isCleartextPermitted; } + +bool IsValidPort(const uint32_t &port) +{ + if (port < 0 || port > MAX_PORT) + { + return false; + } + return true; +} } // namespace OHOS::NetStack::CommonUtils \ No newline at end of file diff --git a/utils/napi_utils/BUILD.gn b/utils/napi_utils/BUILD.gn index 4d916b8c6..143548195 100644 --- a/utils/napi_utils/BUILD.gn +++ b/utils/napi_utils/BUILD.gn @@ -55,6 +55,8 @@ ohos_static_library("napi_utils") { "napi:ace_napi", ] + public_external_deps = [ "libwebsockets:websockets" ] + if (defined(global_parts_info) && defined(global_parts_info.communication_netmanager_base) && global_parts_info.communication_netmanager_base && is_ohos && @@ -64,6 +66,10 @@ ohos_static_library("napi_utils") { } else { defines = [ "HAS_NETMANAGER_BASE=0" ] } + + if (netstack_websocket_server_enable) { + defines += [ "NETSTACK_WEBSOCKETSERVER" ] + } } ohos_static_library("napi_utils_static") { @@ -99,6 +105,10 @@ ohos_static_library("napi_utils_static") { defines = [ "HAS_NETMANAGER_BASE=0" ] } + if (netstack_websocket_server_enable) { + defines += [ "NETSTACK_WEBSOCKETSERVER" ] + } + if (current_os == "ohos") { public_deps = [ "$NETSTACK_DIR/utils:stack_utils_common" ] external_deps += [ diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index e89679050..30626d6b2 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -31,6 +31,7 @@ #include "event_listener.h" #include "napi/native_api.h" #include "uv.h" +#include "libwebsockets.h" namespace OHOS::NetStack { static constexpr const uint32_t EVENT_MANAGER_MAGIC_NUMBER = 0x86161616; @@ -79,6 +80,12 @@ public: void *GetQueueData(); +#ifdef NETSTACK_WEBSOCKETSERVER + void SetServerQueueData(lws *wsi, void *data); + + void *GetServerQueueData(lws *wsi); +#endif + void CreateEventReference(napi_env env, napi_value value); void DeleteEventReference(napi_env env); @@ -117,6 +124,27 @@ public: void SetProxyData(std::shared_ptr data); +#ifdef NETSTACK_WEBSOCKETSERVER + const std::string &GetWsServerBinaryData(lws *wsi); + + const std::string &GetWsServerTextData(lws *wsi); + + void AppendWsServerBinaryData(lws *wsi, void *data, size_t length); + + void AppendWsServerTextData(lws *wsi, void *data, size_t length); + + void ClearWsServerBinaryData(lws *wsi); + + void ClearWsServerTextData(lws *wsi); + + void SetMaxConnClientCnt(const uint32_t &cnt); + + void SetMaxConnForOneClient(const uint32_t &cnt); + + [[nodiscard]] uint32_t GetMaxConnClientCnt() const; + + [[nodiscard]] uint32_t GetMaxConnForOneClient() const; +#endif private: std::shared_mutex mutexForListenersAndEmitByUv_; std::shared_mutex dataMutex_; @@ -136,6 +164,14 @@ private: std::atomic_bool isReuseAddr_ = false; std::shared_ptr webSocketUserData_; std::shared_ptr proxyData_; +#ifdef NETSTACK_WEBSOCKETSERVER + std::shared_mutex dataServerQueueMutex_; + std::unordered_map> serverDataQueue_; + std::unordered_map wsServerBinaryData_; + std::unordered_map wsServerTextData_; + uint32_t maxConnClientCnt_; + uint32_t maxConnForOneClient_; +#endif public: struct { @@ -149,6 +185,7 @@ private: [[maybe_unused]] std::mutex mutexForEmitAndEmitByUv_; [[maybe_unused]] std::mutex dataMutex_; [[maybe_unused]] std::mutex dataQueueMutex_; + [[maybe_unused]] std::shared_mutex dataServerQueueMutex_; [[maybe_unused]] std::list listeners_; [[maybe_unused]] void *data_ = nullptr; [[maybe_unused]] std::queue dataQueue_; diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index 3eaf45f5d..c3cbf167d 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -144,6 +144,32 @@ void *EventManager::GetQueueData() return nullptr; } +#ifdef NETSTACK_WEBSOCKETSERVER +void EventManager::SetServerQueueData(lws *wsi, void *data) +{ + std::unique_lock lock(dataServerQueueMutex_); + serverDataQueue_[wsi].push(data); +} + +void *EventManager::GetServerQueueData(lws *wsi) +{ + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return nullptr; + } + { + std::shared_lock lock(dataServerQueueMutex_); + if (serverDataQueue_.empty() || serverDataQueue_.find(wsi) == serverDataQueue_.end()) { + NETSTACK_LOGE("eventManager server data queue is empty"); + return nullptr; + } + auto data = serverDataQueue_[wsi].front(); + serverDataQueue_[wsi].pop(); + return data; + } +} +#endif + bool EventManager::HasEventListener(const std::string &type) { std::shared_lock lock(mutexForListenersAndEmitByUv_); @@ -207,6 +233,58 @@ void EventManager::AppendWebSocketBinaryData(void *data, size_t length) webSocketBinaryData_.append(reinterpret_cast(data), length); } +#ifdef NETSTACK_WEBSOCKETSERVER +const std::string &EventManager::GetWsServerBinaryData(lws *wsi) +{ + return wsServerBinaryData_[wsi]; +} + +const std::string &EventManager::GetWsServerTextData(lws *wsi) +{ + return wsServerTextData_[wsi]; +} + +void EventManager::AppendWsServerBinaryData(lws *wsi, void *data, size_t length) +{ + wsServerBinaryData_[wsi].append(reinterpret_cast(data), length); +} + +void EventManager::AppendWsServerTextData(lws *wsi, void *data, size_t length) +{ + wsServerTextData_[wsi].append(reinterpret_cast(data), length); +} + +void EventManager::ClearWsServerBinaryData(lws *wsi) +{ + wsServerBinaryData_[wsi].clear(); +} + +void EventManager::ClearWsServerTextData(lws *wsi) +{ + wsServerTextData_[wsi].clear(); +} + +void EventManager::SetMaxConnClientCnt(const uint32_t &cnt) +{ + maxConnClientCnt_ = cnt; +} + +void EventManager::SetMaxConnForOneClient(const uint32_t &cnt) +{ + maxConnForOneClient_ = cnt; +} + +uint32_t EventManager::GetMaxConnClientCnt() const +{ + return maxConnClientCnt_; +} + +uint32_t EventManager::GetMaxConnForOneClient() const +{ + return maxConnForOneClient_; +} +#endif + void EventManager::ClearWebSocketTextData() { webSocketTextData_.clear(); diff --git a/utils/napi_utils/src/module_template.cpp b/utils/napi_utils/src/module_template.cpp index 6da72fe95..41b665e72 100644 --- a/utils/napi_utils/src/module_template.cpp +++ b/utils/napi_utils/src/module_template.cpp @@ -31,6 +31,7 @@ static constexpr const char *INTERFACE_LOCAL_SOCKET = "LocalSocket"; static constexpr const char *INTERFACE_TLS_SOCKET = "TLSSocket"; static constexpr const char *INTERFACE_WEB_SOCKET = "WebSocket"; static constexpr const char *INTERFACE_HTTP_REQUEST = "OHOS_NET_HTTP_HttpRequest"; +static constexpr const char *INTERFACE_WEB_SOCKET_SERVER = "WebSocketServer"; napi_value OnManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list &events, bool asyncCallback) @@ -334,7 +335,8 @@ napi_value NewInstanceWithManagerWrapper(napi_env env, napi_callback_info info, auto manager = std::make_shared(); wrapper->sharedManager = manager; if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || - className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET) { + className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET || + className == INTERFACE_WEB_SOCKET_SERVER) { NETSTACK_LOGD("create reference for %{public}s", className.c_str()); manager->CreateEventReference(env, thisVal); } @@ -366,7 +368,8 @@ napi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, c auto manager = std::make_shared(); *sharedManager = manager; if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || - className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET) { + className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET || + className == INTERFACE_WEB_SOCKET_SERVER) { NETSTACK_LOGD("create reference for %{public}s", className.c_str()); manager->CreateEventReference(env, thisVal); } -- Gitee From 34b209ed31978d921e5814c4e07c791d71c8b787 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 29 Apr 2025 19:31:52 +0800 Subject: [PATCH 050/126] add nullptr check Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- frameworks/cj/http/src/net_http_client_exec.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frameworks/cj/http/src/net_http_client_exec.cpp b/frameworks/cj/http/src/net_http_client_exec.cpp index a06d54f05..fec790ad5 100644 --- a/frameworks/cj/http/src/net_http_client_exec.cpp +++ b/frameworks/cj/http/src/net_http_client_exec.cpp @@ -617,6 +617,10 @@ static int VerifyCallback(int preverifyOk, X509_STORE_CTX *ctx) SSL_CTX *sslctx = SSL_get_SSL_CTX(ssl); RequestContext *requestContext = static_cast(SSL_CTX_get_ex_data(sslctx, SSL_CTX_EX_DATA_REQUEST_CONTEXT_INDEX)); + if (requestContext == nullptr) { + NETSTACK_LOGE("creat requestContext instance failed"); + return 0; + } if (requestContext->IsRootCaVerifiedOk()) { // root CA hash verified, normal procedure. return preverifyOk; -- Gitee From 81dbe6ea595ec73824341f09abe30638e860140f Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 29 Apr 2025 19:45:12 +0800 Subject: [PATCH 051/126] websocketServer Signed-off-by: wendan4 --- .../include/list_all_connections_context.h | 54 ++++ .../include/server_close_context.h | 64 +++++ .../include/server_send_context.h | 69 +++++ .../include/server_start_context.h | 94 +++++++ .../include/server_stop_context.h | 47 ++++ .../src/list_all_connections_context.cpp | 84 ++++++ .../src/server_close_context.cpp | 203 ++++++++++++++ .../async_context/src/server_send_context.cpp | 242 ++++++++++++++++ .../src/server_start_context.cpp | 264 ++++++++++++++++++ .../async_context/src/server_stop_context.cpp | 76 +++++ .../js/napi/websocket/utils/websocket_utils.h | 30 ++ 11 files changed, 1227 insertions(+) create mode 100644 frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h create mode 100644 frameworks/js/napi/websocket/async_context/include/server_close_context.h create mode 100644 frameworks/js/napi/websocket/async_context/include/server_send_context.h create mode 100644 frameworks/js/napi/websocket/async_context/include/server_start_context.h create mode 100644 frameworks/js/napi/websocket/async_context/include/server_stop_context.h create mode 100644 frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp create mode 100644 frameworks/js/napi/websocket/async_context/src/server_close_context.cpp create mode 100644 frameworks/js/napi/websocket/async_context/src/server_send_context.cpp create mode 100644 frameworks/js/napi/websocket/async_context/src/server_start_context.cpp create mode 100644 frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp create mode 100644 frameworks/js/napi/websocket/utils/websocket_utils.h diff --git a/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h new file mode 100644 index 000000000..b236205ee --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_LISTALLCONNECTIONS_CONTEXT_H +#define COMMUNICATIONNETSTACK_LISTALLCONNECTIONS_CONTEXT_H + +#include "base_context.h" +#include "libwebsockets.h" +#include "websocket_utils.h" +#include "nocopyable.h" + +namespace OHOS::NetStack::Websocket +{ + class ListAllConnectionsContext final : public BaseContext + { + public: + DISALLOW_COPY_AND_MOVE(ListAllConnectionsContext); + + ListAllConnectionsContext() = delete; + + ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager); + + ~ListAllConnectionsContext() override; + + void ParseParams(napi_value *params, size_t paramsCount) override; + + void SetAllConnections(std::vector &connections); + + [[nodiscard]] std::vector GetAllConnections() const; + + [[nodiscard]] int32_t GetErrorCode() const override; + + [[nodiscard]] std::string GetErrorMessage() const override; + + private: + bool CheckParamsType(napi_value *params, size_t paramsCount); + + std::vector webSocketConnections_; + }; +} // namespace OHOS::NetStack::Websocket + +#endif /* COMMUNICATIONNETSTACK_LISTALLCONNECTIONS_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_close_context.h b/frameworks/js/napi/websocket/async_context/include/server_close_context.h new file mode 100644 index 000000000..d9521cc83 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/include/server_close_context.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_SERVER_CLOSE_CONTEXT_H +#define COMMUNICATIONNETSTACK_SERVER_CLOSE_CONTEXT_H + +#include +#include "base_context.h" +#include "websocket_utils.h" +#include "nocopyable.h" + +namespace OHOS::NetStack::Websocket +{ + class ServerCloseContext final : public BaseContext + { + public: + DISALLOW_COPY_AND_MOVE(ServerCloseContext); + + ServerCloseContext() = delete; + + ServerCloseContext(napi_env env, const std::shared_ptr &manager); + + ~ServerCloseContext() override; + + void ParseParams(napi_value *params, size_t paramsCount) override; + + bool HandleParseConnection(napi_env env, napi_value params); + + bool HandleParseCloseOption(napi_env env, napi_value params); + + [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; + + [[nodiscard]] int32_t GetErrorCode() const override; + + [[nodiscard]] std::string GetErrorMessage() const override; + + uint32_t code; + + std::string reason; + + WebSocketConnection connection; + + private: + bool CheckParamsType(napi_value *params, size_t paramsCount); + + bool IsValidWebsocketConnection(napi_env env, napi_value params); + + bool IsValidCloseOptions(napi_env env, napi_value params); + }; +} // namespace OHOS::NetStack::Websocket + +#endif /* COMMUNICATIONNETSTACK_SERVER_CLOSE_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_send_context.h b/frameworks/js/napi/websocket/async_context/include/server_send_context.h new file mode 100644 index 000000000..9859b1ca8 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/include/server_send_context.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_SERVER_SEND_CONTEXT_H +#define COMMUNICATIONNETSTACK_SERVER_SEND_CONTEXT_H + +#include +#include "libwebsockets.h" +#include "base_context.h" +#include "websocket_utils.h" +#include "nocopyable.h" + +namespace OHOS::NetStack::Websocket +{ + class ServerSendContext final : public BaseContext + { + public: + DISALLOW_COPY_AND_MOVE(ServerSendContext); + + ServerSendContext() = delete; + + ServerSendContext(napi_env env, const std::shared_ptr &manager); + + ~ServerSendContext() override; + + void ParseParams(napi_value *params, size_t paramsCount) override; + + bool HandleParseString(napi_value *params); + + bool HandleParseArrayBuffer(napi_value *params); + + bool HandleParseConnection(napi_env env, napi_value params); + + void SetClientWebSocketConn(uint32_t &port, std::string &ip); + + [[nodiscard]] int32_t GetErrorCode() const override; + + [[nodiscard]] std::string GetErrorMessage() const override; + + [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; + + void *data; + + size_t length; + + lws_write_protocol protocol; + + OHOS::NetStack::Websocket::WebSocketConnection connection; + + private: + bool CheckParamsType(napi_value *params, size_t paramsCount); + + bool IsValidWebsocketConnection(napi_env env, napi_value params); + }; +} // namespace OHOS::NetStack::Websocket + +#endif \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_start_context.h b/frameworks/js/napi/websocket/async_context/include/server_start_context.h new file mode 100644 index 000000000..5f0e44762 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/include/server_start_context.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_SERVER_START_CONTEXT_H +#define COMMUNICATIONNETSTACK_SERVER_START_CONTEXT_H + +#include + +#include "base_context.h" +#include "libwebsockets.h" +#include "nocopyable.h" + +namespace OHOS::NetStack::Websocket +{ + class ServerStartContext final : public BaseContext + { + public: + DISALLOW_COPY_AND_MOVE(ServerStartContext); + + ServerStartContext() = delete; + + ServerStartContext(napi_env env, const std::shared_ptr &sharedManager); + + ~ServerStartContext() override; + + void ParseParams(napi_value *params, size_t paramsCount) override; + + void SetServerIP(std::string &ip); + + [[nodiscard]] std::string GetServerIP() const; + + void SetServerPort(uint32_t &serverPort); + + [[nodiscard]] uint32_t GetServerPort() const; + + void SetServerCert(std::string &certPath, std::string &keyPath); + + void GetServerCert(std::string &certPath, std::string &keyPath) const; + + void SetMaxConcurrentClientsNumber(uint32_t &clientsNumber); + + [[nodiscard]] uint32_t GetMaxConcurrentClientsNumber() const; + + void SetServerProtocol(std::string &protocol); + + [[nodiscard]] std::string GetServerProtocol() const; + + void SetMaxConnectionsForOneClient(uint32_t &count); + + [[nodiscard]] uint32_t GetMaxConnectionsForOneClient() const; + + [[nodiscard]] int32_t GetErrorCode() const override; + + [[nodiscard]] std::string GetErrorMessage() const override; + + std::string serverIp_; + + uint32_t serverPort_; + + std::string certPath_; + + std::string keyPath_; + + uint32_t maxClientsNumber_; + + std::string websocketServerProtocol_; + + uint32_t maxCountForOneClient_; + + private: + bool CheckParamsType(napi_value *params, size_t paramsCount); + + void ParseCallback(napi_value const *params, size_t paramsCount); + + bool ParseRequiredParams(napi_env env, napi_value params); + + void ParseOptionalParams(napi_env env, napi_value params); + + void ParseServerCert(napi_env env, napi_value params); + }; +} // namespace OHOS::NetStack::Websocket +#endif /* COMMUNICATIONNETSTACK_SERVER_START_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_stop_context.h b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h new file mode 100644 index 000000000..01f5788c3 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_SERVER_STOP_CONTEXT_H +#define COMMUNICATIONNETSTACK_SERVER_STOP_CONTEXT_H + +#include +#include "base_context.h" +#include "nocopyable.h" + +namespace OHOS::NetStack::Websocket +{ + class ServerStopContext final : public BaseContext + { + public: + DISALLOW_COPY_AND_MOVE(ServerStopContext); + + ServerStopContext() = delete; + + ServerStopContext(napi_env env, const std::shared_ptr &manager); + + ~ServerStopContext() override; + + void ParseParams(napi_value *params, size_t paramsCount) override; + + [[nodiscard]] int32_t GetErrorCode() const override; + + [[nodiscard]] std::string GetErrorMessage() const override; + + private: + bool CheckParamsType(napi_value *params, size_t paramsCount); + }; +} // namespace OHOS::NetStack::Websocket + +#endif /* COMMUNICATIONNETSTACK_SERVER_STOP_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp b/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp new file mode 100644 index 000000000..24d1d31ee --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "list_all_connections_context.h" +#include "constant.h" +#include "netstack_log.h" +#include "napi_utils.h" + +namespace OHOS::NetStack::Websocket +{ + ListAllConnectionsContext::ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} + + ListAllConnectionsContext::~ListAllConnectionsContext() = default; + + void ListAllConnectionsContext::ParseParams(napi_value *params, size_t paramsCount) + { + if (!CheckParamsType(params, paramsCount)) + { + return; + } + if (paramsCount != FUNCTION_PARAM_ZERO) + { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; + } + SetParseOK(true); + } + + bool ListAllConnectionsContext::CheckParamsType(napi_value *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_ZERO) + { + return true; + } + return false; + } + + void ListAllConnectionsContext::SetAllConnections(std::vector + &connections) + { + webSocketConnections_ = connections; + } + + std::vector ListAllConnectionsContext::GetAllConnections() const + { + return webSocketConnections_; + } + + int32_t ListAllConnectionsContext::GetErrorCode() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_CODE; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; + } + + std::string ListAllConnectionsContext::GetErrorMessage() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + return {}; + } +} // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp new file mode 100644 index 000000000..e42819938 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "server_close_context.h" +#include "constant.h" +#include "netstack_common_utils.h" +#include "netstack_log.h" +#include "napi_utils.h" + +namespace OHOS::NetStack::Websocket +{ + ServerCloseContext::ServerCloseContext(napi_env env, const std::shared_ptr &manager) + : BaseContext(env, manager), code(CLOSE_REASON_NORMAL_CLOSE), reason("CLOSE_NORMAL"), connection() {} + + ServerCloseContext::~ServerCloseContext() = default; + + void ServerCloseContext::ParseParams(napi_value *params, size_t paramsCount) + { + if (!CheckParamsType(params, paramsCount)) + { + NETSTACK_LOGE("ServerCloseContext Parse Failed"); + if (paramsCount == FUNCTION_PARAM_ONE) + { + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_function) + { + SetCallback(params[0]); + } + return; + } + + if (paramsCount == FUNCTION_PARAM_TWO) + { + if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_function) + { + SetCallback(params[1]); + } + return; + } + return; + } + + if (paramsCount == FUNCTION_PARAM_ONE) + { + NETSTACK_LOGI("paramsCount is one"); + if (!HandleParseConnection(GetEnv(), params[0])) + { + return; + } + } + + if (paramsCount == FUNCTION_PARAM_TWO) + { + NETSTACK_LOGI("paramsCount is two"); + if (!HandleParseConnection(GetEnv(), params[0])) + { + return; + } + if (!HandleParseCloseOption(GetEnv(), params[1])) + { + return; + } + } + NETSTACK_LOGI("ServerCloseContext Parse OK"); + return SetParseOK(true); + } + + bool ServerCloseContext::HandleParseConnection(napi_env env, napi_value params) + { + NETSTACK_LOGI("HandleParseConnection enter"); + if (NapiUtils::GetValueType(env, params) == napi_object) + { + connection.clientPort = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); + if (connection.clientPort == 0) + { + NETSTACK_LOGE("parse clientPort failed"); + } + connection.clientIP = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); + if (connection.clientIP == "") + { + NETSTACK_LOGE("parse clientIP failed"); + } + return true; + } + return false; + } + + bool ServerCloseContext::HandleParseCloseOption(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) == napi_object) + { + uint32_t closeCode = NapiUtils::GetUint32Property(env, params, ContextKey::CODE); + if (closeCode >= CLOSE_REASON_NORMAL_CLOSE && closeCode <= CLOSE_REASON_RESERVED12) + { + code = closeCode; + } + std::string tempReason = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::REASON); + if (!tempReason.empty()) + { + reason = tempReason; + } + return true; + } + return false; + } + + bool ServerCloseContext::CheckParamsType(napi_value *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_ONE) + { + NETSTACK_LOGI("paramsCount one"); + return IsValidWebsocketConnection(GetEnv(), params[0]); + } + + if (paramsCount == FUNCTION_PARAM_TWO) + { + NETSTACK_LOGI("paramsCount two"); + return IsValidWebsocketConnection(GetEnv(), params[0]) && + IsValidCloseOptions(GetEnv(), params[1]); + } + return false; + } + + bool ServerCloseContext::IsValidWebsocketConnection(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) != napi_object) + { + return false; + } + return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, + ContextKey::CLIENT_IP)) == napi_string); + } + + bool ServerCloseContext::IsValidCloseOptions(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) != napi_object) + { + return false; + } + return NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CODE)) == napi_number && + NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::REASON)) == napi_string; + } + + WebSocketConnection ServerCloseContext::GetConnection() const + { + return connection; + } + + int32_t ServerCloseContext::GetErrorCode() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_CODE; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_CODE; + } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) + { + return err; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; + } + + std::string ServerCloseContext::GetErrorMessage() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_MSG; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + return {}; + } +} // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp new file mode 100644 index 000000000..0fa0a4090 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "server_send_context.h" + +#include "constant.h" +#include "netstack_log.h" +#include "napi_utils.h" +#include "securec.h" + +static constexpr size_t MAX_LIMIT = 5 * 1024 * 1024; +namespace OHOS::NetStack::Websocket +{ + ServerSendContext::ServerSendContext(napi_env env, const std::shared_ptr &manager) + : BaseContext(env, manager), data(nullptr), length(0), protocol(LWS_WRITE_TEXT), connection() {} + + ServerSendContext::~ServerSendContext() = default; + + void ServerSendContext::ParseParams(napi_value *params, size_t paramsCount) + { + if (!CheckParamsType(params, paramsCount)) + { + NETSTACK_LOGE("SendContext Parse Failed"); + if (paramsCount == FUNCTION_PARAM_ONE) + { + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object) + { + SetCallback(params[0]); + } + return; + } + + if (paramsCount == FUNCTION_PARAM_TWO) + { + if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_object) + { + SetCallback(params[1]); + } + return; + } + return; + } + + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string) + { + if (!HandleParseString(params)) + { + NETSTACK_LOGI("HandleParseString fail"); + return; + } + } + else + { + if (!HandleParseArrayBuffer(params)) + { + NETSTACK_LOGI("HandleParseArrayBuffer fail"); + return; + } + } + + if (!HandleParseConnection(GetEnv(), params[1])) + { + return; + } + NETSTACK_LOGD("SendContext SetParseOK"); + return SetParseOK(true); + } + + bool ServerSendContext::CheckParamsType(napi_value *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_TWO) + { + return (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string || + NapiUtils::ValueIsArrayBuffer(GetEnv(), params[0])) && + IsValidWebsocketConnection(GetEnv(), params[1]); + } + return false; + } + + bool ServerSendContext::IsValidWebsocketConnection(napi_env env, napi_value params) + { + NETSTACK_LOGI("IsValidWebsocketConnection enter"); + if (NapiUtils::GetValueType(env, params) != napi_object) + { + return false; + } + return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, + ContextKey::CLIENT_IP)) == napi_string); + } + + bool ServerSendContext::HandleParseString(napi_value *params) + { + NETSTACK_LOGI("Server SendContext data is String"); + std::string str = NapiUtils::GetStringFromValueUtf8(GetEnv(), params[0]); + // must have PRE and POST + size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + str.length() + LWS_SEND_BUFFER_POST_PADDING; + if (dataLen == 0 || dataLen > MAX_LIMIT) + { + NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); + return false; + } + data = malloc(dataLen); + if (data == nullptr) + { + NETSTACK_LOGE("no memory"); + return false; + } + if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), + str.length(), str.c_str(), str.length()) < 0) + { + NETSTACK_LOGE("copy failed"); + free(data); + return false; + } + length = str.length(); + protocol = LWS_WRITE_TEXT; + return true; + } + + bool ServerSendContext::HandleParseArrayBuffer(napi_value *params) + { + NETSTACK_LOGI("ServerSendContext data is ArrayBuffer"); + size_t len = 0; + void *mem = NapiUtils::GetInfoFromArrayBufferValue(GetEnv(), params[0], &len); + if (mem == nullptr || len == 0) + { + NETSTACK_LOGE("no memory"); + return false; + } + // must have PRE and POST + size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING; + if (dataLen == 0 || dataLen > MAX_LIMIT) + { + NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); + return false; + } + data = malloc(dataLen); + if (data == nullptr) + { + NETSTACK_LOGE("no memory"); + return false; + } + if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), len, mem, + len) < 0) + { + NETSTACK_LOGE("copy failed"); + free(data); + return false; + } + length = len; + protocol = LWS_WRITE_BINARY; + return true; + } + + bool ServerSendContext::HandleParseConnection(napi_env env, napi_value params) + { + NETSTACK_LOGI("parse websocketconnection enter"); + if (NapiUtils::GetValueType(env, params) == napi_object) + { + uint32_t port = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); + if (port == 0) + { + NETSTACK_LOGE("parse clientPort error"); + } + std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); + if (ip == "") + { + NETSTACK_LOGE("parse clientIP error"); + } + SetClientWebSocketConn(port, ip); + return true; + } + return false; + } + + void ServerSendContext::SetClientWebSocketConn(uint32_t &port, std::string &ip) + { + connection.clientPort = port; + connection.clientIP = ip; + } + + WebSocketConnection ServerSendContext::GetConnection() const + { + return connection; + } + + int32_t ServerSendContext::GetErrorCode() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_CODE; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_CODE; + } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) + { + return err; + } + return WEBSOCKET_CONNECT_FAILED; + } + + std::string ServerSendContext::GetErrorMessage() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_MSG; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + return {}; + } +} // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp new file mode 100644 index 000000000..444350813 --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "server_start_context.h" +#include "constant.h" +#include "netstack_log.h" +#include "napi_utils.h" + +namespace OHOS::NetStack::Websocket +{ + ServerStartContext::ServerStartContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} + + ServerStartContext::~ServerStartContext() = default; + + void ServerStartContext::ParseParams(napi_value *params, size_t paramsCount) + { + if (!CheckParamsType(params, paramsCount)) + { + ParseCallback(params, paramsCount); + return; + } + + if (paramsCount != FUNCTION_PARAM_ONE) + { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; + } + + napi_env env = GetEnv(); + if (!ParseRequiredParams(env, params[0])) + { + return; + } + ParseOptionalParams(env, params[0]); + SetParseOK(true); + } + + bool ServerStartContext::CheckParamsType(napi_value *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_ZERO) + { + return true; + } + + if (paramsCount == FUNCTION_PARAM_ONE) + { + return NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object; + } + + return false; + } + + void ServerStartContext::ParseCallback(napi_value const *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_ZERO) + { + return; + } + if (paramsCount == FUNCTION_PARAM_ONE) + { + if (NapiUtils::GetValueType(GetEnv(), params[FUNCTION_PARAM_ONE - 1]) == napi_object) + { + SetCallback(params[FUNCTION_PARAM_ONE - 1]); + } + return; + } + } + + bool ServerStartContext::ParseRequiredParams(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) != napi_object) + { + NETSTACK_LOGE("js type error"); + return false; + } + uint32_t serverPort = NapiUtils::GetUint32Property(env, params, ContextKey::SERVER_PORT); + if (serverPort == 0) + { + NETSTACK_LOGE("%{public}s not found", ContextKey::SERVER_PORT); + } + SetServerPort(serverPort); + uint32_t maxClientCnt = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CLIENT_NUMBER); + if (maxClientCnt == 0) + { + NETSTACK_LOGE("max concurrent clients number is %{public}d", maxClientCnt); + } + SetMaxConcurrentClientsNumber(maxClientCnt); + uint32_t maxConn = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CONNECTIONS_FOR_ONE_CLIENT); + if (maxConn == 0) + { + NETSTACK_LOGE("max connections for one clients:%{public}d", maxConn); + } + SetMaxConnectionsForOneClient(maxConn); + return true; + } + + void ServerStartContext::ParseOptionalParams(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) != napi_object) + { + NETSTACK_LOGE("js type error"); + return; + } + NETSTACK_LOGE("SERVER_IP:%{public}s", ContextKey::SERVER_IP); + std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::SERVER_IP); + if (ip != "") + { + SetServerIP(ip); + } + else + { + NETSTACK_LOGE("ip is null"); + std::string ipTmp = "0.0.0.0"; + SetServerIP(ipTmp); + } + std::string protocol = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::PROTOCOL); + if (protocol != "") + { + SetServerProtocol(protocol); + } + else + { + NETSTACK_LOGE("protocol is null"); + std::string ipTmp = "lws_server"; + SetServerProtocol(ipTmp); + } + napi_value jsServerCert = NapiUtils::GetNamedProperty(env, params, ContextKey::SERVER_CERT); + if (NapiUtils::GetValueType(env, jsServerCert) != napi_object) + { + NETSTACK_LOGE("jsServerCert type error"); + return; + } + ParseServerCert(env, jsServerCert); + } + + void ServerStartContext::ParseServerCert(napi_env env, napi_value params) + { + if (NapiUtils::GetValueType(env, params) != napi_object) + { + NETSTACK_LOGE("js type error"); + return; + } + std::string certPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CERT_PATH); + std::string keyPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::KEY_PATH); + SetServerCert(certPath, keyPath); + } + + void ServerStartContext::SetServerIP(std::string &ip) + { + serverIp_ = ip; + } + + void ServerStartContext::SetServerPort(uint32_t &serverPort) + { + serverPort_ = serverPort; + } + + void ServerStartContext::SetServerCert(std::string &certPath, std::string &keyPath) + { + certPath_ = certPath; + keyPath_ = keyPath; + } + + void ServerStartContext::SetMaxConcurrentClientsNumber(uint32_t &clientsNumber) + { + maxClientsNumber_ = clientsNumber; + } + + void ServerStartContext::SetServerProtocol(std::string &protocol) + { + websocketServerProtocol_ = protocol; + } + + void ServerStartContext::SetMaxConnectionsForOneClient(uint32_t &count) + { + maxCountForOneClient_ = count; + } + + std::string ServerStartContext::GetServerIP() const + { + return serverIp_; + } + + uint32_t ServerStartContext::GetServerPort() const + { + return serverPort_; + } + + void ServerStartContext::GetServerCert(std::string &certPath, std::string &keyPath) const + { + certPath = certPath_; + keyPath = keyPath_; + } + + uint32_t ServerStartContext::GetMaxConcurrentClientsNumber() const + { + return maxClientsNumber_; + } + + std::string ServerStartContext::GetServerProtocol() const + { + return websocketServerProtocol_; + } + + uint32_t ServerStartContext::GetMaxConnectionsForOneClient() const + { + return maxCountForOneClient_; + } + + int32_t ServerStartContext::GetErrorCode() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_CODE; + } + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_CODE; + } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) + { + return err; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; + } + + std::string ServerStartContext::GetErrorMessage() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_MSG; + } + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) + { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + return {}; + } +} // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp new file mode 100644 index 000000000..37d0c180d --- /dev/null +++ b/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "server_stop_context.h" + +#include "constant.h" +#include "netstack_common_utils.h" +#include "netstack_log.h" +#include "napi_utils.h" + +namespace OHOS::NetStack::Websocket +{ + ServerStopContext::ServerStopContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} + + ServerStopContext::~ServerStopContext() = default; + + void ServerStopContext::ParseParams(napi_value *params, size_t paramsCount) + { + if (!CheckParamsType(params, paramsCount)) + { + return; + } + if (paramsCount != FUNCTION_PARAM_ZERO) + { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; + } + SetParseOK(true); + } + + bool ServerStopContext::CheckParamsType(napi_value *params, size_t paramsCount) + { + if (paramsCount == FUNCTION_PARAM_ZERO) + { + return true; + } + return false; + } + + int32_t ServerStopContext::GetErrorCode() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_CODE; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; + } + + std::string ServerStopContext::GetErrorMessage() const + { + if (BaseContext::IsPermissionDenied()) + { + return PERMISSION_DENIED_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) + { + return it->second; + } + return {}; + } + +} // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/utils/websocket_utils.h b/frameworks/js/napi/websocket/utils/websocket_utils.h new file mode 100644 index 000000000..acee87c28 --- /dev/null +++ b/frameworks/js/napi/websocket/utils/websocket_utils.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_WEBSOCKET_UTILS_H +#define COMMUNICATIONNETSTACK_WEBSOCKET_UTILS_H + +#include +#include + +namespace OHOS::NetStack::Websocket +{ + struct WebSocketConnection + { + std::string clientIP; + uint32_t clientPort; + }; +} // namespace OHOS::NetStack::Websocket +#endif \ No newline at end of file -- Gitee From ca43d3d86b3816f98cf76f5e6ddb7d84b151ff46 Mon Sep 17 00:00:00 2001 From: jxw Date: Wed, 30 Apr 2025 15:17:31 +0800 Subject: [PATCH 052/126] websocketserver Signed-off-by: wendan4 --- .../async_context/src/server_send_context.cpp | 2 +- .../websocket_exec/include/websocket_exec.h | 4 +- .../websocket_exec/src/websocket_exec.cpp | 28 +- test/unittest/websocket/BUILD.gn | 12 + test/unittest/websocket/WebSocketTest.cpp | 245 ++++++++++++++++++ .../unittest/websocket_test/WebSocketTest.cpp | 244 +++++++++++++++++ utils/napi_utils/BUILD.gn | 2 - utils/napi_utils/include/event_manager.h | 23 +- utils/napi_utils/src/event_manager.cpp | 16 +- 9 files changed, 537 insertions(+), 39 deletions(-) diff --git a/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp index 0fa0a4090..0edff0599 100644 --- a/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp @@ -118,7 +118,7 @@ namespace OHOS::NetStack::Websocket return false; } if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), - str.length(), str.c_str(), str.length()) < 0) + str.length(), str.c_str(), str.length()) < 0) { NETSTACK_LOGE("copy failed"); free(data); diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h index 0ae7e35b3..dddccef3f 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h @@ -184,11 +184,11 @@ private: static bool IsAllowConnection(const std::string &clientId); - static bool IsIpInBlacklist(const std::string &id); + static bool IsIpInBanList(const std::string &id); static bool IsHighFreqConnection(const std::string &id); - static void AddBlackList(const std::string &id); + static void AddBanList(const std::string &id); static void UpdataClientList(const std::string &id); diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index 5168a8c0c..795f6c773 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -109,9 +109,9 @@ static std::shared_mutex wsMutex_; static std::shared_mutex connListMutex_; -static std::shared_mutex blackListMutex_; +static std::shared_mutex banListMutex_; -static std::unordered_map blackList; +static std::unordered_map banList; static std::unordered_map clientList; @@ -1028,13 +1028,13 @@ int WebSocketExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_re bool WebSocketExec::IsAllowConnection(const std::string &clientId) { - if (IsIpInBlacklist(clientId)) { - NETSTACK_LOGE("clientid is in blacklist"); + if (IsIpInBanList(clientId)) { + NETSTACK_LOGE("clientid is in banList"); return false; } if (IsHighFreqConnection(clientId)) { NETSTACK_LOGE("clientid reach high frequency connection"); - AddBlackList(clientId); + AddBanList(clientId); return false; } UpdataClientList(clientId); @@ -1046,7 +1046,7 @@ void WebSocketExec::UpdataClientList(const std::string &id) std::shared_lock lock(connListMutex_); auto it = clientList.find(id); if (it == clientList.end()) { - NETSTACK_LOGI("add clientid to blacklist"); + NETSTACK_LOGI("add clientid to banList"); clientList[id] = {1, GetCurrentSecond()}; } else { auto now = GetCurrentSecond() - it->second.lastConnectionTime; @@ -1059,22 +1059,22 @@ void WebSocketExec::UpdataClientList(const std::string &id) } } -void WebSocketExec::AddBlackList(const std::string &id) +void WebSocketExec::AddBanList(const std::string &id) { - std::shared_lock lock(blackListMutex_); - blackList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; + std::shared_lock lock(banListMutex_); + banList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; } -bool WebSocketExec::IsIpInBlacklist(const std::string &id) +bool WebSocketExec::IsIpInBanlist(const std::string &id) { - std::shared_lock lock(blackListMutex_); - auto it = blackList.find(id); - if (it != blackList.end()) { + std::shared_lock lock(banListMutex_); + auto it = banList.find(id); + if (it != banList.end()) { auto now = GetCurrentSecond(); if (now < it->second) { return true; } else { - blackList.erase(it); + banList.erase(it); } } return false; diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 2aadbf9eb..6744089d9 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -36,6 +36,7 @@ ohos_unittest("websocket_unittest") { "$WEBSOCKET_NAPI/async_context/include", "$WEBSOCKET_NAPI/async_work/include", "$WEBSOCKET_NAPI/constant/include", + "$WEBSOCKET_NAPI/utils/include", "$WEBSOCKET_NAPI/websocket_exec/include", "$WEBSOCKET_NAPI/websocket_module/include", ] @@ -72,6 +73,17 @@ ohos_unittest("websocket_unittest") { defines += [ "HAS_NETMANAGER_BASE=0" ] } + if (netstack_websocket_server_enable) { + defines += [ "NETSTACK_WEBSOCKETSERVER" ] + sources += [ + "$WEBSOCKET_NAPI/async_context/src/list_all_connections_context.cpp", + "$WEBSOCKET_NAPI/async_context/src/server_close_context.cpp", + "$WEBSOCKET_NAPI/async_context/src/server_send_context.cpp", + "$WEBSOCKET_NAPI/async_context/src/server_start_context.cpp", + "$WEBSOCKET_NAPI/async_context/src/server_stop_context.cpp", + ] + } + part_name = "netstack" subsystem_name = "communication" } diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 6a021bbfb..0ebb4a9e3 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -24,6 +24,13 @@ #include "websocket_async_work.h" #include "websocket_exec.h" #include "websocket_module.h" +#ifdef NETSTACK_WEBSOCKETSERVER +#include "server_start_context.h" +#include "server_close_context.h" +#include "server_send_context.h" +#include "server_stop_context.h" +#include "list_all_connections_context.h" +#endif // NETSTACK_WEBSOCKETSERVER class WebSocketTest : public testing::Test { public: @@ -131,4 +138,242 @@ HWTEST_F(WebSocketTest, WebSocketTest008, TestSize.Level1) EXPECT_EQ(getExclusions, "www.httpbin.org"); EXPECT_EQ(ret, true); } + +#ifdef NETSTACK_WEBSOCKETSERVER +HWTEST_F(WebSocketTest, WebSocketTest009, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest010, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerStart(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest011, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest012, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest013, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerSend(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest014, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest015, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest016, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerClose(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest017, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest018, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest019, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerStop(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest020, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest021, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest022, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecListAllConnections(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest023, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest024, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ConnectContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecConnect(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest025, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + SendContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest026, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + CloseContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest027, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest028, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest029, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest030, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest031, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest032, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ConnectContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecConnect(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest033, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + SendContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest034, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + CloseContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecClose(&context); + EXPECT_EQ(ret, false); + +} +#endif } // namespace \ No newline at end of file diff --git a/test/unittest/websocket_test/WebSocketTest.cpp b/test/unittest/websocket_test/WebSocketTest.cpp index f81082d77..95e99d018 100644 --- a/test/unittest/websocket_test/WebSocketTest.cpp +++ b/test/unittest/websocket_test/WebSocketTest.cpp @@ -24,6 +24,13 @@ #include "websocket_async_work.h" #include "websocket_exec.h" #include "websocket_module.h" +#ifdef NETSTACK_WEBSOCKETSERVER +#include "server_start_context.h" +#include "server_close_context.h" +#include "server_send_context.h" +#include "server_stop_context.h" +#include "list_all_connections_context.h" +#endif // NETSTACK_WEBSOCKETSERVER class WebSocketTest : public testing::Test { public: @@ -130,4 +137,241 @@ HWTEST_F(WebSocketTest, WebSocketTest008, TestSize.Level1) EXPECT_EQ(getExclusions, "www.httpbin.org"); EXPECT_EQ(ret, false); } + +#ifdef NETSTACK_WEBSOCKETSERVER +HWTEST_F(WebSocketTest, WebSocketTest009, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest010, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerStart(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest011, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest012, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest013, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerSend(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest014, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest015, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest016, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerClose(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest017, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest018, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest019, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecServerStop(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest020, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest021, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest022, TestSize.Level1) +{ + bool ret = WebSocketExec::ExecListAllConnections(nullptr); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest023, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest024, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ConnectContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecConnect(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest025, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + SendContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest026, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + CloseContext context(env, eventManager); + context.SetPermissionDenied(true); + bool ret = WebSocketExec::ExecClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest027, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest028, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest029, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest030, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest031, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest032, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ConnectContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecConnect(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest033, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + SendContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest034, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + CloseContext context(env, eventManager); + context.SetPermissionDenied(false); + bool ret = WebSocketExec::ExecClose(&context); + EXPECT_EQ(ret, false); +} +#endif } // namespace \ No newline at end of file diff --git a/utils/napi_utils/BUILD.gn b/utils/napi_utils/BUILD.gn index 143548195..70e391923 100644 --- a/utils/napi_utils/BUILD.gn +++ b/utils/napi_utils/BUILD.gn @@ -55,8 +55,6 @@ ohos_static_library("napi_utils") { "napi:ace_napi", ] - public_external_deps = [ "libwebsockets:websockets" ] - if (defined(global_parts_info) && defined(global_parts_info.communication_netmanager_base) && global_parts_info.communication_netmanager_base && is_ohos && diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index 30626d6b2..118bdf77a 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -31,7 +31,6 @@ #include "event_listener.h" #include "napi/native_api.h" #include "uv.h" -#include "libwebsockets.h" namespace OHOS::NetStack { static constexpr const uint32_t EVENT_MANAGER_MAGIC_NUMBER = 0x86161616; @@ -81,9 +80,9 @@ public: void *GetQueueData(); #ifdef NETSTACK_WEBSOCKETSERVER - void SetServerQueueData(lws *wsi, void *data); + void SetServerQueueData(void *wsi, void *data); - void *GetServerQueueData(lws *wsi); + void *GetServerQueueData(void *wsi); #endif void CreateEventReference(napi_env env, napi_value value); @@ -125,17 +124,17 @@ public: void SetProxyData(std::shared_ptr data); #ifdef NETSTACK_WEBSOCKETSERVER - const std::string &GetWsServerBinaryData(lws *wsi); + const std::string &GetWsServerBinaryData(void *wsi); - const std::string &GetWsServerTextData(lws *wsi); + const std::string &GetWsServerTextData(void *wsi); - void AppendWsServerBinaryData(lws *wsi, void *data, size_t length); + void AppendWsServerBinaryData(void *wsi, void *data, size_t length); - void AppendWsServerTextData(lws *wsi, void *data, size_t length); + void AppendWsServerTextData(void *wsi, void *data, size_t length); - void ClearWsServerBinaryData(lws *wsi); + void ClearWsServerBinaryData(void *wsi); - void ClearWsServerTextData(lws *wsi); + void ClearWsServerTextData(void *wsi); void SetMaxConnClientCnt(const uint32_t &cnt); @@ -166,9 +165,9 @@ private: std::shared_ptr proxyData_; #ifdef NETSTACK_WEBSOCKETSERVER std::shared_mutex dataServerQueueMutex_; - std::unordered_map> serverDataQueue_; - std::unordered_map wsServerBinaryData_; - std::unordered_map wsServerTextData_; + std::unordered_map> serverDataQueue_; + std::unordered_map wsServerBinaryData_; + std::unordered_map wsServerTextData_; uint32_t maxConnClientCnt_; uint32_t maxConnForOneClient_; #endif diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index c3cbf167d..a96e50e4a 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -145,13 +145,13 @@ void *EventManager::GetQueueData() } #ifdef NETSTACK_WEBSOCKETSERVER -void EventManager::SetServerQueueData(lws *wsi, void *data) +void EventManager::SetServerQueueData(void *wsi, void *data) { std::unique_lock lock(dataServerQueueMutex_); serverDataQueue_[wsi].push(data); } -void *EventManager::GetServerQueueData(lws *wsi) +void *EventManager::GetServerQueueData(void *wsi) { if (wsi == nullptr) { NETSTACK_LOGE("wsi is nullptr"); @@ -234,32 +234,32 @@ void EventManager::AppendWebSocketBinaryData(void *data, size_t length) } #ifdef NETSTACK_WEBSOCKETSERVER -const std::string &EventManager::GetWsServerBinaryData(lws *wsi) +const std::string &EventManager::GetWsServerBinaryData(void *wsi) { return wsServerBinaryData_[wsi]; } -const std::string &EventManager::GetWsServerTextData(lws *wsi) +const std::string &EventManager::GetWsServerTextData(void *wsi) { return wsServerTextData_[wsi]; } -void EventManager::AppendWsServerBinaryData(lws *wsi, void *data, size_t length) +void EventManager::AppendWsServerBinaryData(void *wsi, void *data, size_t length) { wsServerBinaryData_[wsi].append(reinterpret_cast(data), length); } -void EventManager::AppendWsServerTextData(lws *wsi, void *data, size_t length) +void EventManager::AppendWsServerTextData(void *wsi, void *data, size_t length) { wsServerTextData_[wsi].append(reinterpret_cast(data), length); } -void EventManager::ClearWsServerBinaryData(lws *wsi) +void EventManager::ClearWsServerBinaryData(void *wsi) { wsServerBinaryData_[wsi].clear(); } -void EventManager::ClearWsServerTextData(lws *wsi) +void EventManager::ClearWsServerTextData(void *wsi) { wsServerTextData_[wsi].clear(); } -- Gitee From 5ed892acc418e6e8b3a27195e51c9306a2ea4544 Mon Sep 17 00:00:00 2001 From: luwei Date: Tue, 22 Apr 2025 20:35:52 +0800 Subject: [PATCH 053/126] add http chr client module Signed-off-by: luwei --- frameworks/js/napi/http/BUILD.gn | 6 +- .../js/napi/http/http_exec/src/http_exec.cpp | 4 + .../http/http_client/http_client_task.cpp | 4 + interfaces/innerkits/http_client/BUILD.gn | 2 + test/unittest/http/BUILD.gn | 2 + .../include/i_netstack_chr_client.h | 81 +++++++ .../include/netstack_chr_client.h | 52 +++++ .../src/netstack_chr_client.cpp | 211 ++++++++++++++++++ 8 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 utils/netstack_chr_client/include/i_netstack_chr_client.h create mode 100644 utils/netstack_chr_client/include/netstack_chr_client.h create mode 100644 utils/netstack_chr_client/src/netstack_chr_client.cpp diff --git a/frameworks/js/napi/http/BUILD.gn b/frameworks/js/napi/http/BUILD.gn index 81fa9f8ff..023efe4db 100644 --- a/frameworks/js/napi/http/BUILD.gn +++ b/frameworks/js/napi/http/BUILD.gn @@ -32,7 +32,10 @@ config("http_config") { if (defined(global_parts_info) && defined(global_parts_info.communication_netmanager_base) && global_parts_info.communication_netmanager_base) { - include_dirs += [ "$NETSTACK_DIR/utils/http_over_curl/include" ] + include_dirs += [ + "$NETSTACK_DIR/utils/http_over_curl/include", + "$NETSTACK_DIR/utils/netstack_chr_client/include", + ] } defines = [] @@ -161,6 +164,7 @@ ohos_shared_library("http") { external_deps += [ "netmanager_base:netsys_client" ] defines = [ "HAS_NETMANAGER_BASE=1" ] sources += [ + "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_client.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_multi_driver.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_request_handler.cpp", ] diff --git a/frameworks/js/napi/http/http_exec/src/http_exec.cpp b/frameworks/js/napi/http/http_exec/src/http_exec.cpp index 8d4215801..76916bbc4 100755 --- a/frameworks/js/napi/http/http_exec/src/http_exec.cpp +++ b/frameworks/js/napi/http/http_exec/src/http_exec.cpp @@ -56,6 +56,7 @@ #include "event_list.h" #if HAS_NETMANAGER_BASE #include "hitrace_meter.h" +#include "netstack_chr_client.h" #include "netstack_hisysevent.h" #endif #include "http_async_work.h" @@ -549,6 +550,9 @@ void HttpExec::HandleCurlData(CURLMsg *msg) NETSTACK_LOGD("priority = %{public}d", context->options.GetPriority()); context->SetExecOK(GetCurlDataFromHandle(handle, context, msg->msg, msg->data.result)); CacheCurlPerformanceTiming(handle, context); +#if HAS_NETMANAGER_BASE + ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(handle, msg->data.result); +#endif if (context->IsExecOK()) { CacheProxy proxy(context->options); proxy.WriteResponseToCache(context->response); diff --git a/frameworks/native/http/http_client/http_client_task.cpp b/frameworks/native/http/http_client/http_client_task.cpp index f113f34db..abdfd31e6 100644 --- a/frameworks/native/http/http_client/http_client_task.cpp +++ b/frameworks/native/http/http_client/http_client_task.cpp @@ -31,6 +31,7 @@ #include "timing.h" #if HAS_NETMANAGER_BASE #include "http_client_network_message.h" +#include "netstack_chr_client.h" #endif #include "netstack_hisysevent.h" @@ -733,6 +734,9 @@ void HttpClientTask::ProcessResponse(CURLMsg *msg) response_.SetResponseTime(HttpTime::GetNowTimeGMT()); DumpHttpPerformance(); +#if HAS_NETMANAGER_BASE + ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(curlHandle_, code); +#endif if (CURLE_ABORTED_BY_CALLBACK == code) { (void)ProcessResponseCode(); diff --git a/interfaces/innerkits/http_client/BUILD.gn b/interfaces/innerkits/http_client/BUILD.gn index 9e209c686..b2fa2fc2e 100644 --- a/interfaces/innerkits/http_client/BUILD.gn +++ b/interfaces/innerkits/http_client/BUILD.gn @@ -20,6 +20,7 @@ config("http_client_config") { "$NETSTACK_DIR/interfaces/innerkits/http_client/include", "$NETSTACK_DIR/utils/profiler_utils/include", "$NETSTACK_DIR/utils/tlv_utils/include", + "$NETSTACK_DIR/utils/netstack_chr_client/include", ] cflags = [] @@ -61,6 +62,7 @@ ohos_shared_library("http_client") { sources = [ "$NETSTACK_DIR/utils/http_over_curl/src/epoll_multi_driver.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_request_handler.cpp", + "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_client.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/http_client_network_message.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/i_network_message.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/netstack_network_profiler.cpp", diff --git a/test/unittest/http/BUILD.gn b/test/unittest/http/BUILD.gn index ecf3f050a..1fd029d91 100644 --- a/test/unittest/http/BUILD.gn +++ b/test/unittest/http/BUILD.gn @@ -63,6 +63,7 @@ ohos_unittest("http_unittest") { include_dirs += [ "$NETMANAGER_BASE_INNERKITS_DIR/include", "$NETMANAGER_BASE_INNERKITS_DIR/netconnclient/include", + "$SUBSYSTEM_DIR/netstack/utils/netstack_chr_client/include", ] } @@ -77,6 +78,7 @@ ohos_unittest("http_unittest") { "$NETSTACK_NAPI_ROOT/http/options/src/http_request_options.cpp", "$NETSTACK_NAPI_ROOT/http/options/src/http_response.cpp", "$SUBSYSTEM_DIR/netstack/utils/common_utils/src/netstack_common_utils.cpp", + "$SUBSYSTEM_DIR/netstack/utils/netstack_chr_client/src/netstack_chr_client.cpp", "$SUBSYSTEM_DIR/netstack/utils/http_over_curl/src/epoll_request_handler.cpp", "$SUBSYSTEM_DIR/netstack/utils/profiler_utils/src/netstack_network_profiler.cpp", "$SUBSYSTEM_DIR/netstack/utils/tlv_utils/src/tlv_utils.cpp", diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h new file mode 100644 index 000000000..04a99cb53 --- /dev/null +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_I_NETSTACK_CHR_CLIENT_H +#define COMMUNICATIONNETSTACK_I_NETSTACK_CHR_CLIENT_H + +#include +#include + +#include "curl/curl.h" + +namespace OHOS::NetStack::ChrClient { + +typedef struct DataTransTcpInfo { + uint8_t retransmits; + uint32_t unacked; + + uint32_t lastDataSent; + uint32_t lastAckSent; + uint32_t lastDataRecv; + uint32_t lastAckRecv; + + uint32_t rtt; + uint32_t rttvar; + uint32_t totalRetrans; + + std::string srcIp; + std::string dstIp; + uint16_t srcPort; + uint16_t dstPort; +} DataTransTcpInfo; + +typedef struct DataTransHttpInfo { + long curlCode; + int responseCode; + + curl_off_t totalTime; + curl_off_t nameLookUpTime; + curl_off_t connectTime; + curl_off_t appconnectTime; + curl_off_t preTransferTime; + curl_off_t startTransferTime; + curl_off_t queueTime; + curl_off_t retryAfter; + + curl_off_t sizeUpload; + curl_off_t sizeDownload; + curl_off_t speedDownload; + curl_off_t speedUpload; + std::string effectiveMethod; + std::string contentType; + + curl_off_t redirectTime; + long redirectCount; + + int proxyError; + long osError; + long sslVerifyResult; +} DataTransHttpInfo; + +typedef struct DataTransChrStats { + int uid; + int sockfd; + DataTransHttpInfo httpInfo; + DataTransTcpInfo tcpInfo; +} DataTransChrStats; + +} // namespace OHOS::NetStack +#endif // COMMUNICATIONNETSTACK_I_NETSTACK_CHR_CLIENT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/include/netstack_chr_client.h b/utils/netstack_chr_client/include/netstack_chr_client.h new file mode 100644 index 000000000..9fcccd9d9 --- /dev/null +++ b/utils/netstack_chr_client/include/netstack_chr_client.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_NETSTACK_CHR_CLIENT_H +#define COMMUNICATIONNETSTACK_NETSTACK_CHR_CLIENT_H + +#include +#include +#include + +#include "curl/curl.h" + +#include "i_netstack_chr_client.h" + +namespace OHOS::NetStack::ChrClient { + +class NetStackChrClient { +public: + static NetStackChrClient &GetInstance(); + void GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curlCode); + +private: + NetStackChrClient() = default; + ~NetStackChrClient() = default; + + static bool GetAddrFromSock( + int sockfd, std::string &srcIp, std::string &dstIp, uint16_t &srcPort, uint16_t &dstPort); + static bool GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo); + static void GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &httpInfo); + + template + static DataType GetNumericAttributeFromCurl(CURL *handle, CURLINFO info); + static std::string GetStringAttributeFromCurl(CURL *handle, CURLINFO info); + static bool shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); + // HttpChrReport httpReport; +}; + +} // namespace OHOS::NetStack::ChrClient + +#endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_CLIENT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp new file mode 100644 index 000000000..916b555da --- /dev/null +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2025-2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include + +#include +#include +#include + +#include "netstack_chr_client.h" +#include "netstack_common_utils.h" +#include "netstack_log.h" +#include "i_netstack_chr_client.h" + +namespace OHOS::NetStack::ChrClient { + +static constexpr const int HTTP_REQUEST_SUCCESS = 200; +static constexpr const int HTTP_FILE_TRANSFER_SIZE_THRESHOLD = 100000; +static constexpr const int HTTP_FILE_TRANSFER_TIME_THRESHOLD = 500000; + +NetStackChrClient &NetStackChrClient::GetInstance() +{ + static NetStackChrClient instance; + return instance; +} + +bool NetStackChrClient::GetAddrFromSock( + int sockfd, std::string &srcIp, std::string &dstIp, uint16_t &srcPort, uint16_t &dstPort) +{ + sockaddr_storage localss{}; + sockaddr_storage peerss{}; + socklen_t addrLen = 0; + + // Get local addr + addrLen = sizeof(localss); + if (getsockname(sockfd, reinterpret_cast(&localss), &addrLen) < 0) { + return false; + } + + // Get peer addr + addrLen = sizeof(peerss); + if (getsockname(sockfd, reinterpret_cast(&peerss), &addrLen) < 0) { + return false; + } + + char buf[INET6_ADDRSTRLEN]; + if (localss.ss_family == AF_INET && peerss.ss_family == AF_INET) { + auto *l4 = reinterpret_cast(&localss); + auto *p4 = reinterpret_cast(&peerss); + + if (inet_ntop(AF_INET, &l4->sin_addr, buf, sizeof(buf)) == nullptr) { + return false; + } + srcIp = buf; + srcPort = ntohs(l4->sin_port); + + if (inet_ntop(AF_INET, &p4->sin_addr, buf, sizeof(buf)) == nullptr) { + return false; + } + + dstIp = buf; + dstPort = ntohs(p4->sin_port); + } else if (localss.ss_family == AF_INET6 && peerss.ss_family == AF_INET6) { + auto *l6 = reinterpret_cast(&localss); + auto *p6 = reinterpret_cast(&peerss); + + if (inet_ntop(AF_INET6, &l6->sin6_addr, buf, sizeof(buf)) == nullptr) { + return false; + } + srcIp = buf; + srcPort = ntohs(l6->sin6_port); + if (inet_ntop(AF_INET6, &p6->sin6_addr, buf, sizeof(buf)) == nullptr) { + return false; + } + dstIp = buf; + dstPort = ntohs(p6->sin6_port); + } else { + return false; + } + + return true; +} + +bool NetStackChrClient::GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo) +{ + if (sockfd <= 0) { + return false; + } + struct tcp_info tcpInfo = {}; + socklen_t infoLen = sizeof(tcpInfo); + + if (getsockopt(sockfd, IPPROTO_TCP, TCP_INFO, &tcpInfo, &infoLen) < 0) { + return false; + } + + httpTcpInfo.unacked = tcpInfo.tcpi_unacked; + httpTcpInfo.lastDataSent = tcpInfo.tcpi_last_data_sent; + httpTcpInfo.lastAckSent = tcpInfo.tcpi_last_ack_sent; + httpTcpInfo.lastDataRecv = tcpInfo.tcpi_last_data_recv; + httpTcpInfo.lastAckRecv = tcpInfo.tcpi_last_ack_recv; + httpTcpInfo.rtt = tcpInfo.tcpi_rtt; + httpTcpInfo.rttvar = tcpInfo.tcpi_rttvar; + httpTcpInfo.totalRetrans = tcpInfo.tcpi_total_retrans; + httpTcpInfo.retransmits = tcpInfo.tcpi_retransmits; + + if (GetAddrFromSock(sockfd, httpTcpInfo.srcIp, httpTcpInfo.dstIp, httpTcpInfo.srcPort, httpTcpInfo.dstPort)) { + httpTcpInfo.srcIp = CommonUtils::AnonymizeIp(httpTcpInfo.srcIp); + httpTcpInfo.dstIp = CommonUtils::AnonymizeIp(httpTcpInfo.dstIp); + } + + return true; +} + +template +DataType NetStackChrClient::GetNumericAttributeFromCurl(CURL *handle, CURLINFO info) +{ + DataType number = 0; + CURLcode res = curl_easy_getinfo(handle, info, &number); + if (res != CURLE_OK) { + return -1; + } + return number; +} + +std::string NetStackChrClient::GetStringAttributeFromCurl(CURL *handle, CURLINFO info) +{ + char *result = nullptr; + CURLcode res = curl_easy_getinfo(handle, info, &result); + if (res != CURLE_OK || result == nullptr) { + return std::string(); + } + return std::string(result); +} + +void NetStackChrClient::GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &httpInfo) +{ + (void)curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &httpInfo.responseCode); + httpInfo.nameLookUpTime = GetNumericAttributeFromCurl(handle, CURLINFO_NAMELOOKUP_TIME_T); + httpInfo.connectTime = GetNumericAttributeFromCurl(handle, CURLINFO_CONNECT_TIME_T); + httpInfo.preTransferTime = GetNumericAttributeFromCurl(handle, CURLINFO_PRETRANSFER_TIME_T); + httpInfo.startTransferTime = GetNumericAttributeFromCurl(handle, CURLINFO_STARTTRANSFER_TIME_T); + httpInfo.totalTime = GetNumericAttributeFromCurl(handle, CURLINFO_TOTAL_TIME_T); + httpInfo.redirectTime = GetNumericAttributeFromCurl(handle, CURLINFO_REDIRECT_TIME_T); + httpInfo.appconnectTime = GetNumericAttributeFromCurl(handle, CURLINFO_APPCONNECT_TIME_T); + httpInfo.queueTime = GetNumericAttributeFromCurl(handle, CURLINFO_QUEUE_TIME_T); + httpInfo.retryAfter = GetNumericAttributeFromCurl(handle, CURLINFO_RETRY_AFTER); + + httpInfo.sizeUpload = GetNumericAttributeFromCurl(handle, CURLINFO_SIZE_UPLOAD_T); + httpInfo.sizeDownload = GetNumericAttributeFromCurl(handle, CURLINFO_SIZE_DOWNLOAD_T); + httpInfo.speedDownload = GetNumericAttributeFromCurl(handle, CURLINFO_SPEED_DOWNLOAD_T); + httpInfo.speedUpload = GetNumericAttributeFromCurl(handle, CURLINFO_SPEED_UPLOAD_T); + + httpInfo.redirectCount = GetNumericAttributeFromCurl(handle, CURLINFO_REDIRECT_COUNT); + httpInfo.osError = GetNumericAttributeFromCurl(handle, CURLINFO_OS_ERRNO); + httpInfo.sslVerifyResult = GetNumericAttributeFromCurl(handle, CURLINFO_PROXY_SSL_VERIFYRESULT); + httpInfo.proxyError = GetNumericAttributeFromCurl(handle, CURLINFO_PROXY_ERROR); + + httpInfo.effectiveMethod = GetStringAttributeFromCurl(handle, CURLINFO_EFFECTIVE_METHOD); + httpInfo.contentType = GetStringAttributeFromCurl(handle, CURLINFO_CONTENT_TYPE); +} + +bool NetStackChrClient::shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo) +{ + if (httpInfo.curlCode != 0 || httpInfo.responseCode != HTTP_REQUEST_SUCCESS) { + return true; + } + if ((httpInfo.sizeDownload + httpInfo.sizeDownload <= HTTP_FILE_TRANSFER_SIZE_THRESHOLD) && + httpInfo.totalTime > HTTP_FILE_TRANSFER_TIME_THRESHOLD) { + return true; + } + + return false; +} + +void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curlCode) +{ + if (handle == NULL) { + return; + } + + DataTransChrStats dataTransChrStats{}; + dataTransChrStats.uid = static_cast(getuid()); + dataTransChrStats.httpInfo.curlCode = curlCode; + + GetHttpInfoFromCurl(handle, dataTransChrStats.httpInfo); + if (!shouldReportHttpAbnormalEvent(dataTransChrStats.httpInfo)) { + return; + } + + curl_off_t sockfd = 0; + curl_easy_getinfo(handle, CURLINFO_ACTIVESOCKET, &sockfd); + dataTransChrStats.sockfd = sockfd; + + if (!GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo)) { + NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", dataTransChrStats.sockfd); + } +} + +} // namespace OHOS::NetStack::ChrClient \ No newline at end of file -- Gitee From 40b1d09ee10c3a254885d37f78a7c6487e0acd5f Mon Sep 17 00:00:00 2001 From: jxw Date: Mon, 5 May 2025 20:42:33 +0800 Subject: [PATCH 054/126] websocketServer Signed-off-by: wendan4 --- frameworks/js/napi/websocket/BUILD.gn | 1 + .../include/list_all_connections_context.h | 34 +- .../include/server_close_context.h | 44 +- .../include/server_send_context.h | 48 +- .../include/server_start_context.h | 74 +- .../include/server_stop_context.h | 28 +- .../src/list_all_connections_context.cpp | 97 +- .../src/server_close_context.cpp | 274 ++-- .../async_context/src/server_send_context.cpp | 346 ++-- .../src/server_start_context.cpp | 391 +++-- .../async_context/src/server_stop_context.cpp | 80 +- .../async_work/include/websocket_async_work.h | 3 + .../async_work/src/websocket_async_work.cpp | 20 +- .../websocket_exec/include/websocket_exec.h | 120 -- .../include/websocket_server_exec.h | 142 ++ .../websocket_exec/src/websocket_exec.cpp | 1211 +------------- .../src/websocket_server_exec.cpp | 1416 +++++++++++++++++ test/unittest/websocket/BUILD.gn | 1 + test/unittest/websocket/WebSocketTest.cpp | 1 + .../unittest/websocket_test/WebSocketTest.cpp | 1 + 20 files changed, 2237 insertions(+), 2095 deletions(-) create mode 100644 frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h create mode 100644 frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp diff --git a/frameworks/js/napi/websocket/BUILD.gn b/frameworks/js/napi/websocket/BUILD.gn index a8a4f0afd..da03a0deb 100644 --- a/frameworks/js/napi/websocket/BUILD.gn +++ b/frameworks/js/napi/websocket/BUILD.gn @@ -83,6 +83,7 @@ ohos_shared_library("websocket") { "async_context/src/server_send_context.cpp", "async_context/src/server_start_context.cpp", "async_context/src/server_stop_context.cpp", + "websocket_exec/src/websocket_server_exec.cpp", ] } diff --git a/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h index b236205ee..ab245ab12 100644 --- a/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h +++ b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h @@ -21,34 +21,32 @@ #include "websocket_utils.h" #include "nocopyable.h" -namespace OHOS::NetStack::Websocket -{ - class ListAllConnectionsContext final : public BaseContext - { - public: - DISALLOW_COPY_AND_MOVE(ListAllConnectionsContext); +namespace OHOS::NetStack::Websocket { +class ListAllConnectionsContext final : public BaseContext { +public: + DISALLOW_COPY_AND_MOVE(ListAllConnectionsContext); - ListAllConnectionsContext() = delete; + ListAllConnectionsContext() = delete; - ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager); + ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager); - ~ListAllConnectionsContext() override; + ~ListAllConnectionsContext() override; - void ParseParams(napi_value *params, size_t paramsCount) override; + void ParseParams(napi_value *params, size_t paramsCount) override; - void SetAllConnections(std::vector &connections); + void SetAllConnections(std::vector &connections); - [[nodiscard]] std::vector GetAllConnections() const; + [[nodiscard]] std::vector GetAllConnections() const; - [[nodiscard]] int32_t GetErrorCode() const override; + [[nodiscard]] int32_t GetErrorCode() const override; - [[nodiscard]] std::string GetErrorMessage() const override; + [[nodiscard]] std::string GetErrorMessage() const override; - private: - bool CheckParamsType(napi_value *params, size_t paramsCount); +private: + bool CheckParamsType(napi_value *params, size_t paramsCount); - std::vector webSocketConnections_; - }; + std::vector webSocketConnections_; +}; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_LISTALLCONNECTIONS_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_close_context.h b/frameworks/js/napi/websocket/async_context/include/server_close_context.h index d9521cc83..a45910cc4 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_close_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_close_context.h @@ -21,44 +21,42 @@ #include "websocket_utils.h" #include "nocopyable.h" -namespace OHOS::NetStack::Websocket -{ - class ServerCloseContext final : public BaseContext - { - public: - DISALLOW_COPY_AND_MOVE(ServerCloseContext); +namespace OHOS::NetStack::Websocket { +class ServerCloseContext final : public BaseContext { +public: + DISALLOW_COPY_AND_MOVE(ServerCloseContext); - ServerCloseContext() = delete; + ServerCloseContext() = delete; - ServerCloseContext(napi_env env, const std::shared_ptr &manager); + ServerCloseContext(napi_env env, const std::shared_ptr &manager); - ~ServerCloseContext() override; + ~ServerCloseContext() override; - void ParseParams(napi_value *params, size_t paramsCount) override; + void ParseParams(napi_value *params, size_t paramsCount) override; - bool HandleParseConnection(napi_env env, napi_value params); + bool HandleParseConnection(napi_env env, napi_value params); - bool HandleParseCloseOption(napi_env env, napi_value params); + bool HandleParseCloseOption(napi_env env, napi_value params); - [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; + [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; - [[nodiscard]] int32_t GetErrorCode() const override; + [[nodiscard]] int32_t GetErrorCode() const override; - [[nodiscard]] std::string GetErrorMessage() const override; + [[nodiscard]] std::string GetErrorMessage() const override; - uint32_t code; + uint32_t code; - std::string reason; + std::string reason; - WebSocketConnection connection; + WebSocketConnection connection; - private: - bool CheckParamsType(napi_value *params, size_t paramsCount); +private: + bool CheckParamsType(napi_value *params, size_t paramsCount); - bool IsValidWebsocketConnection(napi_env env, napi_value params); + bool IsValidWebsocketConnection(napi_env env, napi_value params); - bool IsValidCloseOptions(napi_env env, napi_value params); - }; + bool IsValidCloseOptions(napi_env env, napi_value params); +}; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_SERVER_CLOSE_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_send_context.h b/frameworks/js/napi/websocket/async_context/include/server_send_context.h index 9859b1ca8..48073c65b 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_send_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_send_context.h @@ -22,48 +22,46 @@ #include "websocket_utils.h" #include "nocopyable.h" -namespace OHOS::NetStack::Websocket -{ - class ServerSendContext final : public BaseContext - { - public: - DISALLOW_COPY_AND_MOVE(ServerSendContext); +namespace OHOS::NetStack::Websocket { +class ServerSendContext final : public BaseContext { +public: + DISALLOW_COPY_AND_MOVE(ServerSendContext); - ServerSendContext() = delete; + ServerSendContext() = delete; - ServerSendContext(napi_env env, const std::shared_ptr &manager); + ServerSendContext(napi_env env, const std::shared_ptr &manager); - ~ServerSendContext() override; + ~ServerSendContext() override; - void ParseParams(napi_value *params, size_t paramsCount) override; + void ParseParams(napi_value *params, size_t paramsCount) override; - bool HandleParseString(napi_value *params); + bool HandleParseString(napi_value *params); - bool HandleParseArrayBuffer(napi_value *params); + bool HandleParseArrayBuffer(napi_value *params); - bool HandleParseConnection(napi_env env, napi_value params); + bool HandleParseConnection(napi_env env, napi_value params); - void SetClientWebSocketConn(uint32_t &port, std::string &ip); + void SetClientWebSocketConn(uint32_t &port, std::string &ip); - [[nodiscard]] int32_t GetErrorCode() const override; + [[nodiscard]] int32_t GetErrorCode() const override; - [[nodiscard]] std::string GetErrorMessage() const override; + [[nodiscard]] std::string GetErrorMessage() const override; - [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; + [[nodiscard]] OHOS::NetStack::Websocket::WebSocketConnection GetConnection() const; - void *data; + void *data; - size_t length; + size_t length; - lws_write_protocol protocol; + lws_write_protocol protocol; - OHOS::NetStack::Websocket::WebSocketConnection connection; + OHOS::NetStack::Websocket::WebSocketConnection connection; - private: - bool CheckParamsType(napi_value *params, size_t paramsCount); +private: + bool CheckParamsType(napi_value *params, size_t paramsCount); - bool IsValidWebsocketConnection(napi_env env, napi_value params); - }; + bool IsValidWebsocketConnection(napi_env env, napi_value params); +}; } // namespace OHOS::NetStack::Websocket #endif \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_start_context.h b/frameworks/js/napi/websocket/async_context/include/server_start_context.h index 5f0e44762..918ff3fce 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_start_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_start_context.h @@ -22,73 +22,71 @@ #include "libwebsockets.h" #include "nocopyable.h" -namespace OHOS::NetStack::Websocket -{ - class ServerStartContext final : public BaseContext - { - public: - DISALLOW_COPY_AND_MOVE(ServerStartContext); +namespace OHOS::NetStack::Websocket { +class ServerStartContext final : public BaseContext { +public: + DISALLOW_COPY_AND_MOVE(ServerStartContext); - ServerStartContext() = delete; + ServerStartContext() = delete; - ServerStartContext(napi_env env, const std::shared_ptr &sharedManager); + ServerStartContext(napi_env env, const std::shared_ptr &sharedManager); - ~ServerStartContext() override; + ~ServerStartContext() override; - void ParseParams(napi_value *params, size_t paramsCount) override; + void ParseParams(napi_value *params, size_t paramsCount) override; - void SetServerIP(std::string &ip); + void SetServerIP(std::string &ip); - [[nodiscard]] std::string GetServerIP() const; + [[nodiscard]] std::string GetServerIP() const; - void SetServerPort(uint32_t &serverPort); + void SetServerPort(uint32_t &serverPort); - [[nodiscard]] uint32_t GetServerPort() const; + [[nodiscard]] uint32_t GetServerPort() const; - void SetServerCert(std::string &certPath, std::string &keyPath); + void SetServerCert(std::string &certPath, std::string &keyPath); - void GetServerCert(std::string &certPath, std::string &keyPath) const; + void GetServerCert(std::string &certPath, std::string &keyPath) const; - void SetMaxConcurrentClientsNumber(uint32_t &clientsNumber); + void SetMaxConcurrentClientsNumber(uint32_t &clientsNumber); - [[nodiscard]] uint32_t GetMaxConcurrentClientsNumber() const; + [[nodiscard]] uint32_t GetMaxConcurrentClientsNumber() const; - void SetServerProtocol(std::string &protocol); + void SetServerProtocol(std::string &protocol); - [[nodiscard]] std::string GetServerProtocol() const; + [[nodiscard]] std::string GetServerProtocol() const; - void SetMaxConnectionsForOneClient(uint32_t &count); + void SetMaxConnectionsForOneClient(uint32_t &count); - [[nodiscard]] uint32_t GetMaxConnectionsForOneClient() const; + [[nodiscard]] uint32_t GetMaxConnectionsForOneClient() const; - [[nodiscard]] int32_t GetErrorCode() const override; + [[nodiscard]] int32_t GetErrorCode() const override; - [[nodiscard]] std::string GetErrorMessage() const override; + [[nodiscard]] std::string GetErrorMessage() const override; - std::string serverIp_; + std::string serverIp_; - uint32_t serverPort_; + uint32_t serverPort_; - std::string certPath_; + std::string certPath_; - std::string keyPath_; + std::string keyPath_; - uint32_t maxClientsNumber_; + uint32_t maxClientsNumber_; - std::string websocketServerProtocol_; + std::string websocketServerProtocol_; - uint32_t maxCountForOneClient_; + uint32_t maxCountForOneClient_; - private: - bool CheckParamsType(napi_value *params, size_t paramsCount); +private: + bool CheckParamsType(napi_value *params, size_t paramsCount); - void ParseCallback(napi_value const *params, size_t paramsCount); + void ParseCallback(napi_value const *params, size_t paramsCount); - bool ParseRequiredParams(napi_env env, napi_value params); + bool ParseRequiredParams(napi_env env, napi_value params); - void ParseOptionalParams(napi_env env, napi_value params); + void ParseOptionalParams(napi_env env, napi_value params); - void ParseServerCert(napi_env env, napi_value params); - }; + void ParseServerCert(napi_env env, napi_value params); +}; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_SERVER_START_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/include/server_stop_context.h b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h index 01f5788c3..415ae5d8e 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_stop_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h @@ -20,28 +20,26 @@ #include "base_context.h" #include "nocopyable.h" -namespace OHOS::NetStack::Websocket -{ - class ServerStopContext final : public BaseContext - { - public: - DISALLOW_COPY_AND_MOVE(ServerStopContext); +namespace OHOS::NetStack::Websocket { +class ServerStopContext final : public BaseContext{ +public: + DISALLOW_COPY_AND_MOVE(ServerStopContext); - ServerStopContext() = delete; + ServerStopContext() = delete; - ServerStopContext(napi_env env, const std::shared_ptr &manager); + ServerStopContext(napi_env env, const std::shared_ptr &manager); - ~ServerStopContext() override; + ~ServerStopContext() override; - void ParseParams(napi_value *params, size_t paramsCount) override; + void ParseParams(napi_value *params, size_t paramsCount) override; - [[nodiscard]] int32_t GetErrorCode() const override; + [[nodiscard]] int32_t GetErrorCode() const override; - [[nodiscard]] std::string GetErrorMessage() const override; + [[nodiscard]] std::string GetErrorMessage() const override; - private: - bool CheckParamsType(napi_value *params, size_t paramsCount); - }; +private: + bool CheckParamsType(napi_value *params, size_t paramsCount); +}; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_SERVER_STOP_CONTEXT_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp b/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp index 24d1d31ee..137ffff1c 100644 --- a/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/list_all_connections_context.cpp @@ -18,67 +18,60 @@ #include "netstack_log.h" #include "napi_utils.h" -namespace OHOS::NetStack::Websocket -{ - ListAllConnectionsContext::ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager) - : BaseContext(env, sharedManager) {} +namespace OHOS::NetStack::Websocket { +ListAllConnectionsContext::ListAllConnectionsContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} - ListAllConnectionsContext::~ListAllConnectionsContext() = default; +ListAllConnectionsContext::~ListAllConnectionsContext() = default; - void ListAllConnectionsContext::ParseParams(napi_value *params, size_t paramsCount) - { - if (!CheckParamsType(params, paramsCount)) - { - return; - } - if (paramsCount != FUNCTION_PARAM_ZERO) - { - SetParseOK(SetCallback(params[0]) == napi_ok); - return; - } - SetParseOK(true); +void ListAllConnectionsContext::ParseParams(napi_value *params, size_t paramsCount) +{ + if (!CheckParamsType(params, paramsCount)) { + return; } - - bool ListAllConnectionsContext::CheckParamsType(napi_value *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_ZERO) - { - return true; - } - return false; + if (paramsCount != FUNCTION_PARAM_ZERO) { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; } + SetParseOK(true); +} - void ListAllConnectionsContext::SetAllConnections(std::vector - &connections) - { - webSocketConnections_ = connections; +bool ListAllConnectionsContext::CheckParamsType(napi_value *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_ZERO) { + return true; } + return false; +} - std::vector ListAllConnectionsContext::GetAllConnections() const - { - return webSocketConnections_; - } +void ListAllConnectionsContext::SetAllConnections(std::vector + &connections) +{ + webSocketConnections_ = connections; +} - int32_t ListAllConnectionsContext::GetErrorCode() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_CODE; - } - return WEBSOCKET_UNKNOWN_OTHER_ERROR; +std::vector ListAllConnectionsContext::GetAllConnections() const +{ + return webSocketConnections_; +} + +int32_t ListAllConnectionsContext::GetErrorCode() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_CODE; } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; +} - std::string ListAllConnectionsContext::GetErrorMessage() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_MSG; - } - auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - return {}; +std::string ListAllConnectionsContext::GetErrorMessage() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; } + return {}; +} } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp index e42819938..19b0e6dff 100644 --- a/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/server_close_context.cpp @@ -19,185 +19,159 @@ #include "netstack_log.h" #include "napi_utils.h" -namespace OHOS::NetStack::Websocket +namespace OHOS::NetStack::Websocket { +ServerCloseContext::ServerCloseContext(napi_env env, const std::shared_ptr &manager) + : BaseContext(env, manager), code(CLOSE_REASON_NORMAL_CLOSE), reason("CLOSE_NORMAL"), connection() {} + +ServerCloseContext::~ServerCloseContext() = default; + +void ServerCloseContext::ParseParams(napi_value *params, size_t paramsCount) { - ServerCloseContext::ServerCloseContext(napi_env env, const std::shared_ptr &manager) - : BaseContext(env, manager), code(CLOSE_REASON_NORMAL_CLOSE), reason("CLOSE_NORMAL"), connection() {} - - ServerCloseContext::~ServerCloseContext() = default; - - void ServerCloseContext::ParseParams(napi_value *params, size_t paramsCount) - { - if (!CheckParamsType(params, paramsCount)) - { - NETSTACK_LOGE("ServerCloseContext Parse Failed"); - if (paramsCount == FUNCTION_PARAM_ONE) - { - if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_function) - { - SetCallback(params[0]); - } - return; + if (!CheckParamsType(params, paramsCount)) { + NETSTACK_LOGE("ServerCloseContext Parse Failed"); + if (paramsCount == FUNCTION_PARAM_ONE) { + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_function) { + SetCallback(params[0]); } + return; + } - if (paramsCount == FUNCTION_PARAM_TWO) - { - if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_function) - { - SetCallback(params[1]); - } - return; + if (paramsCount == FUNCTION_PARAM_TWO) { + if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_function) { + SetCallback(params[1]); } return; } + return; + } - if (paramsCount == FUNCTION_PARAM_ONE) - { - NETSTACK_LOGI("paramsCount is one"); - if (!HandleParseConnection(GetEnv(), params[0])) - { - return; - } + if (paramsCount == FUNCTION_PARAM_ONE) { + NETSTACK_LOGI("paramsCount is one"); + if (!HandleParseConnection(GetEnv(), params[0])) { + return; } + } - if (paramsCount == FUNCTION_PARAM_TWO) - { - NETSTACK_LOGI("paramsCount is two"); - if (!HandleParseConnection(GetEnv(), params[0])) - { - return; - } - if (!HandleParseCloseOption(GetEnv(), params[1])) - { - return; - } + if (paramsCount == FUNCTION_PARAM_TWO) { + NETSTACK_LOGI("paramsCount is two"); + if (!HandleParseConnection(GetEnv(), params[0])) { + return; } - NETSTACK_LOGI("ServerCloseContext Parse OK"); - return SetParseOK(true); - } - - bool ServerCloseContext::HandleParseConnection(napi_env env, napi_value params) - { - NETSTACK_LOGI("HandleParseConnection enter"); - if (NapiUtils::GetValueType(env, params) == napi_object) - { - connection.clientPort = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); - if (connection.clientPort == 0) - { - NETSTACK_LOGE("parse clientPort failed"); - } - connection.clientIP = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); - if (connection.clientIP == "") - { - NETSTACK_LOGE("parse clientIP failed"); - } - return true; + if (!HandleParseCloseOption(GetEnv(), params[1])) { + return; } - return false; } + NETSTACK_LOGI("ServerCloseContext Parse OK"); + return SetParseOK(true); +} - bool ServerCloseContext::HandleParseCloseOption(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) == napi_object) - { - uint32_t closeCode = NapiUtils::GetUint32Property(env, params, ContextKey::CODE); - if (closeCode >= CLOSE_REASON_NORMAL_CLOSE && closeCode <= CLOSE_REASON_RESERVED12) - { - code = closeCode; - } - std::string tempReason = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::REASON); - if (!tempReason.empty()) - { - reason = tempReason; - } - return true; +bool ServerCloseContext::HandleParseConnection(napi_env env, napi_value params) +{ + NETSTACK_LOGI("HandleParseConnection enter"); + if (NapiUtils::GetValueType(env, params) == napi_object) { + connection.clientPort = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); + if (connection.clientPort == 0) { + NETSTACK_LOGE("parse clientPort failed"); } - return false; + connection.clientIP = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); + if (connection.clientIP == "") { + NETSTACK_LOGE("parse clientIP failed"); + } + return true; } + return false; +} - bool ServerCloseContext::CheckParamsType(napi_value *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_ONE) - { - NETSTACK_LOGI("paramsCount one"); - return IsValidWebsocketConnection(GetEnv(), params[0]); +bool ServerCloseContext::HandleParseCloseOption(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) == napi_object) { + uint32_t closeCode = NapiUtils::GetUint32Property(env, params, ContextKey::CODE); + if (closeCode >= CLOSE_REASON_NORMAL_CLOSE && closeCode <= CLOSE_REASON_RESERVED12) { + code = closeCode; } - - if (paramsCount == FUNCTION_PARAM_TWO) - { - NETSTACK_LOGI("paramsCount two"); - return IsValidWebsocketConnection(GetEnv(), params[0]) && - IsValidCloseOptions(GetEnv(), params[1]); + std::string tempReason = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::REASON); + if (!tempReason.empty()) { + reason = tempReason; } - return false; + return true; } + return false; +} - bool ServerCloseContext::IsValidWebsocketConnection(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) != napi_object) - { - return false; - } - return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, - ContextKey::CLIENT_IP)) == napi_string); +bool ServerCloseContext::CheckParamsType(napi_value *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_ONE) { + NETSTACK_LOGI("paramsCount one"); + return IsValidWebsocketConnection(GetEnv(), params[0]); } - bool ServerCloseContext::IsValidCloseOptions(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) != napi_object) - { - return false; - } - return NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CODE)) == napi_number && - NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::REASON)) == napi_string; + if (paramsCount == FUNCTION_PARAM_TWO) { + NETSTACK_LOGI("paramsCount two"); + return IsValidWebsocketConnection(GetEnv(), params[0]) && + IsValidCloseOptions(GetEnv(), params[1]); } + return false; +} - WebSocketConnection ServerCloseContext::GetConnection() const - { - return connection; +bool ServerCloseContext::IsValidWebsocketConnection(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) != napi_object) { + return false; } + return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, + ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, + NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_IP)) == napi_string); +} - int32_t ServerCloseContext::GetErrorCode() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_CODE; - } +bool ServerCloseContext::IsValidCloseOptions(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) != napi_object) { + return false; + } + return NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, + ContextKey::CODE)) == napi_number && NapiUtils::GetValueType(env, + NapiUtils::GetNamedProperty(env, params, ContextKey::REASON)) == napi_string; +} - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_CODE; - } - if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) - { - return err; - } - return WEBSOCKET_UNKNOWN_OTHER_ERROR; +WebSocketConnection ServerCloseContext::GetConnection() const +{ + return connection; +} + +int32_t ServerCloseContext::GetErrorCode() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_CODE; } - std::string ServerCloseContext::GetErrorMessage() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_MSG; - } + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_CODE; + } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) { + return err; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; +} - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_MSG; - } - auto it = WEBSOCKET_ERR_MAP.find(err); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - return {}; +std::string ServerCloseContext::GetErrorMessage() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_MSG; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; } + return {}; +} } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp index 0edff0599..a8c50668b 100644 --- a/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/server_send_context.cpp @@ -21,222 +21,192 @@ #include "securec.h" static constexpr size_t MAX_LIMIT = 5 * 1024 * 1024; -namespace OHOS::NetStack::Websocket -{ - ServerSendContext::ServerSendContext(napi_env env, const std::shared_ptr &manager) - : BaseContext(env, manager), data(nullptr), length(0), protocol(LWS_WRITE_TEXT), connection() {} - - ServerSendContext::~ServerSendContext() = default; - - void ServerSendContext::ParseParams(napi_value *params, size_t paramsCount) - { - if (!CheckParamsType(params, paramsCount)) - { - NETSTACK_LOGE("SendContext Parse Failed"); - if (paramsCount == FUNCTION_PARAM_ONE) - { - if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object) - { - SetCallback(params[0]); - } - return; - } +namespace OHOS::NetStack::Websocket { +ServerSendContext::ServerSendContext(napi_env env, const std::shared_ptr &manager) + : BaseContext(env, manager), data(nullptr), length(0), protocol(LWS_WRITE_TEXT), connection() {} - if (paramsCount == FUNCTION_PARAM_TWO) - { - if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_object) - { - SetCallback(params[1]); - } - return; +ServerSendContext::~ServerSendContext() = default; + +void ServerSendContext::ParseParams(napi_value *params, size_t paramsCount) +{ + if (!CheckParamsType(params, paramsCount)) { + NETSTACK_LOGE("SendContext Parse Failed"); + if (paramsCount == FUNCTION_PARAM_ONE) { + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object) { + SetCallback(params[0]); } return; } - if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string) - { - if (!HandleParseString(params)) - { - NETSTACK_LOGI("HandleParseString fail"); - return; + if (paramsCount == FUNCTION_PARAM_TWO) { + if (NapiUtils::GetValueType(GetEnv(), params[1]) == napi_object) { + SetCallback(params[1]); } - } - else - { - if (!HandleParseArrayBuffer(params)) - { - NETSTACK_LOGI("HandleParseArrayBuffer fail"); - return; - } - } - - if (!HandleParseConnection(GetEnv(), params[1])) - { return; } - NETSTACK_LOGD("SendContext SetParseOK"); - return SetParseOK(true); + return; } - bool ServerSendContext::CheckParamsType(napi_value *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_TWO) - { - return (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string || - NapiUtils::ValueIsArrayBuffer(GetEnv(), params[0])) && - IsValidWebsocketConnection(GetEnv(), params[1]); + if (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string) { + if (!HandleParseString(params)) { + NETSTACK_LOGI("HandleParseString fail"); + return; + } + } else { + if (!HandleParseArrayBuffer(params)) { + NETSTACK_LOGI("HandleParseArrayBuffer fail"); + return; } - return false; } - bool ServerSendContext::IsValidWebsocketConnection(napi_env env, napi_value params) - { - NETSTACK_LOGI("IsValidWebsocketConnection enter"); - if (NapiUtils::GetValueType(env, params) != napi_object) - { - return false; - } - return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, - ContextKey::CLIENT_IP)) == napi_string); - } - - bool ServerSendContext::HandleParseString(napi_value *params) - { - NETSTACK_LOGI("Server SendContext data is String"); - std::string str = NapiUtils::GetStringFromValueUtf8(GetEnv(), params[0]); - // must have PRE and POST - size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + str.length() + LWS_SEND_BUFFER_POST_PADDING; - if (dataLen == 0 || dataLen > MAX_LIMIT) - { - NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); - return false; - } - data = malloc(dataLen); - if (data == nullptr) - { - NETSTACK_LOGE("no memory"); - return false; - } - if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), - str.length(), str.c_str(), str.length()) < 0) - { - NETSTACK_LOGE("copy failed"); - free(data); - return false; - } - length = str.length(); - protocol = LWS_WRITE_TEXT; - return true; + if (!HandleParseConnection(GetEnv(), params[1])) { + return; } + NETSTACK_LOGD("SendContext SetParseOK"); + return SetParseOK(true); +} - bool ServerSendContext::HandleParseArrayBuffer(napi_value *params) - { - NETSTACK_LOGI("ServerSendContext data is ArrayBuffer"); - size_t len = 0; - void *mem = NapiUtils::GetInfoFromArrayBufferValue(GetEnv(), params[0], &len); - if (mem == nullptr || len == 0) - { - NETSTACK_LOGE("no memory"); - return false; - } - // must have PRE and POST - size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING; - if (dataLen == 0 || dataLen > MAX_LIMIT) - { - NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); - return false; - } - data = malloc(dataLen); - if (data == nullptr) - { - NETSTACK_LOGE("no memory"); - return false; - } - if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), len, mem, - len) < 0) - { - NETSTACK_LOGE("copy failed"); - free(data); - return false; - } - length = len; - protocol = LWS_WRITE_BINARY; - return true; +bool ServerSendContext::CheckParamsType(napi_value *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_TWO) { + return (NapiUtils::GetValueType(GetEnv(), params[0]) == napi_string || + NapiUtils::ValueIsArrayBuffer(GetEnv(), params[0])) && + IsValidWebsocketConnection(GetEnv(), params[1]); } + return false; +} - bool ServerSendContext::HandleParseConnection(napi_env env, napi_value params) - { - NETSTACK_LOGI("parse websocketconnection enter"); - if (NapiUtils::GetValueType(env, params) == napi_object) - { - uint32_t port = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); - if (port == 0) - { - NETSTACK_LOGE("parse clientPort error"); - } - std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); - if (ip == "") - { - NETSTACK_LOGE("parse clientIP error"); - } - SetClientWebSocketConn(port, ip); - return true; - } +bool ServerSendContext::IsValidWebsocketConnection(napi_env env, napi_value params) +{ + NETSTACK_LOGI("IsValidWebsocketConnection enter"); + if (NapiUtils::GetValueType(env, params) != napi_object) { return false; } + return (NapiUtils::GetValueType(env, NapiUtils::GetNamedProperty(env, params, + ContextKey::CLIENT_PORT)) == napi_number) && (NapiUtils::GetValueType(env, + NapiUtils::GetNamedProperty(env, params, ContextKey::CLIENT_IP)) == napi_string); +} - void ServerSendContext::SetClientWebSocketConn(uint32_t &port, std::string &ip) - { - connection.clientPort = port; - connection.clientIP = ip; +bool ServerSendContext::HandleParseString(napi_value *params) +{ + NETSTACK_LOGI("Server SendContext data is String"); + std::string str = NapiUtils::GetStringFromValueUtf8(GetEnv(), params[0]); + // must have PRE and POST + size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + str.length() + LWS_SEND_BUFFER_POST_PADDING; + if (dataLen == 0 || dataLen > MAX_LIMIT) { + NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); + return false; } - - WebSocketConnection ServerSendContext::GetConnection() const - { - return connection; + data = malloc(dataLen); + if (data == nullptr) { + NETSTACK_LOGE("no memory"); + return false; } + if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), + str.length(), str.c_str(), str.length()) < 0) { + NETSTACK_LOGE("copy failed"); + free(data); + return false; + } + length = str.length(); + protocol = LWS_WRITE_TEXT; + return true; +} - int32_t ServerSendContext::GetErrorCode() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_CODE; - } +bool ServerSendContext::HandleParseArrayBuffer(napi_value *params) +{ + NETSTACK_LOGI("ServerSendContext data is ArrayBuffer"); + size_t len = 0; + void *mem = NapiUtils::GetInfoFromArrayBufferValue(GetEnv(), params[0], &len); + if (mem == nullptr || len == 0) { + NETSTACK_LOGE("no memory"); + return false; + } + // must have PRE and POST + size_t dataLen = LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING; + if (dataLen == 0 || dataLen > MAX_LIMIT) { + NETSTACK_LOGE("ServerSendContext data is exceeded the limit"); + return false; + } + data = malloc(dataLen); + if (data == nullptr) { + NETSTACK_LOGE("no memory"); + return false; + } + if (memcpy_s(reinterpret_cast(reinterpret_cast(data) + LWS_SEND_BUFFER_PRE_PADDING), len, mem, + len) < 0) { + NETSTACK_LOGE("copy failed"); + free(data); + return false; + } + length = len; + protocol = LWS_WRITE_BINARY; + return true; +} - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_CODE; +bool ServerSendContext::HandleParseConnection(napi_env env, napi_value params) +{ + NETSTACK_LOGI("parse websocketconnection enter"); + if (NapiUtils::GetValueType(env, params) == napi_object) { + uint32_t port = NapiUtils::GetUint32Property(env, params, ContextKey::CLIENT_PORT); + if (port == 0) { + NETSTACK_LOGE("parse clientPort error"); } - if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) - { - return err; + std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CLIENT_IP); + if (ip == "") { + NETSTACK_LOGE("parse clientIP error"); } - return WEBSOCKET_CONNECT_FAILED; + SetClientWebSocketConn(port, ip); + return true; } + return false; +} - std::string ServerSendContext::GetErrorMessage() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_MSG; - } +void ServerSendContext::SetClientWebSocketConn(uint32_t &port, std::string &ip) +{ + connection.clientPort = port; + connection.clientIP = ip; +} - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_MSG; - } - auto it = WEBSOCKET_ERR_MAP.find(err); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - return {}; +WebSocketConnection ServerSendContext::GetConnection() const +{ + return connection; +} + +int32_t ServerSendContext::GetErrorCode() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_CODE; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_CODE; + } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) { + return err; + } + return WEBSOCKET_CONNECT_FAILED; +} + +std::string ServerSendContext::GetErrorMessage() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_MSG; + } + + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; } + return {}; +} } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp index 444350813..d22a45408 100644 --- a/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/server_start_context.cpp @@ -18,247 +18,218 @@ #include "netstack_log.h" #include "napi_utils.h" -namespace OHOS::NetStack::Websocket -{ - ServerStartContext::ServerStartContext(napi_env env, const std::shared_ptr &sharedManager) - : BaseContext(env, sharedManager) {} - - ServerStartContext::~ServerStartContext() = default; +namespace OHOS::NetStack::Websocket { +ServerStartContext::ServerStartContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} - void ServerStartContext::ParseParams(napi_value *params, size_t paramsCount) - { - if (!CheckParamsType(params, paramsCount)) - { - ParseCallback(params, paramsCount); - return; - } - - if (paramsCount != FUNCTION_PARAM_ONE) - { - SetParseOK(SetCallback(params[0]) == napi_ok); - return; - } +ServerStartContext::~ServerStartContext() = default; - napi_env env = GetEnv(); - if (!ParseRequiredParams(env, params[0])) - { - return; - } - ParseOptionalParams(env, params[0]); - SetParseOK(true); +void ServerStartContext::ParseParams(napi_value *params, size_t paramsCount) +{ + if (!CheckParamsType(params, paramsCount)) { + ParseCallback(params, paramsCount); + return; } - bool ServerStartContext::CheckParamsType(napi_value *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_ZERO) - { - return true; - } - - if (paramsCount == FUNCTION_PARAM_ONE) - { - return NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object; - } - - return false; + if (paramsCount != FUNCTION_PARAM_ONE) { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; } - void ServerStartContext::ParseCallback(napi_value const *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_ZERO) - { - return; - } - if (paramsCount == FUNCTION_PARAM_ONE) - { - if (NapiUtils::GetValueType(GetEnv(), params[FUNCTION_PARAM_ONE - 1]) == napi_object) - { - SetCallback(params[FUNCTION_PARAM_ONE - 1]); - } - return; - } + napi_env env = GetEnv(); + if (!ParseRequiredParams(env, params[0])) { + return; } + ParseOptionalParams(env, params[0]); + SetParseOK(true); +} - bool ServerStartContext::ParseRequiredParams(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) != napi_object) - { - NETSTACK_LOGE("js type error"); - return false; - } - uint32_t serverPort = NapiUtils::GetUint32Property(env, params, ContextKey::SERVER_PORT); - if (serverPort == 0) - { - NETSTACK_LOGE("%{public}s not found", ContextKey::SERVER_PORT); - } - SetServerPort(serverPort); - uint32_t maxClientCnt = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CLIENT_NUMBER); - if (maxClientCnt == 0) - { - NETSTACK_LOGE("max concurrent clients number is %{public}d", maxClientCnt); - } - SetMaxConcurrentClientsNumber(maxClientCnt); - uint32_t maxConn = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CONNECTIONS_FOR_ONE_CLIENT); - if (maxConn == 0) - { - NETSTACK_LOGE("max connections for one clients:%{public}d", maxConn); - } - SetMaxConnectionsForOneClient(maxConn); +bool ServerStartContext::CheckParamsType(napi_value *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_ZERO) { return true; } - void ServerStartContext::ParseOptionalParams(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) != napi_object) - { - NETSTACK_LOGE("js type error"); - return; - } - NETSTACK_LOGE("SERVER_IP:%{public}s", ContextKey::SERVER_IP); - std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::SERVER_IP); - if (ip != "") - { - SetServerIP(ip); - } - else - { - NETSTACK_LOGE("ip is null"); - std::string ipTmp = "0.0.0.0"; - SetServerIP(ipTmp); - } - std::string protocol = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::PROTOCOL); - if (protocol != "") - { - SetServerProtocol(protocol); - } - else - { - NETSTACK_LOGE("protocol is null"); - std::string ipTmp = "lws_server"; - SetServerProtocol(ipTmp); - } - napi_value jsServerCert = NapiUtils::GetNamedProperty(env, params, ContextKey::SERVER_CERT); - if (NapiUtils::GetValueType(env, jsServerCert) != napi_object) - { - NETSTACK_LOGE("jsServerCert type error"); - return; - } - ParseServerCert(env, jsServerCert); + if (paramsCount == FUNCTION_PARAM_ONE) { + return NapiUtils::GetValueType(GetEnv(), params[0]) == napi_object; } - void ServerStartContext::ParseServerCert(napi_env env, napi_value params) - { - if (NapiUtils::GetValueType(env, params) != napi_object) - { - NETSTACK_LOGE("js type error"); - return; + return false; +} + +void ServerStartContext::ParseCallback(napi_value const *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_ZERO) { + return; + } + if (paramsCount == FUNCTION_PARAM_ONE) { + if (NapiUtils::GetValueType(GetEnv(), params[FUNCTION_PARAM_ONE - 1]) == napi_object) { + SetCallback(params[FUNCTION_PARAM_ONE - 1]); } - std::string certPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CERT_PATH); - std::string keyPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::KEY_PATH); - SetServerCert(certPath, keyPath); + return; } +} - void ServerStartContext::SetServerIP(std::string &ip) - { - serverIp_ = ip; +bool ServerStartContext::ParseRequiredParams(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) != napi_object) { + NETSTACK_LOGE("js type error"); + return false; } - - void ServerStartContext::SetServerPort(uint32_t &serverPort) - { - serverPort_ = serverPort; + uint32_t serverPort = NapiUtils::GetUint32Property(env, params, ContextKey::SERVER_PORT); + if (serverPort == 0) { + NETSTACK_LOGE("%{public}s not found", ContextKey::SERVER_PORT); } - - void ServerStartContext::SetServerCert(std::string &certPath, std::string &keyPath) - { - certPath_ = certPath; - keyPath_ = keyPath; + SetServerPort(serverPort); + uint32_t maxClientCnt = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CLIENT_NUMBER); + if (maxClientCnt == 0) { + NETSTACK_LOGE("max concurrent clients number is %{public}d", maxClientCnt); } - - void ServerStartContext::SetMaxConcurrentClientsNumber(uint32_t &clientsNumber) - { - maxClientsNumber_ = clientsNumber; + SetMaxConcurrentClientsNumber(maxClientCnt); + uint32_t maxConn = NapiUtils::GetUint32Property(env, params, ContextKey::MAX_CONNECTIONS_FOR_ONE_CLIENT); + if (maxConn == 0) { + NETSTACK_LOGE("max connections for one clients:%{public}d", maxConn); } + SetMaxConnectionsForOneClient(maxConn); + return true; +} - void ServerStartContext::SetServerProtocol(std::string &protocol) - { - websocketServerProtocol_ = protocol; +void ServerStartContext::ParseOptionalParams(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) != napi_object) { + NETSTACK_LOGE("js type error"); + return; + } + NETSTACK_LOGE("SERVER_IP:%{public}s", ContextKey::SERVER_IP); + std::string ip = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::SERVER_IP); + if (ip != "") { + SetServerIP(ip); + } else { + NETSTACK_LOGE("ip is null"); + std::string ipTmp = "0.0.0.0"; + SetServerIP(ipTmp); + } + std::string protocol = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::PROTOCOL); + if (protocol != "") { + SetServerProtocol(protocol); + } else { + NETSTACK_LOGE("protocol is null"); + std::string ipTmp = "lws_server"; + SetServerProtocol(ipTmp); + } + napi_value jsServerCert = NapiUtils::GetNamedProperty(env, params, ContextKey::SERVER_CERT); + if (NapiUtils::GetValueType(env, jsServerCert) != napi_object) { + NETSTACK_LOGE("jsServerCert type error"); + return; + } + ParseServerCert(env, jsServerCert); +} + +void ServerStartContext::ParseServerCert(napi_env env, napi_value params) +{ + if (NapiUtils::GetValueType(env, params) != napi_object) { + NETSTACK_LOGE("js type error"); + return; } + std::string certPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::CERT_PATH); + std::string keyPath = NapiUtils::GetStringPropertyUtf8(env, params, ContextKey::KEY_PATH); + SetServerCert(certPath, keyPath); +} - void ServerStartContext::SetMaxConnectionsForOneClient(uint32_t &count) - { - maxCountForOneClient_ = count; - } +void ServerStartContext::SetServerIP(std::string &ip) +{ + serverIp_ = ip; +} - std::string ServerStartContext::GetServerIP() const - { - return serverIp_; - } +void ServerStartContext::SetServerPort(uint32_t &serverPort) +{ + serverPort_ = serverPort; +} - uint32_t ServerStartContext::GetServerPort() const - { - return serverPort_; - } +void ServerStartContext::SetServerCert(std::string &certPath, std::string &keyPath) +{ + certPath_ = certPath; + keyPath_ = keyPath; +} - void ServerStartContext::GetServerCert(std::string &certPath, std::string &keyPath) const - { - certPath = certPath_; - keyPath = keyPath_; - } +void ServerStartContext::SetMaxConcurrentClientsNumber(uint32_t &clientsNumber) +{ + maxClientsNumber_ = clientsNumber; +} - uint32_t ServerStartContext::GetMaxConcurrentClientsNumber() const - { - return maxClientsNumber_; - } +void ServerStartContext::SetServerProtocol(std::string &protocol) +{ + websocketServerProtocol_ = protocol; +} - std::string ServerStartContext::GetServerProtocol() const - { - return websocketServerProtocol_; - } +void ServerStartContext::SetMaxConnectionsForOneClient(uint32_t &count) +{ + maxCountForOneClient_ = count; +} - uint32_t ServerStartContext::GetMaxConnectionsForOneClient() const - { - return maxCountForOneClient_; - } +std::string ServerStartContext::GetServerIP() const +{ + return serverIp_; +} - int32_t ServerStartContext::GetErrorCode() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_CODE; - } - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_CODE; - } - if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) - { - return err; - } - return WEBSOCKET_UNKNOWN_OTHER_ERROR; +uint32_t ServerStartContext::GetServerPort() const +{ + return serverPort_; +} + +void ServerStartContext::GetServerCert(std::string &certPath, std::string &keyPath) const +{ + certPath = certPath_; + keyPath = keyPath_; +} + +uint32_t ServerStartContext::GetMaxConcurrentClientsNumber() const +{ + return maxClientsNumber_; +} + +std::string ServerStartContext::GetServerProtocol() const +{ + return websocketServerProtocol_; +} + +uint32_t ServerStartContext::GetMaxConnectionsForOneClient() const +{ + return maxCountForOneClient_; +} + +int32_t ServerStartContext::GetErrorCode() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_CODE; + } + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_CODE; } + if (WEBSOCKET_ERR_MAP.find(err) != WEBSOCKET_ERR_MAP.end()) { + return err; + } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; +} - std::string ServerStartContext::GetErrorMessage() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_MSG; - } - auto err = BaseContext::GetErrorCode(); - if (err == PARSE_ERROR_CODE) - { - return PARSE_ERROR_MSG; - } - auto it = WEBSOCKET_ERR_MAP.find(err); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - return {}; +std::string ServerStartContext::GetErrorMessage() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_MSG; + } + auto err = BaseContext::GetErrorCode(); + if (err == PARSE_ERROR_CODE) { + return PARSE_ERROR_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(err); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; + } + it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; } + return {}; +} } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp b/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp index 37d0c180d..e820ecd41 100644 --- a/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp +++ b/frameworks/js/napi/websocket/async_context/src/server_stop_context.cpp @@ -20,57 +20,49 @@ #include "netstack_log.h" #include "napi_utils.h" -namespace OHOS::NetStack::Websocket -{ - ServerStopContext::ServerStopContext(napi_env env, const std::shared_ptr &sharedManager) - : BaseContext(env, sharedManager) {} +namespace OHOS::NetStack::Websocket { +ServerStopContext::ServerStopContext(napi_env env, const std::shared_ptr &sharedManager) + : BaseContext(env, sharedManager) {} - ServerStopContext::~ServerStopContext() = default; +ServerStopContext::~ServerStopContext() = default; - void ServerStopContext::ParseParams(napi_value *params, size_t paramsCount) - { - if (!CheckParamsType(params, paramsCount)) - { - return; - } - if (paramsCount != FUNCTION_PARAM_ZERO) - { - SetParseOK(SetCallback(params[0]) == napi_ok); - return; - } - SetParseOK(true); +void ServerStopContext::ParseParams(napi_value *params, size_t paramsCount) +{ + if (!CheckParamsType(params, paramsCount)) { + return; } - - bool ServerStopContext::CheckParamsType(napi_value *params, size_t paramsCount) - { - if (paramsCount == FUNCTION_PARAM_ZERO) - { - return true; - } - return false; + if (paramsCount != FUNCTION_PARAM_ZERO) { + SetParseOK(SetCallback(params[0]) == napi_ok); + return; } + SetParseOK(true); +} - int32_t ServerStopContext::GetErrorCode() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_CODE; - } - return WEBSOCKET_UNKNOWN_OTHER_ERROR; +bool ServerStopContext::CheckParamsType(napi_value *params, size_t paramsCount) +{ + if (paramsCount == FUNCTION_PARAM_ZERO) { + return true; } + return false; +} - std::string ServerStopContext::GetErrorMessage() const - { - if (BaseContext::IsPermissionDenied()) - { - return PERMISSION_DENIED_MSG; - } - auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); - if (it != WEBSOCKET_ERR_MAP.end()) - { - return it->second; - } - return {}; +int32_t ServerStopContext::GetErrorCode() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_CODE; } + return WEBSOCKET_UNKNOWN_OTHER_ERROR; +} +std::string ServerStopContext::GetErrorMessage() const +{ + if (BaseContext::IsPermissionDenied()) { + return PERMISSION_DENIED_MSG; + } + auto it = WEBSOCKET_ERR_MAP.find(WEBSOCKET_UNKNOWN_OTHER_ERROR); + if (it != WEBSOCKET_ERR_MAP.end()) { + return it->second; + } + return {}; +} } // namespace OHOS::NetStack::Websocket \ No newline at end of file diff --git a/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h b/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h index 738cbd5cd..2b8d49ff5 100644 --- a/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h +++ b/frameworks/js/napi/websocket/async_work/include/websocket_async_work.h @@ -17,6 +17,9 @@ #define COMMUNICATIONNETSTACK_WEBSOCKET_ASYNC_WORK_H #include "websocket_exec.h" +#ifdef NETSTACK_WEBSOCKETSERVER +#include "websocket_server_exec.h" +#endif namespace OHOS::NetStack::Websocket { class WebSocketAsyncWork final { diff --git a/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp b/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp index 576336804..cf22f2c69 100644 --- a/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp +++ b/frameworks/js/napi/websocket/async_work/src/websocket_async_work.cpp @@ -36,27 +36,27 @@ void WebSocketAsyncWork::ExecClose(napi_env env, void *data) #ifdef NETSTACK_WEBSOCKETSERVER void WebSocketAsyncWork::ExecServerStart(napi_env env, void *data) { - BaseAsyncWork::ExecAsyncWork(env, data); + BaseAsyncWork::ExecAsyncWork(env, data); } void WebSocketAsyncWork::ExecListAllConnections(napi_env env, void *data) { - BaseAsyncWork::ExecAsyncWork(env, data); + BaseAsyncWork::ExecAsyncWork(env, data); } void WebSocketAsyncWork::ExecServerClose(napi_env env, void *data) { - BaseAsyncWork::ExecAsyncWork(env, data); + BaseAsyncWork::ExecAsyncWork(env, data); } void WebSocketAsyncWork::ExecServerSend(napi_env env, void *data) { - BaseAsyncWork::ExecAsyncWork(env, data); + BaseAsyncWork::ExecAsyncWork(env, data); } void WebSocketAsyncWork::ExecServerStop(napi_env env, void *data) { - BaseAsyncWork::ExecAsyncWork(env, data); + BaseAsyncWork::ExecAsyncWork(env, data); } #endif @@ -78,28 +78,28 @@ void WebSocketAsyncWork::CloseCallback(napi_env env, napi_status status, void *d #ifdef NETSTACK_WEBSOCKETSERVER void WebSocketAsyncWork::ServerStartCallback(napi_env env, napi_status status, void *data) { - BaseAsyncWork::AsyncWorkCallback(env, status, data); + BaseAsyncWork::AsyncWorkCallback(env, status, data); } void WebSocketAsyncWork::ListAllConnectionsCallback(napi_env env, napi_status status, void *data) { BaseAsyncWork::AsyncWorkCallback(env, status, data); + WebSocketServerExec::ListAllConnectionsCallback>(env, status, data); } void WebSocketAsyncWork::ServerCloseCallback(napi_env env, napi_status status, void *data) { - BaseAsyncWork::AsyncWorkCallback(env, status, data); + BaseAsyncWork::AsyncWorkCallback(env, status, data); } void WebSocketAsyncWork::ServerSendCallback(napi_env env, napi_status status, void *data) { - BaseAsyncWork::AsyncWorkCallback(env, status, data); + BaseAsyncWork::AsyncWorkCallback(env, status, data); } void WebSocketAsyncWork::ServerStopCallback(napi_env env, napi_status status, void *data) { - BaseAsyncWork::AsyncWorkCallback(env, status, data); + BaseAsyncWork::AsyncWorkCallback(env, status, data); } #endif } // namespace OHOS::NetStack::Websocket diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h index dddccef3f..270a18957 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec.h @@ -19,29 +19,9 @@ #include "close_context.h" #include "connect_context.h" #include "send_context.h" -#ifdef NETSTACK_WEBSOCKETSERVER -#include "server_start_context.h" -#include "list_all_connections_context.h" -#include "server_send_context.h" -#include "server_close_context.h" -#include "server_stop_context.h" -#include "websocket_utils.h" -#endif // NETSTACK_WEBSOCKETSERVER namespace OHOS::NetStack::Websocket { -#ifdef NETSTACK_WEBSOCKETSERVER -struct ClientInfo { - int32_t cnt; - uint64_t lastConnectionTime; -}; - -struct WebSocketMessage { - std::string data; - WebSocketConnection connection; -}; -#endif - class WebSocketExec final { public: static bool CreatConnectInfo(ConnectContext *context, lws_context *lwsContext, @@ -53,18 +33,6 @@ public: static bool ExecClose(CloseContext *context); -#ifdef NETSTACK_WEBSOCKETSERVER - static bool ExecServerStart(ServerStartContext *context); - - static bool ExecListAllConnections(ListAllConnectionsContext *context); - - static bool ExecServerClose(ServerCloseContext *context); - - static bool ExecServerSend(ServerSendContext *context); - - static bool ExecServerStop(ServerStopContext *context); -#endif - /* async work callback */ static napi_value ConnectCallback(ConnectContext *context); @@ -74,20 +42,6 @@ public: static int LwsCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - static int lwsServerCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - -#ifdef NETSTACK_WEBSOCKETSERVER - static napi_value ServerStartCallback(ServerStartContext *context); - - static napi_value ListAllConnectionsCallback(ListAllConnectionsContext *context); - - static napi_value ServerCloseCallback(ServerCloseContext *context); - - static napi_value ServerSendCallback(ServerSendContext *context); - - static napi_value ServerStopCallback(ServerStopContext *context); -#endif - private: static bool ParseUrl(ConnectContext *context, char *prefix, size_t prefixLen, char *address, size_t addressLen, char *path, size_t pathLen, int *port); @@ -140,80 +94,6 @@ private: static void GetWebsocketProxyInfo(ConnectContext *context, std::string &host, uint32_t &port, std::string &exclusions); static void HandleRcvMessage(EventManager *manager, void *data, size_t length, bool isBinary, bool isFinal); - -#ifdef NETSTACK_WEBSOCKETSERVER - static int RaiseServerError(EventManager *manager, uint32_t httpResponse); - - static int LwsCallbackEstablished(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - - static int LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, - void *user, void *in, size_t len); - - static int LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - - static int LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - - static int LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, - void *user, void *in, size_t len); - - static int LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - - static int LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); - - static int LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, - void *user, void *in, size_t len); - - static void OnConnect(lws *wsi, EventManager *manager); - - static void OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, - const std::string &closeReason); - - static void OnServerMessage(lws *wsi, EventManager *manager, void *data, size_t length, - bool isBinary, bool isFinal); - - static void OnServerError(EventManager *manager, int32_t code); - - static void HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, - size_t length, bool isBinary, bool isFinal); - - static void SetWebsocketMessage(lws *wsi, EventManager *manager, const std::string &msg, void *dataMsg); - - static bool IsOverMaxClientConns(EventManager *manager); - - static bool IsAllowedProtocol(lws *wsi); - - static bool IsAllowConnection(const std::string &clientId); - - static bool IsIpInBanList(const std::string &id); - - static bool IsHighFreqConnection(const std::string &id); - - static void AddBanList(const std::string &id); - - static void UpdataClientList(const std::string &id); - - static lws* GetClientWsi(const std::string clientId); - - static uint64_t GetCurrentSecond(); - - static void CloseAllConnection(); - - static void FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, - lws_context_creation_info &info); - - static bool FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info); - - static void StartService(lws_context_creation_info &info, std::shared_ptr &manager); - - static void AddConnections(const std::string &Id, lws *wsi, std::shared_ptr &userData, - WebSocketConnection &conn); - - static void RemoveConnections(const std::string &Id, UserData &userData); - - static bool GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn); - - static std::vector GetConnections(); -#endif }; } // namespace OHOS::NetStack::Websocket #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_H */ diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h new file mode 100644 index 000000000..71773048f --- /dev/null +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H +#define COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H + +#include "server_start_context.h" +#include "list_all_connections_context.h" +#include "server_send_context.h" +#include "server_close_context.h" +#include "server_stop_context.h" +#include "websocket_utils.h" + +namespace OHOS::NetStack::Websocket { + +struct ClientInfo { + int32_t cnt; + uint64_t lastConnectionTime; +}; + +struct WebSocketMessage { + std::string data; + WebSocketConnection connection; +}; + +class WebSocketServerExec final { +public: + /* async work execute */ + static bool ExecServerStart(ServerStartContext *context); + + static bool ExecListAllConnections(ListAllConnectionsContext *context); + + static bool ExecServerClose(ServerCloseContext *context); + + static bool ExecServerSend(ServerSendContext *context); + + static bool ExecServerStop(ServerStopContext *context); + + static int lwsServerCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + /* async work callback */ + static napi_value ServerStartCallback(ServerStartContext *context); + + static napi_value ListAllConnectionsCallback(ListAllConnectionsContext *context); + + static napi_value ServerCloseCallback(ServerCloseContext *context); + + static napi_value ServerSendCallback(ServerSendContext *context); + + static napi_value ServerStopCallback(ServerStopContext *context); + +private: + static uint32_t GetHttpResponseFromWsi(lws *wsi); + + static int HttpDummy(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int RaiseServerError(EventManager *manager); + + static int LwsCallbackEstablished(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static int LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static int LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); + + static int LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len); + + static void OnConnect(lws *wsi, EventManager *manager); + + static void OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, + const std::string &closeReason); + + static void OnServerMessage(lws *wsi, EventManager *manager, void *data, size_t length, + bool isBinary, bool isFinal); + + static void OnServerError(EventManager *manager, int32_t code); + + static void HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal); + + static void SetWebsocketMessage(lws *wsi, EventManager *manager, const std::string &msg, void *dataMsg); + + static bool IsOverMaxClientConns(EventManager *manager); + + static bool IsAllowedProtocol(lws *wsi); + + static bool IsAllowConnection(const std::string &clientId); + + static bool IsIpInBlacklist(const std::string &id); + + static bool IsHighFreqConnection(const std::string &id); + + static void AddBlackList(const std::string &id); + + static void UpdataClientList(const std::string &id); + + static lws *GetClientWsi(const std::string clientId); + + static uint64_t GetCurrentSecond(); + + static void CloseAllConnection(const std::shared_ptr &userData); + + static void FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, + lws_context_creation_info &info); + + static bool FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info); + + static void StartService(lws_context_creation_info &info, std::shared_ptr &manager); + + static void AddConnections(const std::string &Id, lws *wsi, std::shared_ptr &userData, + WebSocketConnection &conn); + + static void RemoveConnections(const std::string &Id, UserData &userData); + + static bool GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn); + + static std::vector GetConnections(); +}; +} // namespace OHOS::NetStack::Websocket + #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_H */ \ No newline at end of file diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index 795f6c773..49ade0561 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -34,7 +34,7 @@ #include "http_proxy.h" #include "net_conn_client.h" #endif -#define LWS_PLUGIN_STATIC + static constexpr const char *PROTOCOL_DELIMITER = "//"; @@ -80,50 +80,8 @@ static constexpr const char *WEBSOCKET_SYSTEM_PREPARE_CA_PATH = "/etc/security/c static constexpr const char *WEBSOCKET_CLIENT_THREAD_RUN = "OS_NET_WSJsCli"; -#ifdef NETSTACK_WEBSOCKETSERVER -static constexpr const char *EVENT_KEY_CLIENT_PORT = "clientPort"; - -static constexpr const char *EVENT_KEY_CLIENT_IP = "clientIP"; - -static constexpr const char *EVENT_KEY_CONNECTION = "clientConnection"; - -static constexpr const char *EVENT_KEY_RESULT = "result"; - -static constexpr const char *EVENT_KEY_DATA = "data"; - -static constexpr const char *WEBSOCKET_SERVER_THREAD_RUN = "OS_NET_WSJsSer"; - -static constexpr const uint32_t MAX_CONCURRENT_CLIENTS_NUMBER = 10; - -static constexpr const uint32_t MAX_CONNECTIONS_FOR_ONE_CLIENT = 10; - -static constexpr const uint64_t ONE_MINUTE_IN_SEC = 60; - -static constexpr const int32_t MAX_CONNECTIONS_PER_MINUTE = 50; -#endif - namespace OHOS::NetStack::Websocket { -#ifdef NETSTACK_WEBSOCKETSERVER -static std::shared_mutex wsMutex_; - -static std::shared_mutex connListMutex_; - -static std::shared_mutex banListMutex_; - -static std::unordered_map banList; - -static std::unordered_map clientList; - -static std::unordered_map> webSocketConnection_; - -static const lws_protocols LWS_SERVER_PROTOCOLS[] = { - {"lws_server", WebSocketExec::lwsServerCallback, 0, 0 }, - { NULL, NULL, 0, 0 }, // this line is needed -}; -#endif - static const lws_protocols LWS_PROTOCOLS[] = { {"lws-minimal-client", WebSocketExec::LwsCallback, 0, 0}, {nullptr, nullptr, 0, 0}, // this line is needed @@ -146,38 +104,6 @@ struct OnOpenClosePara { std::string message; }; -#ifdef NETSTACK_WEBSOCKETSERVER -struct CloseResult { - uint32_t code; - std::string reason; -}; - -struct ClientConnectionCloseCallback { - WebSocketConnection connection; - CloseResult closeResult; -}; - -static const lws_http_mount mount = { - NULL, - "/", - "./mount-origin", - "index.html", - NULL, - NULL, - NULL, - NULL, - 0, - 0, - 0, - 0, - 0, - 0, - LWSMPRO_FILE, - 1, - NULL, -}; -#endif - static const std::vector WS_PREFIX = {PREFIX_WSS, PREFIX_WS}; class UserData { @@ -386,14 +312,6 @@ int WebSocketExec::RaiseError(EventManager *manager, uint32_t httpResponse) return -1; } -#ifdef NETSTACK_WEBSOCKETSERVER -int WebSocketExec::RaiseServerError(EventManager *manager, uint32_t httpResponse) -{ - OnServerError(manager, COMMON_ERROR_CODE); - return -1; -} -#endif - uint32_t WebSocketExec::GetHttpResponseFromWsi(lws *wsi) { if (wsi == nullptr) { @@ -691,441 +609,6 @@ int WebSocketExec::LwsCallback(lws *wsi, lws_callback_reasons reason, void *user return HttpDummy(wsi, reason, user, in, len); } -#ifdef NETSTACK_WEBSOCKETSERVER -int WebSocketExec::lwsServerCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) -{ - NETSTACK_LOGI("lws server callback reason is %{public}d", reason); - CallbackDispatcher dispatchers[] = { - {LWS_CALLBACK_ESTABLISHED, LwsCallbackEstablished}, - {LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, LwsCallbackFilterProtocolConnection}, - {LWS_CALLBACK_RECEIVE, LwsCallbackReceive}, - {LWS_CALLBACK_SERVER_WRITEABLE, LwsCallbackServerWriteable}, - {LWS_CALLBACK_WS_PEER_INITIATED_CLOSE, LwsCallbackWsPeerInitiatedCloseServer}, - {LWS_CALLBACK_CLOSED, LwsCallbackClosed}, - {LWS_CALLBACK_WSI_DESTROY, LwsCallbackWsiDestroyServer}, - {LWS_CALLBACK_PROTOCOL_DESTROY, LwsCallbackProtocolDestroyServer}, - }; - for (const auto dispatcher : dispatchers) { - if (dispatcher.reason == reason) { - return dispatcher.callback(wsi, reason, user, in, len); - } - } - return HttpDummy(wsi, reason, user, in, len); -} - -int WebSocketExec::LwsCallbackEstablished(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws callback server established"); - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { - NETSTACK_LOGE("manager is null"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } -// bind clientuserdata with wsi - lws_context* lwsContext = lws_get_context(wsi); - std::shared_ptr clientUserData; - clientUserData = std::make_shared(lwsContext); - lws_set_wsi_user(wsi, clientUserData.get()); - - std::string clientId; - WebSocketConnection connection; - bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); - if (!ret) { - NETSTACK_LOGE("GetPeerConnMsg failed"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - NETSTACK_LOGI("connection clientip=%{public}s, clientport=%{public}d", - connection.clientIP.c_str(), connection.clientPort); - AddConnections(clientId, wsi, userData, connection); - clientUserData->SetLws(wsi); - clientUserData->TriggerWritable(); - OnConnect(wsi, manager); - return HttpDummy(wsi, reason, user, in, len); -} - -bool WebSocketExec::GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn) -{ - struct sockaddr_storage addr{}; - socklen_t addrLen = sizeof(addr); - int ret = getpeername(lws_get_socket_fd(wsi), reinterpret_cast(&addr), &addrLen); - if (ret != 0) { - NETSTACK_LOGE("getpeername failed"); - return false; - } - char ipStr[INET6_ADDRSTRLEN] = {0}; - if (addr.ss_family == AF_INET) { - NETSTACK_LOGI("family is ipv4"); - auto *addrIn = reinterpret_cast(&addr); - inet_ntop(AF_INET, &addrIn->sin_addr, ipStr, sizeof(ipStr)); - uint16_t port = ntohs(addrIn->sin_port); - conn.clientPort = static_cast(port); - conn.clientIP = ipStr; - clientId = std::string(ipStr) + ":" + std::to_string(port); - } else if (addr.ss_family == AF_INET6) { - NETSTACK_LOGI("family is ipv6"); - auto *addrIn6 = reinterpret_cast(&addr); - inet_ntop(AF_INET6, &addrIn6->sin6_addr, ipStr, sizeof(ipStr)); - uint16_t port = ntohs(addrIn6->sin6_port); - conn.clientPort = static_cast(port); - conn.clientIP = ipStr; - clientId = std::string(ipStr) + ":" + std::to_string(port); - } else { - NETSTACK_LOGE("getpeer Ipv4 or Ipv6 failed"); - return false; - } - return true; -} - -bool WebSocketExec::IsOverMaxClientConns(EventManager *manager) -{ - std::vector connection = GetConnections(); - if (connection.size() >= manager->GetMaxConnClientCnt() * manager->GetMaxConnForOneClient()) { - NETSTACK_LOGE("current connections is over limit"); - return true; - } - return false; -} - -void WebSocketExec::AddConnections(const std::string &Id, lws *wsi, - std::shared_ptr &userData, WebSocketConnection &conn) -{ - if (userData->IsClosed() || userData->IsThreadStop()) { - NETSTACK_LOGE("AddConnections failed: session %s", userData->IsClosed() ? "closed" : "thread stopped"); - return; - } - { - std::unique_lock lock(wsMutex_); - webSocketConnection_[Id].first = wsi; - webSocketConnection_[Id].second = conn; - NETSTACK_LOGI("AddConnections success"); - } -} - -int WebSocketExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) -{ - NETSTACK_LOGD("lws callback server closed"); - if (wsi ==nullptr) { - NETSTACK_LOGE("wsi is null"); - return -1; - } - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { - NETSTACK_LOGE("manager is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - auto clientUserData = reinterpret_cast(lws_wsi_user(wsi)); - if (clientUserData == nullptr) { - NETSTACK_LOGE("clientUserData is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - clientUserData->SetThreadStop(true); - if ((clientUserData->closeReason).empty()) { - clientUserData->Close(clientUserData->closeStatus, LINK_DOWN); - } - if (clientUserData->closeStatus == LWS_CLOSE_STATUS_NOSTATUS) { - NETSTACK_LOGE("The link is down, onError"); - OnServerError(manager, COMMON_ERROR_CODE); - } - std::string clientId; - { - std::shared_lock lock(wsMutex_); - for (auto it = webSocketConnection_.begin(); it != webSocketConnection_.end(); ++it) { - if (it->second.first == wsi) { - clientId = it->first; - } - } - } - OnServerClose(wsi, manager, clientUserData->closeStatus, clientUserData->closeReason); - RemoveConnections(clientId, *clientUserData); - if (userData->IsClosed() && webSocketConnection_.empty()) { - NETSTACK_LOGI("server service is stopped"); - userData->SetThreadStop(true); - } - return HttpDummy(wsi, reason, user, in, len); -} - -void WebSocketExec::RemoveConnections(const std::string &id, UserData &userData) -{ - if (webSocketConnection_.empty()) { - NETSTACK_LOGE("connection list is empty"); - return; - } - { - std::unique_lock lock(wsMutex_); - if (webSocketConnection_.find(id) == webSocketConnection_.end()) { - NETSTACK_LOGE("connection list find clientId failed"); - return; - } - webSocketConnection_.erase(id); - NETSTACK_LOGI("connection erase success"); - } -} - -int WebSocketExec::LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws server callback wsi destroy"); - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is null"); - return -1; - } - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { - NETSTACK_LOGE("manager is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - userData->SetLws(nullptr); - return HttpDummy(wsi, reason, user, in, len); -} - -int WebSocketExec::LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws server callback protocol destroy"); - return HttpDummy(wsi, reason, user, in, len); -} - -int WebSocketExec::LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws callback Server writable"); - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { - NETSTACK_LOGE("manager is null"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - // server - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - if (userData->IsThreadStop()) { - NETSTACK_LOGI("session is stopped"); - return -1; - } - // client - auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); - if (clientUserData == nullptr) { - NETSTACK_LOGE("clientUserData is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - if (clientUserData->IsClosed()) { - NETSTACK_LOGI("client is closed, need to close"); - lws_close_reason(wsi, clientUserData->closeStatus, - reinterpret_cast(const_cast(clientUserData->closeReason.c_str())), - strlen(clientUserData->closeReason.c_str())); - return -1; - } - auto sendData = clientUserData->Pop(); - if (sendData.data == nullptr || sendData.length == 0) { - NETSTACK_LOGE("send data is empty"); - return HttpDummy(wsi, reason, user, in, len); - } - int sendLength = lws_write(wsi, reinterpret_cast(sendData.data) + LWS_SEND_BUFFER_PRE_PADDING, - sendData.length, sendData.protocol); - free(sendData.data); - NETSTACK_LOGD("lws send data length is %{public}d", sendLength); - if (!userData->IsEmpty()) { - NETSTACK_LOGE("userData is not empty"); - userData->TriggerWritable(); - } - return HttpDummy(wsi, reason, user, in, len); -} - -int WebSocketExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws server callback ws peer initiated close"); - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is null"); - return -1; - } - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - - if (in == nullptr || len < sizeof(uint16_t)) { - NETSTACK_LOGI("No close reason"); - userData->Close(LWS_CLOSE_STATUS_NORMAL, ""); - return HttpDummy(wsi, reason, user, in, len); - } - - uint16_t closeStatus = ntohs(*reinterpret_cast(in)); - std::string closeReason; - closeReason.append(reinterpret_cast(in) + sizeof(uint16_t), len - sizeof(uint16_t)); - auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); - clientUserData->Close(static_cast(closeStatus), closeReason); - return HttpDummy(wsi, reason, user, in, len); -} - -int WebSocketExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws server callback filter ProtocolConnection"); - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { - NETSTACK_LOGE("manager is null"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is null"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - if (userData->IsClosed() || userData->IsThreadStop()) { - NETSTACK_LOGE("session is closed or thread is stopped"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - if (!IsAllowedProtocol(wsi)) { - NETSTACK_LOGE("protocol is not allowed"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - /* 是否超过最大连接数 */ - if (IsOverMaxClientConns(manager)) { - NETSTACK_LOGE("current connections count is more than limit, need to close"); - return RaiseServerError(manager, GetHttpResponseFromWsi(wsi)); - } - /* 添加防止恶意连接的业务逻辑 */ - std::string clientId; - WebSocketConnection connection; - bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); - if (!ret) { - NETSTACK_LOGE("GetPeerConnMsg failed"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - if (!IsAllowConnection(clientId)) { - NETSTACK_LOGE("Rejected malicious connection"); - return RaiseError(manager, GetHttpResponseFromWsi(wsi)); - } - return HttpDummy(wsi, reason, user, in, len); -} - -bool WebSocketExec::IsAllowConnection(const std::string &clientId) -{ - if (IsIpInBanList(clientId)) { - NETSTACK_LOGE("clientid is in banList"); - return false; - } - if (IsHighFreqConnection(clientId)) { - NETSTACK_LOGE("clientid reach high frequency connection"); - AddBanList(clientId); - return false; - } - UpdataClientList(clientId); - return true; -} - -void WebSocketExec::UpdataClientList(const std::string &id) -{ - std::shared_lock lock(connListMutex_); - auto it = clientList.find(id); - if (it == clientList.end()) { - NETSTACK_LOGI("add clientid to banList"); - clientList[id] = {1, GetCurrentSecond()}; - } else { - auto now = GetCurrentSecond() - it->second.lastConnectionTime; - if (now > ONE_MINUTE_IN_SEC) { - NETSTACK_LOGI("reset clientid connections cnt"); - it->second = {1, GetCurrentSecond()}; - } else { - it->second.cnt++; - } - } -} - -void WebSocketExec::AddBanList(const std::string &id) -{ - std::shared_lock lock(banListMutex_); - banList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; -} - -bool WebSocketExec::IsIpInBanlist(const std::string &id) -{ - std::shared_lock lock(banListMutex_); - auto it = banList.find(id); - if (it != banList.end()) { - auto now = GetCurrentSecond(); - if (now < it->second) { - return true; - } else { - banList.erase(it); - } - } - return false; -} - -uint64_t WebSocketExec::GetCurrentSecond() -{ - return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()) - .count(); -} - -bool WebSocketExec::IsHighFreqConnection(const std::string &id) -{ - std::shared_lock lock(connListMutex_); - auto it = clientList.find(id); - if (it != clientList.end()) { - auto duration = GetCurrentSecond() - it->second.lastConnectionTime; - if (duration <= ONE_MINUTE_IN_SEC) { - return it->second.cnt > MAX_CONNECTIONS_PER_MINUTE; - } - } - return false; -} - -bool WebSocketExec::IsAllowedProtocol(lws *wsi) -{ - char requested_protocol[128] = {0}; - int32_t res = lws_hdr_copy(wsi, requested_protocol, sizeof(requested_protocol), WSI_TOKEN_PROTOCOL); - if (res < 0) { - NETSTACK_LOGE("fail to read protocol"); - return true; - } - if (strcmp(requested_protocol, "lws_server") != 0) { - NETSTACK_LOGE("Protocol mismatch: client requested: %{public}s, server expects lws_server", requested_protocol); - return true; - } - return true; -} - -int WebSocketExec::LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) -{ - NETSTACK_LOGD("lws callback server receive"); - lws_context* context = lws_get_context(wsi); - EventManager* manager = static_cast(lws_context_user(context)); - auto isFinal = lws_is_final_fragment(wsi); - OnServerMessage(wsi, manager, in, len, lws_frame_is_binary(wsi), isFinal); - return HttpDummy(wsi, reason, user, in, len); -} -#endif - void WebSocketExec::FillContextInfo(ConnectContext *context, lws_context_creation_info &info, char *proxyAds) { info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; @@ -1477,261 +960,16 @@ static napi_value CreateBinaryMessagePara(napi_env env, void *callbackPara) return NapiUtils::GetUndefined(env); } -#ifdef NETSTACK_WEBSOCKETSERVER -static napi_value CreateServerClosePara(napi_env env, void *callbackPara) +void WebSocketExec::OnError(EventManager *manager, int32_t code, uint32_t httpResponse) { - auto para = reinterpret_cast(callbackPara); - auto deleter = [](const ClientConnectionCloseCallback *p) { delete p; }; - std::unique_ptr handler(para, deleter); - napi_value obj = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, obj) != napi_object) { - return NapiUtils::GetUndefined(env); - } - napi_value jsConn = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsConn) != napi_object) { - return NapiUtils::GetUndefined(env); + NETSTACK_LOGI("OnError %{public}d", code); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; } - NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, para->connection.clientIP); - NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, para->connection.clientPort); - NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_CONNECTION, jsConn); - napi_value jsRes = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsRes) != napi_object) { - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetUint32Property(env, jsRes, EVENT_KEY_CODE, para->closeResult.code); - NapiUtils::SetStringPropertyUtf8(env, jsRes, EVENT_KEY_REASON, para->closeResult.reason); - NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_RESULT, jsConn); - return obj; -} - -static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessage* msg) -{ - napi_value jsMsg = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { - return NapiUtils::GetUndefined(env); - } - void *data = nullptr; - napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(env, msg->data.size(), &data); - if (data != nullptr && NapiUtils::ValueIsArrayBuffer(env, arrayBuffer) && - memcpy_s(data, msg->data.size(), msg->data.c_str(), msg->data.size()) >= 0) { - NapiUtils::SetNamedProperty(env, jsMsg, "data", arrayBuffer); - napi_value jsConn = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsConn) != napi_object) { - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); - NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); - NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); - return jsMsg; - } - return NapiUtils::GetUndefined(env); -} - -static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) -{ - auto pair = reinterpret_cast> *>(callbackPara); - if (pair == nullptr) { - NETSTACK_LOGE("pair is nullptr"); - return NapiUtils::GetUndefined(env); - } - lws *wsi = pair->first; - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is nullptr"); - return NapiUtils::GetUndefined(env); - } - auto &manager = pair->second; - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is nullptr"); - return NapiUtils::CreateStringUtf8(env, ""); - } - auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); - if (!msg) { - NETSTACK_LOGE("msg is nullptr"); - return NapiUtils::GetUndefined(env); - } - napi_value jsMsg = ConvertWsBinaryMessageToJs(env, msg); - if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { - delete msg; - return NapiUtils::GetUndefined(env); - } - delete msg; - return jsMsg; -} - -static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage* msg) -{ - napi_value jsMsg = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetStringPropertyUtf8(env, jsMsg, EVENT_KEY_DATA, msg->data); - napi_value jsConn = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, jsConn) != napi_object) { - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); - NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); - NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); - return jsMsg; -} - -static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) -{ - auto pair = reinterpret_cast> *>(callbackPara); - if (pair == nullptr) { - NETSTACK_LOGE("pair is nullptr"); - return NapiUtils::GetUndefined(env); - } - lws *wsi = pair->first; - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is nullptr"); - return NapiUtils::GetUndefined(env); - } - auto &manager = pair->second; - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is nullptr"); - return NapiUtils::CreateStringUtf8(env, ""); - } - auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); - if (!msg) { - NETSTACK_LOGE("msg is nullptr"); - return NapiUtils::GetUndefined(env); - } - napi_value jsMsg = ConvertWsTextMessageToJs(env, msg); - if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { - NETSTACK_LOGE("jsMsg is not object"); - delete msg; - return NapiUtils::GetUndefined(env); - } - delete msg; - return jsMsg; -} - -static napi_value CreateConnectPara(napi_env env, void *callbackPara) -{ - auto para = reinterpret_cast(callbackPara); - auto deleter = [](const WebSocketConnection *p) { delete p;}; - std::unique_ptr handler(para, deleter); - napi_value obj = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, obj) != napi_object) { - NETSTACK_LOGE("napi_object not found"); - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetUint32Property(env, obj, EVENT_KEY_CLIENT_PORT, para->clientPort); - NapiUtils::SetStringPropertyUtf8(env, obj, EVENT_KEY_CLIENT_IP, para->clientIP); - return obj; -} - -static napi_value CreateServerError(napi_env env, void *callbackPara) -{ - auto code = reinterpret_cast(callbackPara); - if (code == nullptr) { - NETSTACK_LOGE("code is nullptr"); - } - auto deleter = [](int32_t *p) { delete p; }; - std::unique_ptr handler(code, deleter); - napi_value err = NapiUtils::CreateObject(env); - if (NapiUtils::GetValueType(env, err) != napi_object) { - return NapiUtils::GetUndefined(env); - } - NapiUtils::SetInt32Property(env, err, EVENT_KEY_CODE, *code); - return err; -} - -void WebSocketExec::OnServerError(EventManager *manager, int32_t code) -{ - NETSTACK_LOGI("OnServerError %{public}d", code); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_ERROR); - if (!hasServerEventListener) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_ERROR); - return; - } - auto para = new int32_t(code); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); -} - -void WebSocketExec::OnConnect(lws *wsi, EventManager *manager) -{ - NETSTACK_LOGI("OnConnect enter"); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - bool hasServerConnectListener = manager->HasEventListener(EventName::EVENT_SERVER_CONNECT); - if (!hasServerConnectListener) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CONNECT); - return; - } - { - std::shared_lock lock(wsMutex_); - auto para = new WebSocketConnection; - for (auto [id, connPair] : webSocketConnection_) { - if (connPair.first == wsi) { - para->clientIP = connPair.second.clientIP; - para->clientPort = connPair.second.clientPort; - NETSTACK_LOGI("connection find ok, clientId:%{public}s", id.c_str()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CONNECT, - para, CallbackTemplate); - return; - } - } - } - NETSTACK_LOGE("not found client msg"); -} - -void WebSocketExec::OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, - const std::string &closeReason) -{ - NETSTACK_LOGI("OnServerClose %{public}u %{public}s", closeStatus, closeReason.c_str()); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - bool hasServerCloseListener = manager->HasEventListener(EventName::EVENT_SERVER_CLOSE); - if (!hasServerCloseListener) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CLOSE); - return; - } - auto conn = new ClientConnectionCloseCallback; - if (conn == nullptr) { - return; - } - conn->closeResult.code = closeStatus; - conn->closeResult.reason = closeReason; - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is nullptr"); - return; - } - { - std::shared_lock lock(wsMutex_); - for (auto [id, connPair] : webSocketConnection_) { - if (connPair.first == wsi) { - conn->connection = connPair.second; - NETSTACK_LOGI("clientId: %{public}s", id.c_str()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CLOSE, - conn, CallbackTemplate); - return; - } - } - } - NETSTACK_LOGE("not found client msg"); -} -#endif - -void WebSocketExec::OnError(EventManager *manager, int32_t code, uint32_t httpResponse) -{ - NETSTACK_LOGI("OnError %{public}d", code); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - if (!manager->HasEventListener(EventName::EVENT_ERROR)) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_ERROR); - return; + if (!manager->HasEventListener(EventName::EVENT_ERROR)) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_ERROR); + return; } auto pair = new std::pair; pair->first = code; @@ -1842,101 +1080,6 @@ void WebSocketExec::HandleRcvMessage(EventManager *manager, void *data, size_t l } } -#ifdef NETSTACK_WEBSOCKETSERVER -void WebSocketExec::OnServerMessage(lws *wsi, EventManager *manager, void *data, - size_t length, bool isBinary, bool isFinal) -{ - NETSTACK_LOGD("server OnMessage %{public}d", isBinary); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_MESSAGE_RECEIVE); - if (!hasServerEventListener) { - NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_MESSAGE_RECEIVE); - return; - } - if (length > INT32_MAX) { - NETSTACK_LOGE("data length too long"); - return; - } - HandleServerRcvMessage(wsi, manager, data, length, isBinary, isFinal); -} - - -void WebSocketExec::HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, - size_t length, bool isBinary, bool isFinal) -{ - if (isBinary) { - manager->AppendWsServerBinaryData(wsi, data, length); - if (isFinal) { - const std::string &msgFromManager = manager->GetWsServerBinaryData(wsi); - auto msg = new WebSocketMessage; - if (msg == nullptr) { - return; - } - SetWebsocketMessage(wsi, manager, msgFromManager, msg); - manager->SetServerQueueData(wsi, msg); - auto callbackPara = std::make_shared>>(wsi, - manager->shared_from_this()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), - CallbackTemplate); - manager->ClearWsServerBinaryData(wsi); - } - } else { - manager->AppendWsServerTextData(wsi, data, length); - if (isFinal) { - const std::string &msgFromManager = manager->GetWsServerTextData(wsi); - if (msgFromManager.empty()) { - NETSTACK_LOGE("msgFromManager is empty"); - return; - } - auto msg = new WebSocketMessage; - if (msg == nullptr) { - return; - } - SetWebsocketMessage(wsi, manager, msgFromManager, msg); - manager->SetServerQueueData(wsi, msg); - auto callbackPara = std::make_shared>>(wsi, - manager->shared_from_this()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), - CallbackTemplate); - manager->ClearWsServerTextData(wsi); - } - } -} - -void WebSocketExec::SetWebsocketMessage(lws *wsi, EventManager *manager, - const std::string &msgFromManager, void *dataMsg) -{ - NETSTACK_LOGD("SetWebsocketMessage enter"); - if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { - NETSTACK_LOGE("manager is null"); - return; - } - if (wsi == nullptr) { - NETSTACK_LOGE("wsi is nullptr"); - return; - } - auto webSocketMessage = static_cast(dataMsg); - webSocketMessage->data = msgFromManager; - { - std::shared_lock lock(wsMutex_); - if (webSocketConnection_.empty()) { - NETSTACK_LOGE("webSocketConnection_ is empty"); - return; - } - for (auto [_, connPair] : webSocketConnection_) { - if (connPair.first == wsi) { - webSocketMessage->connection = connPair.second; - return; - } - } - } - NETSTACK_LOGE("not found client msgFromManager"); -} -#endif - void WebSocketExec::OnHeaderReceive(EventManager *manager, const std::map &headers) { if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -1968,340 +1111,4 @@ void WebSocketExec::GetWebsocketProxyInfo(ConnectContext *context, std::string & context->GetSpecifiedWebsocketProxy(host, port, exclusions); } } - -#ifdef NETSTACK_WEBSOCKETSERVER -bool WebSocketExec::ExecServerStart(ServerStartContext *context) -{ - NETSTACK_LOGD("websocket server start exec"); - if (context == nullptr) { - NETSTACK_LOGE("context is nullptr"); - return false; - } - if (!CommonUtils::HasInternetPermission()) { - context->SetPermissionDenied(true); - return false; - } - if (!CommonUtils::IsValidIPV4(context->GetServerIP()) && - !CommonUtils::IsValidIPV6(context->GetServerIP())) { - NETSTACK_LOGE("IPV4 and IPV6 are not valid"); - context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_NIC); - return false; - } - if (!CommonUtils::IsValidPort(context->GetServerPort())) { - context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_PORT); - NETSTACK_LOGE("Port is not valid"); - return false; - } - if (context->GetMaxConcurrentClientsNumber() > MAX_CONCURRENT_CLIENTS_NUMBER) { - NETSTACK_LOGE("concurrent clients number is over limit"); - return false; - } - auto manager = context->GetSharedManager(); - if (manager == nullptr) { - return false; - } - manager->SetMaxConnClientCnt(context->GetMaxConcurrentClientsNumber()); - if (context->GetMaxConnectionsForOneClient() > MAX_CONNECTIONS_FOR_ONE_CLIENT) { - NETSTACK_LOGE("connection number for one client is over limit"); - return false; - } - manager->SetMaxConnForOneClient(context->GetMaxConnectionsForOneClient()); - - lws_context_creation_info info = {}; - FillServerContextInfo(context, manager, info); - if (!FillServerCertPath(context, info)) { - NETSTACK_LOGE("FillServerCertPath error"); - return false; - } - StartService(info, manager); - return true; -} - -void WebSocketExec::StartService(lws_context_creation_info &info, std::shared_ptr &manager) -{ - lws_context *lwsContext = nullptr; - std::shared_ptr userData; - lwsContext = lws_create_context(&info); - userData = std::make_shared(lwsContext); - manager->SetWebSocketUserData(userData); - std::thread serviceThread(RunService, userData, manager); - -#if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) - pthread_setname_np(WEBSOCKET_SERVER_THREAD_RUN); -#else - pthread_setname_np(serviceThread.native_handle(), WEBSOCKET_SERVER_THREAD_RUN); -#endif - serviceThread.detach(); -} - -void WebSocketExec::FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, - lws_context_creation_info &info) -{ - info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; - info.port = context->GetServerPort(); - info.mounts = &mount; - info.protocols = LWS_SERVER_PROTOCOLS; - info.vhost_name = "localhost"; - info.user = manager.get(); -// maybe - info.gid = -1; - info.uid = -1; - info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; -} - -bool WebSocketExec::FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info) -{ - if (!context->certPath_.empty()) { - if (!CheckFilePath(context->certPath_) || !CheckFilePath(context->keyPath_)) { - NETSTACK_LOGE("client cert not exist"); - context->SetErrorCode(WEBSOCKET_ERROR_CODE_FILE_NOT_EXIST); - return false; - } - info.ssl_cert_filepath = context->certPath_.c_str(); - info.ssl_private_key_filepath = context->keyPath_.c_str(); - } - return true; -} - -bool WebSocketExec::ExecListAllConnections(ListAllConnectionsContext *context) -{ - NETSTACK_LOGD("ListAllConnections start exec"); - if (context == nullptr) { - NETSTACK_LOGE("context is nullptr"); - return false; - } - if (!CommonUtils::HasInternetPermission()) { - context->SetPermissionDenied(true); - return false; - } - auto manager = context->GetSharedManager(); - if (manager == nullptr) { - NETSTACK_LOGE("context is null"); - return false; - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is nullptr"); - return false; - } - - if (userData->IsClosed() || userData->IsThreadStop()) { - NETSTACK_LOGE("session is closed or stopped"); - return false; - } - std::vector connection = GetConnections(); - context->SetAllConnections(connection); - NETSTACK_LOGI("ExecListAllConnections OK"); - return true; -} - -std::vector WebSocketExec::GetConnections() -{ - std::shared_lock lock(wsMutex_); - std::vector conn; - if (!webSocketConnection_.empty()) { - for (auto [_, connPair] : webSocketConnection_) { - conn.emplace_back(connPair.second); - } - } - return conn; -} - -bool WebSocketExec::ExecServerClose(ServerCloseContext *context) -{ - if (context == nullptr) { - NETSTACK_LOGE("context is nullptr"); - return false; - } - if (!CommonUtils::HasInternetPermission()) { - context->SetPermissionDenied(true); - return false; - } - if (context->GetSharedManager() == nullptr) { - NETSTACK_LOGE("context is null"); - return false; - } - WebSocketConnection conn = context->GetConnection(); - if (conn.clientIP.empty()) { - NETSTACK_LOGE("connection is empty"); - return false; - } - std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); - NETSTACK_LOGI("ExecServerClose, clientID:%{public}s", clientId.c_str()); - auto wsi = GetClientWsi(clientId); - if (wsi == nullptr) { - context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); - NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); - return false; - } - auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); - if (clientUserData == nullptr) { - NETSTACK_LOGE("clientUser data is nullptr"); - return false; - } - if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { - NETSTACK_LOGE("session is closed or stopped"); - return false; - } - clientUserData->Close(static_cast(context->code), context->reason); - clientUserData->TriggerWritable(); - NETSTACK_LOGI("ExecServerClose OK"); - return true; -} - -bool WebSocketExec::ExecServerSend(ServerSendContext *context) -{ - if (context == nullptr) { - NETSTACK_LOGE("context is nullptr"); - return false; - } - if (!CommonUtils::HasInternetPermission()) { - context->SetPermissionDenied(true); - return false; - } - WebSocketConnection conn = context->GetConnection(); - if (conn.clientIP.empty()) { - NETSTACK_LOGE("connection is empty"); - return false; - } - std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); - NETSTACK_LOGI("connection clientid:%{public}s", clientId.c_str()); - auto wsi = GetClientWsi(clientId); - if (wsi == nullptr) { - context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); - NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); - return false; - } - auto* clientUserData = reinterpret_cast(lws_wsi_user(wsi)); - if (clientUserData == nullptr) { - NETSTACK_LOGE("clientUser data is nullptr"); - return false; - } - if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { - NETSTACK_LOGE("session is closed or stopped"); - return false; - } - clientUserData->Push(context->data, context->length, context->protocol); - clientUserData->TriggerWritable(); - NETSTACK_LOGD("lws ts send success"); - return true; -} - -lws* WebSocketExec::GetClientWsi(const std::string clientId) -{ - std::shared_lock lock(wsMutex_); - if (webSocketConnection_.empty()) { - NETSTACK_LOGE("webSocketConnection is empty"); - return nullptr; - } - auto it = webSocketConnection_.find(clientId); - if (it == webSocketConnection_.end()) { - NETSTACK_LOGE("can't find clientId"); - return nullptr; - } - return it->second.first; -} - -bool WebSocketExec::ExecServerStop(ServerStopContext *context) -{ - if (context == nullptr) { - NETSTACK_LOGE("context is nullptr"); - return false; - } - if (!CommonUtils::HasInternetPermission()) { - context->SetPermissionDenied(true); - return false; - } - auto manager = context->GetSharedManager(); - if (manager == nullptr) { - NETSTACK_LOGE("context is null"); - return false; - } - auto userData = manager->GetWebSocketUserData(); - if (userData == nullptr) { - NETSTACK_LOGE("user data is nullptr"); - return false; - } - if (userData->IsClosed() || userData->IsThreadStop()) { - NETSTACK_LOGE("session is closed or stopped"); - return false; - } - CloseAllConnection(); - userData->Close(LWS_CLOSE_STATUS_GOINGAWAY, ""); - NETSTACK_LOGI("ExecServerStop OK"); - return true; -} - -void WebSocketExec::CloseAllConnection() -{ - decltype(webSocketConnection_) connListTmp; - { - std::shared_lock lock(wsMutex_); - if (webSocketConnection_.empty()) { - NETSTACK_LOGE("webSocketConnection is empty"); - return; - } - connListTmp = webSocketConnection_; - } - const char* closeReason = "server is going away"; - for (auto [id, connPair] : connListTmp) { - if (connPair.first == nullptr) { - NETSTACK_LOGE("clientId not found:%{public}s", id.c_str()); - continue; - } - auto* clientUserData = reinterpret_cast(lws_wsi_user(connPair.first)); - clientUserData->Close(LWS_CLOSE_STATUS_GOINGAWAY, closeReason); - clientUserData->TriggerWritable(); - } - NETSTACK_LOGI("CloseAllConnection OK"); -} - -napi_value WebSocketExec::ServerStartCallback(ServerStartContext *context) -{ - return NapiUtils::GetBoolean(context->GetEnv(), true); -} - -napi_value WebSocketExec::ListAllConnectionsCallback(ListAllConnectionsContext *context) -{ - if (context == nullptr) { - NETSTACK_LOGE("Context is null"); - return nullptr; - } - napi_value connectionsArray = NapiUtils::CreateArray(context->GetEnv(), 0); - const std::vector connections = context->GetAllConnections(); - if (connections.empty()) { - NETSTACK_LOGE("connections list is null"); - return connectionsArray; - } - uint32_t index = 0; - for (const auto &conn : connections) { - napi_value jsConn = NapiUtils::CreateObject(context->GetEnv()); - NapiUtils::SetUint32Property(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_PORT, conn.clientPort); - NapiUtils::SetStringPropertyUtf8(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_IP, conn.clientIP); - NapiUtils::SetArrayElement(context->GetEnv(), connectionsArray, index, jsConn); - ++index; - } - return connectionsArray; -} - -napi_value WebSocketExec::ServerSendCallback(ServerSendContext *context) -{ - return NapiUtils::GetBoolean(context->GetEnv(), true); -} - -napi_value WebSocketExec::ServerCloseCallback(ServerCloseContext *context) -{ - return NapiUtils::GetBoolean(context->GetEnv(), true); -} - -napi_value WebSocketExec::ServerStopCallback(ServerStopContext *context) -{ - auto manager = context->GetSharedManager(); - if (manager != nullptr) { - NETSTACK_LOGD("websocket close, delete js ref"); - manager->DeleteEventReference(context->GetEnv()); - } - return NapiUtils::GetBoolean(context->GetEnv(), true); -} -#endif } // namespace OHOS::NetStack::Websocket diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp new file mode 100644 index 000000000..230a702af --- /dev/null +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -0,0 +1,1416 @@ +/* + * Copyright (c) 2022-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include "websocket_server_exec.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "constant.h" +#include "napi_utils.h" +#include "netstack_common_utils.h" +#include "netstack_log.h" +#include "securec.h" +#define LWS_PLUGIN_STATIC + +static constexpr const char *EVENT_KEY_CLIENT_PORT = "clientPort"; + +static constexpr const char *EVENT_KEY_CLIENT_IP = "clientIP"; + +static constexpr const char *EVENT_KEY_CONNECTION = "clientConnection"; + +static constexpr const char *EVENT_KEY_RESULT = "result"; + +static constexpr const char *EVENT_KEY_DATA = "data"; + +static constexpr const char *EVENT_KEY_CODE = "code"; + +static constexpr const char *EVENT_KEY_REASON = "reason"; + +static constexpr const char *WEBSOCKET_SERVER_THREAD_RUN = "OS_NET_WSJsSer"; + +static constexpr const char *LINK_DOWN = "The link is down"; + +static constexpr const uint32_t MAX_CONCURRENT_CLIENTS_NUMBER = 10; + +static constexpr const uint32_t MAX_CONNECTIONS_FOR_ONE_CLIENT = 10; + +static constexpr const uint64_t ONE_MINUTE_IN_SEC = 60; + +static constexpr const int32_t MAX_CONNECTIONS_PER_MINUTE = 50; + +static constexpr const int32_t COMMON_ERROR_CODE = 200; + +namespace OHOS::NetStack::Websocket { + +static std::shared_mutex wsMutex_; + +static std::shared_mutex connListMutex_; + +static std::shared_mutex blackListMutex_; + +static std::unordered_map blackList; + +static std::unordered_map clientList; + +static std::unordered_map> webSocketConnection_; + +static const lws_protocols LWS_SERVER_PROTOCOLS[] = { + {"lws_server", WebSocketServerExec::lwsServerCallback, 0, 0}, + {NULL, NULL, 0, 0}, // this line is needed +}; + +struct CloseResult { + uint32_t code; + std::string reason; +}; + +struct ClientConnectionCloseCallback { + WebSocketConnection connection; + CloseResult closeResult; +}; + +struct CallbackDispatcher { + lws_callback_reasons reason; + int (*callback)(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); +}; + +static const lws_http_mount mount = { + NULL, + "/", + "./mount-origin", + "index.html", + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 0, + 0, + LWSMPRO_FILE, + 1, + NULL, +}; + +class UserData { +public: + struct SendData { + SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) + :data(paraData), length(paraLength), protocol(paraProtocol) + { + } + + SendData() = delete; + + ~SendData() = default; + + void *data; + size_t length; + lws_write_protocol protocol; + }; + + explicit UserData(lws_context *context) + :closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) + { + } + + bool IsClosed() + { + std::lock_guard lock(mutex_); + return closed_; + } + + bool IsThreadStop() + { + return threadStop_.load(); + } + + void SetThreadStop(bool threadStop) + { + threadStop_.store(threadStop); + } + + void Close(lws_close_status status, const std::string &reason) + { + std::lock_guard lock(mutex_); + closeStatus = status; + closeReason = reason; + closed_ = true; + } + + void Push(void *data, size_t length, lws_write_protocol protocol) + { + std::lock_guard lock(mutex_); + dataQueue_.emplace(data, length, protocol); + } + + SendData Pop() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return {nullptr, 0, LWS_WRITE_TEXT}; + + } + SendData data = dataQueue_.front(); + dataQueue_.pop(); + return data; + + } + + void SetContext(lws_context *context) + { + context_ = context; + } + + lws_context *GetContext() + { + return context_; + } + + bool IsEmpty() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return true; + } + return false; + } + + void SetLws(lws *wsi) + { + std::lock_guard lock(mutexForLws_); + if (wsi == nullptr) { + NETSTACK_LOGD("set wsi nullptr"); + } + wsi_ = wsi; + } + + void TriggerWritable() + { + std::lock_guard lock(mutexForLws_); + if (wsi_ == nullptr) { + NETSTACK_LOGE("wsi is nullptr, can not trigger"); + return; + } + lws_callback_on_writable(wsi_); + } + + std::map header; + + lws_close_status closeStatus; + + std::string closeReason; + + uint32_t openStatus; + + std::string openMessage; + + +private: + volatile bool closed_; + + std::atomic_bool threadStop_; + + std::mutex mutex_; + + std::mutex mutexForLws_; + + lws_context *context_; + + std::queue dataQueue_; + + lws *wsi_ = nullptr; +}; + +template static void CallbackTemplate(uv_work_t *work, int status) +{ + (void)status; + + auto workWrapper = static_cast(work->data); + napi_env env = workWrapper->env; + auto closeScope = [env](napi_handle_scope scope) { NapiUtils::CloseScope(env, scope); }; + std::unique_ptr scope(NapiUtils::OpenScope(env), closeScope); + + napi_value obj = MakeJsValue(env, workWrapper->data); + auto undefined = NapiUtils::GetUndefined(workWrapper->env); + std::pair arg = {undefined, obj}; + if (workWrapper->manager) { + workWrapper->manager->Emit(workWrapper->type, arg); + if (workWrapper->type == EventName::EVENT_MESSAGE && + workWrapper->manager->HasEventListener(EventName::EVENT_DATA_END)) { + workWrapper->manager->Emit(EventName::EVENT_DATA_END, {undefined, undefined}); + } + } + delete workWrapper; + delete work; +} + + +void RunServerService(std::shared_ptr userData, std::shared_ptr manager) +{ + NETSTACK_LOGI("websocket run service start"); + int res = 0; + lws_context *context = userData->GetContext(); + if (context == nullptr) { + NETSTACK_LOGE("context is null"); + return; + + } + while (res >= 0 && !userData->IsThreadStop()) { + res = lws_service(context, 0); + + } + NETSTACK_LOGE("lws_service stop"); + lws_context_destroy(context); + userData->SetContext(nullptr); + manager->SetWebSocketUserData(nullptr); + NETSTACK_LOGI("websocket run service end"); +} + +int WebSocketServerExec::RaiseServerError(EventManager * manager) +{ + OnServerError(manager, COMMON_ERROR_CODE); + return -1; +} + +int WebSocketServerExec::HttpDummy(lws * wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +{ + int ret = lws_callback_http_dummy(wsi, reason, user, in, len); + if (ret < 0) { + OnServerError(reinterpret_cast(user), COMMON_ERROR_CODE); + } + return 0; +} + +int WebSocketServerExec::lwsServerCallback(lws * wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +{ + NETSTACK_LOGI("lws server callback reason is %{public}d", reason); + CallbackDispatcher dispatchers[] = { + {LWS_CALLBACK_ESTABLISHED, LwsCallbackEstablished}, + {LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION, LwsCallbackFilterProtocolConnection}, + {LWS_CALLBACK_RECEIVE, LwsCallbackReceive}, + {LWS_CALLBACK_SERVER_WRITEABLE, LwsCallbackServerWriteable}, + {LWS_CALLBACK_WS_PEER_INITIATED_CLOSE, LwsCallbackWsPeerInitiatedCloseServer}, + {LWS_CALLBACK_CLOSED, LwsCallbackClosed}, + {LWS_CALLBACK_WSI_DESTROY, LwsCallbackWsiDestroyServer}, + {LWS_CALLBACK_PROTOCOL_DESTROY, LwsCallbackProtocolDestroyServer}, + }; + for (const auto dispatcher : dispatchers) { + if (dispatcher.reason == reason) { + return dispatcher.callback(wsi, reason, user, in, len); + } + } + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketServerExec::LwsCallbackEstablished(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback server established"); + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + // bind clientuserdata with wsi + lws_context *lwsContext = lws_get_context(wsi); + std::shared_ptr clientUserData; + clientUserData = std::make_shared(lwsContext); + lws_set_wsi_user(wsi, clientUserData.get()); + std::string clientId; + WebSocketConnection connection; + bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); + if (!ret) { + NETSTACK_LOGE("GetPeerConnMsg failed"); + return RaiseServerError(manager); + } + NETSTACK_LOGI("connection clientip=%{public}s, clientport=%{public}d", + connection.clientIP.c_str(), connection.clientPort); + AddConnections(clientId, wsi, userData, connection); + clientUserData->SetLws(wsi); + clientUserData->TriggerWritable(); + OnConnect(wsi, manager); + return HttpDummy(wsi, reason, user, in, len); +} + +bool WebSocketServerExec::GetPeerConnMsg(lws * wsi, EventManager * manager, std::string & clientId, WebSocketConnection & conn) +{ + struct sockaddr_storage addr{}; + socklen_t addrLen = sizeof(addr); + int ret = getpeername(lws_get_socket_fd(wsi), reinterpret_cast(&addr), &addrLen); + if (ret != 0) { + NETSTACK_LOGE("getpeername failed"); + return false; + } + char ipStr[INET6_ADDRSTRLEN] = {0}; + if (addr.ss_family == AF_INET) { + NETSTACK_LOGI("family is ipv4"); + auto *addrIn = reinterpret_cast(&addr); + inet_ntop(AF_INET, &addrIn->sin_addr, ipStr, sizeof(ipStr)); + uint16_t port = ntohs(addrIn->sin_port); + conn.clientPort = static_cast(port); + conn.clientIP = ipStr; + clientId = std::string(ipStr) ":" std::to_string(port); + } else if (addr.ss_family == AF_INET6) { + NETSTACK_LOGI("family is ipv6"); + auto *addrIn6 = reinterpret_cast(&addr); + inet_ntop(AF_INET6, &addrIn6->sin6_addr, ipStr, sizeof(ipStr)); + uint16_t port = ntohs(addrIn6->sin6_port); + conn.clientPort = static_cast(port); + conn.clientIP = ipStr; + clientId = std::string(ipStr) ":" std::to_string(port); + } else { + NETSTACK_LOGE("getpeer Ipv4 or Ipv6 failed"); + return false; + } + return true; +} + +bool WebSocketServerExec::IsOverMaxClientConns(EventManager * manager) +{ + std::vector connection = GetConnections(); + if (connection.size() >= manager->GetMaxConnClientCnt() * manager->GetMaxConnForOneClient()) { + NETSTACK_LOGE("current connections is over limit"); + return true; + } + return false; +} + +void WebSocketServerExec::AddConnections(const std::string &Id, lws *wsi, + std::shared_ptr &userData, WebSocketConnection &conn) +{ + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("AddConnections failed: session %s", userData->IsClosed() ? "closed" : "thread stopped"); + return; + } + { + std::unique_lock lock(wsMutex_); + webSocketConnection_[Id].first = wsi; + webSocketConnection_[Id].second = conn; + NETSTACK_LOGI("AddConnections success"); + } +} + +int WebSocketServerExec::LwsCallbackClosed(lws * wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +{ + NETSTACK_LOGD("lws callback server closed"); + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + auto clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUserData is null"); + return RaiseServerError(manager); + } + clientUserData->SetThreadStop(true); + if ((clientUserData->closeReason).empty()) { + clientUserData->Close(clientUserData->closeStatus, LINK_DOWN); + } + if (clientUserData->closeStatus == LWS_CLOSE_STATUS_NOSTATUS) { + NETSTACK_LOGE("The link is down, onError"); + OnServerError(manager, COMMON_ERROR_CODE); + } + std::string clientId; + { + std::shared_lock lock(wsMutex_); + for (auto it = webSocketConnection_.begin(); it != webSocketConnection_.end(); it) { + if (it->second.first == wsi) { + clientId = it->first; + } + } + } + OnServerClose(wsi, manager, clientUserData->closeStatus, clientUserData->closeReason); + RemoveConnections(clientId, *clientUserData); + if (userData->IsClosed() && webSocketConnection_.empty() && !userData->IsThreadStop()) { + NETSTACK_LOGI("server service is stopped"); + userData->SetThreadStop(true); + } + return HttpDummy(wsi, reason, user, in, len); +} + +void WebSocketServerExec::RemoveConnections(const std::string &id, UserData &userData) +{ + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("connection list is empty"); + return; + } + { + std::unique_lock lock(wsMutex_); + if (webSocketConnection_.find(id) == webSocketConnection_.end()) { + NETSTACK_LOGE("connection list find clientId failed"); + return; + } + webSocketConnection_.erase(id); + NETSTACK_LOGI("connection erase success"); + } +} + +int WebSocketServerExec::LwsCallbackWsiDestroyServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback wsi destroy"); + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + userData->SetLws(nullptr); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketServerExec::LwsCallbackProtocolDestroyServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback protocol destroy"); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketServerExec::LwsCallbackServerWriteable(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback Server writable"); + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager); + } + // server + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + if (userData->IsThreadStop()) { + NETSTACK_LOGI("session is stopped"); + return -1; + } + // client + auto *clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUserData is null"); + return RaiseServerError(manager); + } + if (clientUserData->IsClosed()) { + NETSTACK_LOGI("client is closed, need to close"); + lws_close_reason(wsi, clientUserData->closeStatus, + reinterpret_cast(const_cast(clientUserData->closeReason.c_str())), + strlen(clientUserData->closeReason.c_str())); + return -1; + } + auto sendData = clientUserData->Pop(); + if (sendData.data == nullptr || sendData.length == 0) { + NETSTACK_LOGE("send data is empty"); + return HttpDummy(wsi, reason, user, in, len); + } + int sendLength = lws_write(wsi, reinterpret_cast(sendData.data) LWS_SEND_BUFFER_PRE_PADDING, + sendData.length, sendData.protocol); + free(sendData.data); + NETSTACK_LOGD("lws send data length is %{public}d", sendLength); + if (!userData->IsEmpty()) { + NETSTACK_LOGE("userData is not empty"); + userData->TriggerWritable(); + } + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback ws peer initiated close"); + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is null"); + return -1; + } + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + if (in == nullptr || len < sizeof(uint16_t)) { + NETSTACK_LOGI("No close reason"); + userData->Close(LWS_CLOSE_STATUS_NORMAL, ""); + return HttpDummy(wsi, reason, user, in, len); + } + uint16_t closeStatus = ntohs(*reinterpret_cast(in)); + std::string closeReason; + closeReason.append(reinterpret_cast(in) sizeof(uint16_t), len - sizeof(uint16_t)); + auto *clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + clientUserData->Close(static_cast(closeStatus), closeReason); + return HttpDummy(wsi, reason, user, in, len); +} + +int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws server callback filter ProtocolConnection"); + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + if (manager == nullptr) { + NETSTACK_LOGE("manager is null"); + return RaiseServerError(manager); + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is null"); + return RaiseServerError(manager); + } + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or thread is stopped"); + return RaiseServerError(manager); + } + if (!IsAllowedProtocol(wsi)) { + NETSTACK_LOGE("protocol is not allowed"); + return RaiseServerError(manager); + } + /* 是否超过最大连接数 */ + if (IsOverMaxClientConns(manager)) { + NETSTACK_LOGE("current connections count is more than limit, need to close"); + return RaiseServerError(manager); + } + /* 添加防止恶意连接的业务逻辑 */ + std::string clientId; + WebSocketConnection connection; + bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); + if (!ret) { + NETSTACK_LOGE("GetPeerConnMsg failed"); + return RaiseServerError(manager); + } + if (!IsAllowConnection(clientId)) { + NETSTACK_LOGE("Rejected malicious connection"); + return RaiseServerError(manager); + } + return HttpDummy(wsi, reason, user, in, len); +} + +bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) +{ + if (IsIpInBlacklist(clientId)) { + NETSTACK_LOGE("clientid is in blacklist"); + return false; + } + if (IsHighFreqConnection(clientId)) { + NETSTACK_LOGE("clientid reach high frequency connection"); + AddBlackList(clientId); + return false; + } + UpdataClientList(clientId); + return true; +} + +void WebSocketServerExec::UpdataClientList(const std::string &id) +{ + std::shared_lock lock(connListMutex_); + auto it = clientList.find(id); + if (it == clientList.end()) { + NETSTACK_LOGI("add clientid to blacklist"); + clientList[id] = {1, GetCurrentSecond()}; + } else { + auto now = GetCurrentSecond() - it->second.lastConnectionTime; + if (now > ONE_MINUTE_IN_SEC) { + NETSTACK_LOGI("reset clientid connections cnt"); + it->second = {1, GetCurrentSecond()}; + } else { + it->second.cnt; + } + } +} + +void WebSocketServerExec::AddBlackList(const std::string &id) +{ + std::shared_lock lock(blackListMutex_); + blackList[id] = GetCurrentSecond() ONE_MINUTE_IN_SEC; +} + +bool WebSocketServerExec::IsIpInBlacklist(const std::string &id) +{ + std::shared_lock lock(blackListMutex_); + auto it = blackList.find(id); + if (it != blackList.end()) { + auto now = GetCurrentSecond(); + if (now < it->second) { + return true; + } else { + blackList.erase(it); + } + } + return false; +} + +uint64_t WebSocketServerExec::GetCurrentSecond() +{ + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); +} + +bool WebSocketServerExec::IsHighFreqConnection(const std::string &id) +{ + std::shared_lock lock(connListMutex_); + auto it = clientList.find(id); + if (it != clientList.end()) { + auto duration = GetCurrentSecond() - it->second.lastConnectionTime; + if (duration <= ONE_MINUTE_IN_SEC) { + return it->second.cnt > MAX_CONNECTIONS_PER_MINUTE; + } + } + return false; +} + +bool WebSocketServerExec::IsAllowedProtocol(lws * wsi) +{ + char requested_protocol[128] = {0}; + int32_t res = lws_hdr_copy(wsi, requested_protocol, sizeof(requested_protocol), WSI_TOKEN_PROTOCOL); + if (res < 0) { + NETSTACK_LOGE("fail to read protocol"); + return true; + } + if (strcmp(requested_protocol, "lws_server") != 0) { + NETSTACK_LOGE("Protocol mismatch: client requested: %{public}s, server expects lws_server", requested_protocol); + return true; + } + return true; +} + +int WebSocketServerExec::LwsCallbackReceive(lws * wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) +{ + NETSTACK_LOGD("lws callback server receive"); + lws_context *context = lws_get_context(wsi); + EventManager *manager = static_cast(lws_context_user(context)); + auto isFinal = lws_is_final_fragment(wsi); + OnServerMessage(wsi, manager, in, len, lws_frame_is_binary(wsi), isFinal); + return HttpDummy(wsi, reason, user, in, len); +} + +static napi_value CreateServerClosePara(napi_env env, void *callbackPara) +{ + auto para = reinterpret_cast(callbackPara); + auto deleter = [](const ClientConnectionCloseCallback *p) { delete p; }; + std::unique_ptr handler(para, deleter); + napi_value obj = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, obj) != napi_object) { + return NapiUtils::GetUndefined(env); + } + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, para->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, para->connection.clientPort); + NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_CONNECTION, jsConn); + napi_value jsRes = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsRes) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetUint32Property(env, jsRes, EVENT_KEY_CODE, para->closeResult.code); + NapiUtils::SetStringPropertyUtf8(env, jsRes, EVENT_KEY_REASON, para->closeResult.reason); + NapiUtils::SetNamedProperty(env, obj, EVENT_KEY_RESULT, jsConn); + return obj; +} + +static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessage *msg) +{ + napi_value jsMsg = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + return NapiUtils::GetUndefined(env); + } + void *data = nullptr; + napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(env, msg->data.size(), &data); + if (data != nullptr && NapiUtils::ValueIsArrayBuffer(env, arrayBuffer) && + memcpy_s(data, msg->data.size(), msg->data.c_str(), msg->data.size()) >= 0) { + NapiUtils::SetNamedProperty(env, jsMsg, "data", arrayBuffer); + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); + NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); + return jsMsg; + } + return NapiUtils::GetUndefined(env); +} + +static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) +{ + auto pair = reinterpret_cast> *>(callbackPara); + if (pair == nullptr) { + NETSTACK_LOGE("pair is nullptr"); + return NapiUtils::GetUndefined(env); + } + lws *wsi = pair->first; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return NapiUtils::GetUndefined(env); + } + auto &manager = pair->second; + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is nullptr"); + return NapiUtils::CreateStringUtf8(env, ""); + } + auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); + if (!msg) { + NETSTACK_LOGE("msg is nullptr"); + return NapiUtils::GetUndefined(env); + } + napi_value jsMsg = ConvertWsBinaryMessageToJs(env, msg); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + delete msg; + return NapiUtils::GetUndefined(env); + } + delete msg; + return jsMsg; +} + +static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage *msg) +{ + napi_value jsMsg = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsMsg, EVENT_KEY_DATA, msg->data); + napi_value jsConn = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, jsConn) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetStringPropertyUtf8(env, jsConn, EVENT_KEY_CLIENT_IP, msg->connection.clientIP); + NapiUtils::SetUint32Property(env, jsConn, EVENT_KEY_CLIENT_PORT, msg->connection.clientPort); + NapiUtils::SetNamedProperty(env, jsMsg, EVENT_KEY_CONNECTION, jsConn); + return jsMsg; +} + +static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) +{ + auto pair = reinterpret_cast> *>(callbackPara); + if (pair == nullptr) { + NETSTACK_LOGE("pair is nullptr"); + return NapiUtils::GetUndefined(env); + } + lws *wsi = pair->first; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return NapiUtils::GetUndefined(env); + } + auto &manager = pair->second; + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is nullptr"); + return NapiUtils::CreateStringUtf8(env, ""); + } + auto msg = reinterpret_cast(manager->GetServerQueueData(wsi)); + if (!msg) { + NETSTACK_LOGE("msg is nullptr"); + return NapiUtils::GetUndefined(env); + } + napi_value jsMsg = ConvertWsTextMessageToJs(env, msg); + if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { + NETSTACK_LOGE("jsMsg is not object"); + delete msg; + return NapiUtils::GetUndefined(env); + } + delete msg; + return jsMsg; +} + +static napi_value CreateConnectPara(napi_env env, void *callbackPara) +{ + auto para = reinterpret_cast(callbackPara); + auto deleter = [](const WebSocketConnection *p) { delete p; }; + std::unique_ptr handler(para, deleter); + napi_value obj = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, obj) != napi_object) { + NETSTACK_LOGE("napi_object not found"); + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetUint32Property(env, obj, EVENT_KEY_CLIENT_PORT, para->clientPort); + NapiUtils::SetStringPropertyUtf8(env, obj, EVENT_KEY_CLIENT_IP, para->clientIP); + return obj; +} + +static napi_value CreateServerError(napi_env env, void *callbackPara) +{ + auto code = reinterpret_cast(callbackPara); + if (code == nullptr) { + NETSTACK_LOGE("code is nullptr"); + } + auto deleter = [](int32_t *p) { delete p; }; + std::unique_ptr handler(code, deleter); + napi_value err = NapiUtils::CreateObject(env); + if (NapiUtils::GetValueType(env, err) != napi_object) { + return NapiUtils::GetUndefined(env); + } + NapiUtils::SetInt32Property(env, err, EVENT_KEY_CODE, *code); + return err; +} + +void WebSocketServerExec::OnServerError(EventManager * manager, int32_t code) +{ + NETSTACK_LOGI("OnServerError %{public}d", code); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_ERROR); + if (!hasServerEventListener){ + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_ERROR); + return; + } + auto para = new int32_t(code); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); +} + +void WebSocketServerExec::OnConnect(lws * wsi, EventManager * manager) +{ + NETSTACK_LOGI("OnConnect enter"); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerConnectListener = manager->HasEventListener(EventName::EVENT_SERVER_CONNECT); + if (!hasServerConnectListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CONNECT); + return; + } + { + std::shared_lock lock(wsMutex_); + auto para = new WebSocketConnection; + for (auto [id, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + para->clientIP = connPair.second.clientIP; + para->clientPort = connPair.second.clientPort; + NETSTACK_LOGI("connection find ok, clientId:%{public}s", id.c_str()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CONNECT, + para, CallbackTemplate); + return; + } + } + } + NETSTACK_LOGE("not found client msg"); +} + +void WebSocketServerExec::OnServerClose(lws * wsi, EventManager * manager, lws_close_status closeStatus, + const std::string &closeReason) +{ + NETSTACK_LOGI("OnServerClose %{public}u %{public}s", closeStatus, closeReason.c_str()); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerCloseListener = manager->HasEventListener(EventName::EVENT_SERVER_CLOSE); + if (!hasServerCloseListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_CLOSE); + return; + } + auto conn = new ClientConnectionCloseCallback; + if (conn == nullptr) { + return; + } + conn->closeResult.code = closeStatus; + conn->closeResult.reason = closeReason; + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return; + } + { + std::shared_lock lock(wsMutex_); + for (auto [id, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + conn->connection = connPair.second; + NETSTACK_LOGI("clientId: %{public}s", id.c_str()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_CLOSE, + conn, CallbackTemplate); + return; + } + } + } + NETSTACK_LOGE("not found client msg"); +} + +void WebSocketServerExec::OnServerMessage(lws * wsi, EventManager * manager, void *data, + size_t length, bool isBinary, bool isFinal) +{ + NETSTACK_LOGD("server OnMessage %{public}d", isBinary); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_MESSAGE_RECEIVE); + if (!hasServerEventListener) { + NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_MESSAGE_RECEIVE); + return; + } + if (length > INT32_MAX) { + NETSTACK_LOGE("data length too long"); + return; + } + HandleServerRcvMessage(wsi, manager, data, length, isBinary, isFinal); +} + +void WebSocketServerExec::HandleServerRcvMessage(lws * wsi, EventManager * manager, void *data, + size_t length, bool isBinary, bool isFinal) +{ + if (isBinary) { + manager->AppendWsServerBinaryData(wsi, data, length); + if (isFinal) { + const std::string &msgFromManager = manager->GetWsServerBinaryData(wsi); + auto msg = new WebSocketMessage; + if (msg == nullptr) { + return; + } + SetWebsocketMessage(wsi, manager, msgFromManager, msg); + manager->SetServerQueueData(wsi, msg); + auto callbackPara = std::make_shared>>(wsi, + manager->shared_from_this()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + CallbackTemplate); + manager->ClearWsServerBinaryData(wsi); + } + } else { + manager->AppendWsServerTextData(wsi, data, length); + if (isFinal) { + const std::string &msgFromManager = manager->GetWsServerTextData(wsi); + if (msgFromManager.empty()) { + NETSTACK_LOGE("msgFromManager is empty"); + return; + } + auto msg = new WebSocketMessage; + if (msg == nullptr) { + return; + } + SetWebsocketMessage(wsi, manager, msgFromManager, msg); + manager->SetServerQueueData(wsi, msg); + auto callbackPara = std::make_shared>>(wsi, + manager->shared_from_this()); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + CallbackTemplate); + manager->ClearWsServerTextData(wsi); + } + } +} + +void WebSocketServerExec::SetWebsocketMessage(lws * wsi, EventManager * manager, + const std::string &msgFromManager, void *dataMsg) +{ + NETSTACK_LOGD("SetWebsocketMessage enter"); + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { + NETSTACK_LOGE("manager is null"); + return; + } + if (wsi == nullptr) { + NETSTACK_LOGE("wsi is nullptr"); + return; + } + auto webSocketMessage = static_cast(dataMsg); + webSocketMessage->data = msgFromManager; + + { + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection_ is empty"); + return; + } + for (auto [_, connPair] : webSocketConnection_) { + if (connPair.first == wsi) { + webSocketMessage->connection = connPair.second; + return; + } + } + } + NETSTACK_LOGE("not found client msgFromManager"); +} + +bool WebSocketServerExec::ExecServerStart(ServerStartContext * context) +{ + NETSTACK_LOGD("websocket server start exec"); + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + if (!CommonUtils::IsValidIPV4(context->GetServerIP()) && + !CommonUtils::IsValidIPV6(context->GetServerIP())) { + NETSTACK_LOGE("IPV4 and IPV6 are not valid"); + context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_NIC); + return false; + } + if (!CommonUtils::IsValidPort(context->GetServerPort())) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_INVALID_PORT); + NETSTACK_LOGE("Port is not valid"); + return false; + } + if (context->GetMaxConcurrentClientsNumber() > MAX_CONCURRENT_CLIENTS_NUMBER) { + NETSTACK_LOGE("concurrent clients number is over limit"); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + return false; + } + manager->SetMaxConnClientCnt(context->GetMaxConcurrentClientsNumber()); + if (context->GetMaxConnectionsForOneClient() > MAX_CONNECTIONS_FOR_ONE_CLIENT) { + NETSTACK_LOGE("connection number for one client is over limit"); + return false; + } + manager->SetMaxConnForOneClient(context->GetMaxConnectionsForOneClient()); + lws_context_creation_info info = {}; + FillServerContextInfo(context, manager, info); + if (!FillServerCertPath(context, info)) { + NETSTACK_LOGE("FillServerCertPath error"); + return false; + } + StartService(info, manager); + return true; +} + +void WebSocketServerExec::StartService(lws_context_creation_info & info, std::shared_ptr & manager) +{ + lws_context *lwsContext = nullptr; + std::shared_ptr userData; + lwsContext = lws_create_context(&info); + userData = std::make_shared(lwsContext); + manager->SetWebSocketUserData(userData); + std::thread serviceThread(RunServerService, userData, manager); + #if defined (MAC_PLATFORM) || defined(IOS_PLATFORM) + pthread_setname_np(WEBSOCKET_SERVER_THREAD_RUN); + #else + pthread_setname_np(serviceThread.native_handle(), WEBSOCKET_SERVER_THREAD_RUN); + #endif + serviceThread.detach(); +} + +void WebSocketServerExec::FillServerContextInfo(ServerStartContext * context, std::shared_ptr & manager, + lws_context_creation_info & info) +{ + info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; + info.port = context->GetServerPort(); + info.mounts = &mount; + info.protocols = LWS_SERVER_PROTOCOLS; + info.vhost_name = "localhost"; + info.user = manager.get(); + // maybe + info.gid = -1; + info.uid = -1; + info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; +} + +static bool CheckFilePath(std::string & path) +{ + char tmpPath[PATH_MAX] = {0}; + if (!realpath(static_cast(path.c_str()), tmpPath)) { + NETSTACK_LOGE("path is error"); + return false; + } + path = tmpPath; + return true; +} + +bool WebSocketServerExec::FillServerCertPath(ServerStartContext * context, lws_context_creation_info & info) +{ + if (!context->certPath_.empty()) { + if (!CheckFilePath(context->certPath_) || !CheckFilePath(context->keyPath_)) { + NETSTACK_LOGE("client cert not exist"); + context->SetErrorCode(WEBSOCKET_ERROR_CODE_FILE_NOT_EXIST); + return false; + } + info.ssl_cert_filepath = context->certPath_.c_str(); + info.ssl_private_key_filepath = context->keyPath_.c_str(); + } + return true; +} + +bool WebSocketServerExec::ExecListAllConnections(ListAllConnectionsContext * context) +{ + NETSTACK_LOGD("ListAllConnections start exec"); + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is nullptr"); + return false; + } + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + std::vector connection = GetConnections(); + context->SetAllConnections(connection); + NETSTACK_LOGI("ExecListAllConnections OK"); + return true; +} + +std::vector WebSocketServerExec::GetConnections() +{ + std::shared_lock lock(wsMutex_); + std::vector conn; + if (!webSocketConnection_.empty()) { + for (auto [_, connPair] : webSocketConnection_) { + conn.emplace_back(connPair.second); + } + } + return conn; +} + +bool WebSocketServerExec::ExecServerClose(ServerCloseContext * context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + if (context->GetSharedManager() == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + WebSocketConnection conn = context->GetConnection(); + if (conn.clientIP.empty()) { + NETSTACK_LOGE("connection is empty"); + return false; + } + std::string clientId = conn.clientIP ":" std::to_string(conn.clientPort); + NETSTACK_LOGI("ExecServerClose, clientID:%{public}s", clientId.c_str()); + auto wsi = GetClientWsi(clientId); + if (wsi == nullptr) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); + NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); + return false; + } + auto *clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUser data is nullptr"); + return false; + } + if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + clientUserData->Close(static_cast(context->code), context->reason); + clientUserData->TriggerWritable(); + NETSTACK_LOGI("ExecServerClose OK"); + return true; +} + +bool WebSocketServerExec::ExecServerSend(ServerSendContext * context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + WebSocketConnection conn = context->GetConnection(); + if (conn.clientIP.empty()) { + NETSTACK_LOGE("connection is empty"); + return false; + } + std::string clientId = conn.clientIP ":" std::to_string(conn.clientPort); + NETSTACK_LOGI("connection clientid:%{public}s", clientId.c_str()); + auto wsi = GetClientWsi(clientId); + if (wsi == nullptr) { + context->SetErrorCode(WEBSOCKET_ERROR_CODE_CONNECTION_NOT_EXIST); + NETSTACK_LOGE("clientId not found:%{public}s", clientId.c_str()); + return false; + } + auto *clientUserData = reinterpret_cast(lws_wsi_user(wsi)); + if (clientUserData == nullptr) { + NETSTACK_LOGE("clientUser data is nullptr"); + return false; + } + if (clientUserData->IsClosed() || clientUserData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + clientUserData->Push(context->data, context->length, context->protocol); + clientUserData->TriggerWritable(); + NETSTACK_LOGD("lws ts send success"); + return true; +} + +lws *WebSocketServerExec::GetClientWsi(const std::string clientId) +{ + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection is empty"); + return nullptr; + } + auto it = webSocketConnection_.find(clientId); + if (it == webSocketConnection_.end()) { + NETSTACK_LOGE("can't find clientId"); + return nullptr; + } + return it->second.first; +} + +bool WebSocketServerExec::ExecServerStop(ServerStopContext * context) +{ + if (context == nullptr) { + NETSTACK_LOGE("context is nullptr"); + return false; + } + if (!CommonUtils::HasInternetPermission()) { + context->SetPermissionDenied(true); + return false; + } + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("context is null"); + return false; + } + auto userData = manager->GetWebSocketUserData(); + if (userData == nullptr) { + NETSTACK_LOGE("user data is nullptr"); + return false; + } + if (userData->IsClosed() || userData->IsThreadStop()) { + NETSTACK_LOGE("session is closed or stopped"); + return false; + } + CloseAllConnection(userData); + userData->Close(LWS_CLOSE_STATUS_GOINGAWAY, ""); + NETSTACK_LOGI("ExecServerStop OK"); + return true; +} + +void WebSocketServerExec::CloseAllConnection(const std::shared_ptr &userData) +{ + decltype(webSocketConnection_) connListTmp; + { + std::shared_lock lock(wsMutex_); + if (webSocketConnection_.empty()) { + NETSTACK_LOGE("webSocketConnection is empty"); + if (!userData->IsThreadStop()) { + NETSTACK_LOGI("server service is stopped"); + userData->SetThreadStop(true); + } + return; + } + connListTmp = webSocketConnection_; + } + const char *closeReason = "server is going away"; + for (auto [id, connPair] : connListTmp) { + if (connPair.first == nullptr) { + NETSTACK_LOGE("clientId not found:%{public}s", id.c_str()); + continue; + } + auto *clientUserData = reinterpret_cast(lws_wsi_user(connPair.first)); + clientUserData->Close(LWS_CLOSE_STATUS_GOINGAWAY, closeReason); + clientUserData->TriggerWritable(); + } + NETSTACK_LOGI("CloseAllConnection OK"); +} + +napi_value WebSocketServerExec::ServerStartCallback(ServerStartContext * context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketServerExec::ListAllConnectionsCallback(ListAllConnectionsContext * context) +{ + if (context == nullptr) { + NETSTACK_LOGE("Context is null"); + return nullptr; + } + napi_value connectionsArray = NapiUtils::CreateArray(context->GetEnv(), 0); + const std::vector connections = context->GetAllConnections(); + if (connections.empty()) { + NETSTACK_LOGE("connections list is null"); + return connectionsArray; + } + uint32_t index = 0; + for (const auto &conn : connections) { + napi_value jsConn = NapiUtils::CreateObject(context->GetEnv()); + NapiUtils::SetUint32Property(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_PORT, conn.clientPort); + NapiUtils::SetStringPropertyUtf8(context->GetEnv(), jsConn, EVENT_KEY_CLIENT_IP, conn.clientIP); + NapiUtils::SetArrayElement(context->GetEnv(), connectionsArray, index, jsConn); + ++index; + } + return connectionsArray; +} + +napi_value WebSocketServerExec::ServerSendCallback(ServerSendContext * context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketServerExec::ServerCloseCallback(ServerCloseContext * context) +{ + return NapiUtils::GetBoolean(context->GetEnv(), true); +} + +napi_value WebSocketServerExec::ServerStopCallback(ServerStopContext * context) +{ + auto manager = context->GetSharedManager(); + if (manager != nullptr) { + NETSTACK_LOGD("websocket close, delete js ref"); + manager->DeleteEventReference(context->GetEnv()); + } + return NapiUtils::GetBoolean(context->GetEnv(), true); +} +} \ No newline at end of file diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 6744089d9..298505953 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -81,6 +81,7 @@ ohos_unittest("websocket_unittest") { "$WEBSOCKET_NAPI/async_context/src/server_send_context.cpp", "$WEBSOCKET_NAPI/async_context/src/server_start_context.cpp", "$WEBSOCKET_NAPI/async_context/src/server_stop_context.cpp", + "$WEBSOCKET_NAPI/websocket_exec/src/websocket_server_exec.cpp", ] } diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 0ebb4a9e3..26e2077d4 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -30,6 +30,7 @@ #include "server_send_context.h" #include "server_stop_context.h" #include "list_all_connections_context.h" +#include "websocket_server_exec.h" #endif // NETSTACK_WEBSOCKETSERVER class WebSocketTest : public testing::Test { diff --git a/test/unittest/websocket_test/WebSocketTest.cpp b/test/unittest/websocket_test/WebSocketTest.cpp index 95e99d018..06e646d34 100644 --- a/test/unittest/websocket_test/WebSocketTest.cpp +++ b/test/unittest/websocket_test/WebSocketTest.cpp @@ -30,6 +30,7 @@ #include "server_send_context.h" #include "server_stop_context.h" #include "list_all_connections_context.h" +#include "websocket_server_exec.h" #endif // NETSTACK_WEBSOCKETSERVER class WebSocketTest : public testing::Test { -- Gitee From be7b788307de655f4013ecdc5954b582d002fd33 Mon Sep 17 00:00:00 2001 From: jxw Date: Tue, 6 May 2025 15:28:00 +0800 Subject: [PATCH 055/126] websocketServer Signed-off-by: wendan4 --- .../js/napi/websocket/utils/{ => include}/websocket_utils.h | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename frameworks/js/napi/websocket/utils/{ => include}/websocket_utils.h (100%) diff --git a/frameworks/js/napi/websocket/utils/websocket_utils.h b/frameworks/js/napi/websocket/utils/include/websocket_utils.h similarity index 100% rename from frameworks/js/napi/websocket/utils/websocket_utils.h rename to frameworks/js/napi/websocket/utils/include/websocket_utils.h -- Gitee From 2d723e177f6e152454265e4f1e1efbc313501353 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 07:36:20 +0000 Subject: [PATCH 056/126] update test/unittest/websocket/WebSocketTest.cpp. Signed-off-by: wendan4 --- test/unittest/websocket/WebSocketTest.cpp | 40 +++++++++++------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 26e2077d4..285ca8a27 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -146,13 +146,13 @@ HWTEST_F(WebSocketTest, WebSocketTest009, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest010, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerStart(nullptr); + bool ret = WebSocketServerExec::ExecServerStart(nullptr); EXPECT_EQ(ret, false); } @@ -162,7 +162,7 @@ HWTEST_F(WebSocketTest, WebSocketTest011, TestSize.Level1) auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } @@ -171,13 +171,13 @@ HWTEST_F(WebSocketTest, WebSocketTest012, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest013, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerSend(nullptr); + bool ret = WebSocketServerExec::ExecServerSend(nullptr); EXPECT_EQ(ret, false); } @@ -187,7 +187,7 @@ HWTEST_F(WebSocketTest, WebSocketTest014, TestSize.Level1) auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } @@ -196,13 +196,13 @@ HWTEST_F(WebSocketTest, WebSocketTest015, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest016, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerClose(nullptr); + bool ret = WebSocketServerExec::ExecServerClose(nullptr); EXPECT_EQ(ret, false); } @@ -212,7 +212,7 @@ HWTEST_F(WebSocketTest, WebSocketTest017, TestSize.Level1) auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } @@ -221,13 +221,13 @@ HWTEST_F(WebSocketTest, WebSocketTest018, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest019, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerStop(nullptr); + bool ret = WebSocketServerExec::ExecServerStop(nullptr); EXPECT_EQ(ret, false); } @@ -237,7 +237,7 @@ HWTEST_F(WebSocketTest, WebSocketTest020, TestSize.Level1) auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } @@ -246,13 +246,13 @@ HWTEST_F(WebSocketTest, WebSocketTest021, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest022, TestSize.Level1) { - bool ret = WebSocketExec::ExecListAllConnections(nullptr); + bool ret = WebSocketServerExec::ExecListAllConnections(nullptr); EXPECT_EQ(ret, false); } @@ -262,7 +262,7 @@ HWTEST_F(WebSocketTest, WebSocketTest023, TestSize.Level1) auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } @@ -302,7 +302,7 @@ HWTEST_F(WebSocketTest, WebSocketTest027, TestSize.Level1) auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } @@ -312,7 +312,7 @@ HWTEST_F(WebSocketTest, WebSocketTest028, TestSize.Level1) auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } @@ -322,7 +322,7 @@ HWTEST_F(WebSocketTest, WebSocketTest029, TestSize.Level1) auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } @@ -332,7 +332,7 @@ HWTEST_F(WebSocketTest, WebSocketTest030, TestSize.Level1) auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } @@ -342,7 +342,7 @@ HWTEST_F(WebSocketTest, WebSocketTest031, TestSize.Level1) auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } -- Gitee From 216cb53ca917922aee6b9389b4f121f3472da3e9 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 07:39:18 +0000 Subject: [PATCH 057/126] update test/unittest/websocket_test/WebSocketTest.cpp. Signed-off-by: wendan4 --- .../unittest/websocket_test/WebSocketTest.cpp | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/test/unittest/websocket_test/WebSocketTest.cpp b/test/unittest/websocket_test/WebSocketTest.cpp index 06e646d34..0b0331a23 100644 --- a/test/unittest/websocket_test/WebSocketTest.cpp +++ b/test/unittest/websocket_test/WebSocketTest.cpp @@ -145,13 +145,13 @@ HWTEST_F(WebSocketTest, WebSocketTest009, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest010, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerStart(nullptr); + bool ret = WebSocketServerExec::ExecServerStart(nullptr); EXPECT_EQ(ret, false); } @@ -161,7 +161,7 @@ HWTEST_F(WebSocketTest, WebSocketTest011, TestSize.Level1) auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } @@ -170,13 +170,13 @@ HWTEST_F(WebSocketTest, WebSocketTest012, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest013, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerSend(nullptr); + bool ret = WebSocketServerExec::ExecServerSend(nullptr); EXPECT_EQ(ret, false); } @@ -186,7 +186,7 @@ HWTEST_F(WebSocketTest, WebSocketTest014, TestSize.Level1) auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } @@ -195,13 +195,13 @@ HWTEST_F(WebSocketTest, WebSocketTest015, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest016, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerClose(nullptr); + bool ret = WebSocketServerExec::ExecServerClose(nullptr); EXPECT_EQ(ret, false); } @@ -211,7 +211,7 @@ HWTEST_F(WebSocketTest, WebSocketTest017, TestSize.Level1) auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } @@ -220,13 +220,13 @@ HWTEST_F(WebSocketTest, WebSocketTest018, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest019, TestSize.Level1) { - bool ret = WebSocketExec::ExecServerStop(nullptr); + bool ret = WebSocketServerExec::ExecServerStop(nullptr); EXPECT_EQ(ret, false); } @@ -236,7 +236,7 @@ HWTEST_F(WebSocketTest, WebSocketTest020, TestSize.Level1) auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } @@ -245,13 +245,13 @@ HWTEST_F(WebSocketTest, WebSocketTest021, TestSize.Level1) napi_env env = nullptr; auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest022, TestSize.Level1) { - bool ret = WebSocketExec::ExecListAllConnections(nullptr); + bool ret = WebSocketServerExec::ExecListAllConnections(nullptr); EXPECT_EQ(ret, false); } @@ -261,7 +261,7 @@ HWTEST_F(WebSocketTest, WebSocketTest023, TestSize.Level1) auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); context.SetPermissionDenied(true); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } @@ -301,7 +301,7 @@ HWTEST_F(WebSocketTest, WebSocketTest027, TestSize.Level1) auto eventManager = std::make_shared(); ServerStartContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerStart(&context); + bool ret = WebSocketServerExec::ExecServerStart(&context); EXPECT_EQ(ret, false); } @@ -311,7 +311,7 @@ HWTEST_F(WebSocketTest, WebSocketTest028, TestSize.Level1) auto eventManager = std::make_shared(); ServerSendContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerSend(&context); + bool ret = WebSocketServerExec::ExecServerSend(&context); EXPECT_EQ(ret, false); } @@ -321,7 +321,7 @@ HWTEST_F(WebSocketTest, WebSocketTest029, TestSize.Level1) auto eventManager = std::make_shared(); ServerCloseContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerClose(&context); + bool ret = WebSocketServerExec::ExecServerClose(&context); EXPECT_EQ(ret, false); } @@ -331,7 +331,7 @@ HWTEST_F(WebSocketTest, WebSocketTest030, TestSize.Level1) auto eventManager = std::make_shared(); ServerStopContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecServerStop(&context); + bool ret = WebSocketServerExec::ExecServerStop(&context); EXPECT_EQ(ret, false); } @@ -341,7 +341,7 @@ HWTEST_F(WebSocketTest, WebSocketTest031, TestSize.Level1) auto eventManager = std::make_shared(); ListAllConnectionsContext context(env, eventManager); context.SetPermissionDenied(false); - bool ret = WebSocketExec::ExecListAllConnections(&context); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); EXPECT_EQ(ret, false); } -- Gitee From 0ea4b271934821e538cfcc2f85a5b6db750ddb83 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 07:43:28 +0000 Subject: [PATCH 058/126] update frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp. Signed-off-by: wendan4 --- .../napi/websocket/websocket_exec/src/websocket_exec.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index 49ade0561..bf87bc075 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -20,9 +20,6 @@ #include #include #include -#include -#include -#include #include "constant.h" #include "napi_utils.h" @@ -452,7 +449,6 @@ void OnConnectError(EventManager *manager, int32_t code, uint32_t httpResponse) int WebSocketExec::LwsCallbackClientConnectionError(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) { - NETSTACK_LOGD("lws callback client connection error"); NETSTACK_LOGI("Lws client connection error %{public}s", (in == nullptr) ? "null" : reinterpret_cast(in)); // 200 means connect failed OnConnectError(reinterpret_cast(user), COMMON_ERROR_CODE, GetHttpResponseFromWsi(wsi)); @@ -1056,7 +1052,10 @@ void WebSocketExec::HandleRcvMessage(EventManager *manager, void *data, size_t l manager->AppendWebSocketBinaryData(data, length); if (isFinal) { const std::string &msgFromManager = manager->GetWebSocketBinaryData(); - auto msg = new std::string; + auto msg = new (std::nothrow) std::string; + if (msg == nullptr) { + return; + } msg->append(msgFromManager.data(), msgFromManager.size()); manager->SetQueueData(msg); manager->EmitByUvWithoutCheckShared(EventName::EVENT_MESSAGE, manager, -- Gitee From 4dd7600d8f961e0d4fe1ff040e2aeb5e1a0ab4ce Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 07:59:22 +0000 Subject: [PATCH 059/126] update frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp. Signed-off-by: wendan4 --- .../src/websocket_server_exec.cpp | 200 +++++++++--------- 1 file changed, 98 insertions(+), 102 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index 230a702af..4ecb5dd5a 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -#include "websocket_server_exec.h" + +#include "websocket_server_exec.h" #include #include #include @@ -21,13 +21,13 @@ #include #include #include -#include +#include #include "constant.h" #include "napi_utils.h" #include "netstack_common_utils.h" #include "netstack_log.h" #include "securec.h" -#define LWS_PLUGIN_STATIC +#define LWS_PLUGIN_STATIC static constexpr const char *EVENT_KEY_CLIENT_PORT = "clientPort"; @@ -79,12 +79,12 @@ static const lws_protocols LWS_SERVER_PROTOCOLS[] = { struct CloseResult { uint32_t code; - std::string reason; + std::string reason; }; struct ClientConnectionCloseCallback { WebSocketConnection connection; - CloseResult closeResult; + CloseResult closeResult; }; struct CallbackDispatcher { @@ -116,10 +116,10 @@ class UserData { public: struct SendData { SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) - :data(paraData), length(paraLength), protocol(paraProtocol) - { + :data(paraData), length(paraLength), protocol(paraProtocol) + { } - + SendData() = delete; ~SendData() = default; @@ -130,27 +130,27 @@ public: }; explicit UserData(lws_context *context) - :closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) + :closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) { } - bool IsClosed() + bool IsClosed() { std::lock_guard lock(mutex_); return closed_; } - bool IsThreadStop() + bool IsThreadStop() { return threadStop_.load(); } - void SetThreadStop(bool threadStop) + void SetThreadStop(bool threadStop) { threadStop_.store(threadStop); } - void Close(lws_close_status status, const std::string &reason) + void Close(lws_close_status status, const std::string &reason) { std::lock_guard lock(mutex_); closeStatus = status; @@ -158,36 +158,34 @@ public: closed_ = true; } - void Push(void *data, size_t length, lws_write_protocol protocol) + void Push(void *data, size_t length, lws_write_protocol protocol) { std::lock_guard lock(mutex_); dataQueue_.emplace(data, length, protocol); } - SendData Pop() + SendData Pop() { std::lock_guard lock(mutex_); if (dataQueue_.empty()) { return {nullptr, 0, LWS_WRITE_TEXT}; - } SendData data = dataQueue_.front(); dataQueue_.pop(); return data; - } - void SetContext(lws_context *context) + void SetContext(lws_context *context) { context_ = context; } - lws_context *GetContext() + lws_context *GetContext() { return context_; } - bool IsEmpty() + bool IsEmpty() { std::lock_guard lock(mutex_); if (dataQueue_.empty()) { @@ -196,7 +194,7 @@ public: return false; } - void SetLws(lws *wsi) + void SetLws(lws *wsi) { std::lock_guard lock(mutexForLws_); if (wsi == nullptr) { @@ -205,12 +203,12 @@ public: wsi_ = wsi; } - void TriggerWritable() + void TriggerWritable() { std::lock_guard lock(mutexForLws_); if (wsi_ == nullptr) { NETSTACK_LOGE("wsi is nullptr, can not trigger"); - return; + return; } lws_callback_on_writable(wsi_); } @@ -225,7 +223,6 @@ public: std::string openMessage; - private: volatile bool closed_; @@ -266,7 +263,7 @@ template static void CallbackTempl } -void RunServerService(std::shared_ptr userData, std::shared_ptr manager) +void RunServerService(std::shared_ptr userData, std::shared_ptr manager) { NETSTACK_LOGI("websocket run service start"); int res = 0; @@ -274,11 +271,9 @@ void RunServerService(std::shared_ptr userData, std::shared_ptr= 0 && !userData->IsThreadStop()) { res = lws_service(context, 0); - } NETSTACK_LOGE("lws_service stop"); lws_context_destroy(context); @@ -287,13 +282,13 @@ void RunServerService(std::shared_ptr userData, std::shared_ptrsin_port); conn.clientPort = static_cast(port); conn.clientIP = ipStr; - clientId = std::string(ipStr) ":" std::to_string(port); + clientId = std::string(ipStr) + ":" + std::to_string(port); } else if (addr.ss_family == AF_INET6) { NETSTACK_LOGI("family is ipv6"); auto *addrIn6 = reinterpret_cast(&addr); @@ -384,7 +379,7 @@ bool WebSocketServerExec::GetPeerConnMsg(lws * wsi, EventManager * manager, std: uint16_t port = ntohs(addrIn6->sin6_port); conn.clientPort = static_cast(port); conn.clientIP = ipStr; - clientId = std::string(ipStr) ":" std::to_string(port); + clientId = std::string(ipStr) + ":" + std::to_string(port); } else { NETSTACK_LOGE("getpeer Ipv4 or Ipv6 failed"); return false; @@ -392,7 +387,7 @@ bool WebSocketServerExec::GetPeerConnMsg(lws * wsi, EventManager * manager, std: return true; } -bool WebSocketServerExec::IsOverMaxClientConns(EventManager * manager) +bool WebSocketServerExec::IsOverMaxClientConns(EventManager *manager) { std::vector connection = GetConnections(); if (connection.size() >= manager->GetMaxConnClientCnt() * manager->GetMaxConnForOneClient()) { @@ -403,7 +398,7 @@ bool WebSocketServerExec::IsOverMaxClientConns(EventManager * manager) } void WebSocketServerExec::AddConnections(const std::string &Id, lws *wsi, - std::shared_ptr &userData, WebSocketConnection &conn) + std::shared_ptr &userData, WebSocketConnection &conn) { if (userData->IsClosed() || userData->IsThreadStop()) { NETSTACK_LOGE("AddConnections failed: session %s", userData->IsClosed() ? "closed" : "thread stopped"); @@ -417,7 +412,7 @@ void WebSocketServerExec::AddConnections(const std::string &Id, lws *wsi, } } -int WebSocketServerExec::LwsCallbackClosed(lws * wsi, lws_callback_reasons reason, void *user, void *in, size_t len) +int WebSocketServerExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) { NETSTACK_LOGD("lws callback server closed"); if (wsi == nullptr) { @@ -451,7 +446,7 @@ int WebSocketServerExec::LwsCallbackClosed(lws * wsi, lws_callback_reasons reaso std::string clientId; { std::shared_lock lock(wsMutex_); - for (auto it = webSocketConnection_.begin(); it != webSocketConnection_.end(); it) { + for (auto it = webSocketConnection_.begin(); it != webSocketConnection_.end(); ++it) { if (it->second.first == wsi) { clientId = it->first; } @@ -466,7 +461,7 @@ int WebSocketServerExec::LwsCallbackClosed(lws * wsi, lws_callback_reasons reaso return HttpDummy(wsi, reason, user, in, len); } -void WebSocketServerExec::RemoveConnections(const std::string &id, UserData &userData) +void WebSocketServerExec::RemoveConnections(const std::string &id, UserData &userData) { if (webSocketConnection_.empty()) { NETSTACK_LOGE("connection list is empty"); @@ -483,8 +478,8 @@ void WebSocketServerExec::RemoveConnections(const std::string &id, UserData &use } } -int WebSocketServerExec::LwsCallbackWsiDestroyServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackWsiDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws server callback wsi destroy"); if (wsi == nullptr) { @@ -506,15 +501,15 @@ int WebSocketServerExec::LwsCallbackWsiDestroyServer(lws * wsi, lws_callback_rea return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackProtocolDestroyServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackProtocolDestroyServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws server callback protocol destroy"); return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackServerWriteable(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackServerWriteable(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws callback Server writable"); lws_context *context = lws_get_context(wsi); @@ -551,7 +546,7 @@ int WebSocketServerExec::LwsCallbackServerWriteable(lws * wsi, lws_callback_reas NETSTACK_LOGE("send data is empty"); return HttpDummy(wsi, reason, user, in, len); } - int sendLength = lws_write(wsi, reinterpret_cast(sendData.data) LWS_SEND_BUFFER_PRE_PADDING, + int sendLength = lws_write(wsi, reinterpret_cast(sendData.data) + LWS_SEND_BUFFER_PRE_PADDING, sendData.length, sendData.protocol); free(sendData.data); NETSTACK_LOGD("lws send data length is %{public}d", sendLength); @@ -562,8 +557,8 @@ int WebSocketServerExec::LwsCallbackServerWriteable(lws * wsi, lws_callback_reas return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws server callback ws peer initiated close"); if (wsi == nullptr) { @@ -584,14 +579,14 @@ int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws * wsi, lws_ca } uint16_t closeStatus = ntohs(*reinterpret_cast(in)); std::string closeReason; - closeReason.append(reinterpret_cast(in) sizeof(uint16_t), len - sizeof(uint16_t)); + closeReason.append(reinterpret_cast(in) + sizeof(uint16_t), len - sizeof(uint16_t)); auto *clientUserData = reinterpret_cast(lws_wsi_user(wsi)); clientUserData->Close(static_cast(closeStatus), closeReason); return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws server callback filter ProtocolConnection"); lws_context *context = lws_get_context(wsi); @@ -633,7 +628,7 @@ int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws * wsi, lws_call return HttpDummy(wsi, reason, user, in, len); } -bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) +bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) { if (IsIpInBlacklist(clientId)) { NETSTACK_LOGE("clientid is in blacklist"); @@ -648,7 +643,7 @@ bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) return true; } -void WebSocketServerExec::UpdataClientList(const std::string &id) +void WebSocketServerExec::UpdataClientList(const std::string &id) { std::shared_lock lock(connListMutex_); auto it = clientList.find(id); @@ -661,18 +656,18 @@ void WebSocketServerExec::UpdataClientList(const std::string &id) NETSTACK_LOGI("reset clientid connections cnt"); it->second = {1, GetCurrentSecond()}; } else { - it->second.cnt; + it->second.cnt++; } } } -void WebSocketServerExec::AddBlackList(const std::string &id) +void WebSocketServerExec::AddBlackList(const std::string &id) { std::shared_lock lock(blackListMutex_); - blackList[id] = GetCurrentSecond() ONE_MINUTE_IN_SEC; + blackList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; } -bool WebSocketServerExec::IsIpInBlacklist(const std::string &id) +bool WebSocketServerExec::IsIpInBlacklist(const std::string &id) { std::shared_lock lock(blackListMutex_); auto it = blackList.find(id); @@ -687,12 +682,13 @@ bool WebSocketServerExec::IsIpInBlacklist(const std::string &id) return false; } -uint64_t WebSocketServerExec::GetCurrentSecond() +uint64_t WebSocketServerExec::GetCurrentSecond() { - return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()) + .count(); } -bool WebSocketServerExec::IsHighFreqConnection(const std::string &id) +bool WebSocketServerExec::IsHighFreqConnection(const std::string &id) { std::shared_lock lock(connListMutex_); auto it = clientList.find(id); @@ -705,7 +701,7 @@ bool WebSocketServerExec::IsHighFreqConnection(const std::string &id) return false; } -bool WebSocketServerExec::IsAllowedProtocol(lws * wsi) +bool WebSocketServerExec::IsAllowedProtocol(lws *wsi) { char requested_protocol[128] = {0}; int32_t res = lws_hdr_copy(wsi, requested_protocol, sizeof(requested_protocol), WSI_TOKEN_PROTOCOL); @@ -720,8 +716,8 @@ bool WebSocketServerExec::IsAllowedProtocol(lws * wsi) return true; } -int WebSocketServerExec::LwsCallbackReceive(lws * wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, + size_t len) { NETSTACK_LOGD("lws callback server receive"); lws_context *context = lws_get_context(wsi); @@ -731,7 +727,7 @@ int WebSocketServerExec::LwsCallbackReceive(lws * wsi, lws_callback_reasons reas return HttpDummy(wsi, reason, user, in, len); } -static napi_value CreateServerClosePara(napi_env env, void *callbackPara) +static napi_value CreateServerClosePara(napi_env env, void *callbackPara) { auto para = reinterpret_cast(callbackPara); auto deleter = [](const ClientConnectionCloseCallback *p) { delete p; }; @@ -757,7 +753,7 @@ static napi_value CreateServerClosePara(napi_env env, void *callbackPara) return obj; } -static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessage *msg) +static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessage *msg) { napi_value jsMsg = NapiUtils::CreateObject(env); if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { @@ -780,7 +776,7 @@ static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessag return NapiUtils::GetUndefined(env); } -static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) +static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) { auto pair = reinterpret_cast> *>(callbackPara); if (pair == nullptr) { @@ -811,7 +807,7 @@ static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara return jsMsg; } -static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage *msg) +static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage *msg) { napi_value jsMsg = NapiUtils::CreateObject(env); if (NapiUtils::GetValueType(env, jsMsg) != napi_object) { @@ -828,7 +824,7 @@ static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage return jsMsg; } -static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) +static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) { auto pair = reinterpret_cast> *>(callbackPara); if (pair == nullptr) { @@ -860,7 +856,7 @@ static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) return jsMsg; } -static napi_value CreateConnectPara(napi_env env, void *callbackPara) +static napi_value CreateConnectPara(napi_env env, void *callbackPara) { auto para = reinterpret_cast(callbackPara); auto deleter = [](const WebSocketConnection *p) { delete p; }; @@ -875,7 +871,7 @@ static napi_value CreateConnectPara(napi_env env, void *callbackPara) return obj; } -static napi_value CreateServerError(napi_env env, void *callbackPara) +static napi_value CreateServerError(napi_env env, void *callbackPara) { auto code = reinterpret_cast(callbackPara); if (code == nullptr) { @@ -891,7 +887,7 @@ static napi_value CreateServerError(napi_env env, void *callbackPara) return err; } -void WebSocketServerExec::OnServerError(EventManager * manager, int32_t code) +void WebSocketServerExec::OnServerError(EventManager *manager, int32_t code) { NETSTACK_LOGI("OnServerError %{public}d", code); if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -907,7 +903,7 @@ void WebSocketServerExec::OnServerError(EventManager * manager, int32_t code) manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); } -void WebSocketServerExec::OnConnect(lws * wsi, EventManager * manager) +void WebSocketServerExec::OnConnect(lws *wsi, EventManager *manager) { NETSTACK_LOGI("OnConnect enter"); if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -936,8 +932,8 @@ void WebSocketServerExec::OnConnect(lws * wsi, EventManager * manager) NETSTACK_LOGE("not found client msg"); } -void WebSocketServerExec::OnServerClose(lws * wsi, EventManager * manager, lws_close_status closeStatus, - const std::string &closeReason) +void WebSocketServerExec::OnServerClose(lws *wsi, EventManager *manager, lws_close_status closeStatus, + const std::string &closeReason) { NETSTACK_LOGI("OnServerClose %{public}u %{public}s", closeStatus, closeReason.c_str()); if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -974,8 +970,8 @@ void WebSocketServerExec::OnServerClose(lws * wsi, EventManager * manager, lws_c NETSTACK_LOGE("not found client msg"); } -void WebSocketServerExec::OnServerMessage(lws * wsi, EventManager * manager, void *data, - size_t length, bool isBinary, bool isFinal) +void WebSocketServerExec::OnServerMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal) { NETSTACK_LOGD("server OnMessage %{public}d", isBinary); if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -994,8 +990,8 @@ void WebSocketServerExec::OnServerMessage(lws * wsi, EventManager * manager, voi HandleServerRcvMessage(wsi, manager, data, length, isBinary, isFinal); } -void WebSocketServerExec::HandleServerRcvMessage(lws * wsi, EventManager * manager, void *data, - size_t length, bool isBinary, bool isFinal) +void WebSocketServerExec::HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, + size_t length, bool isBinary, bool isFinal) { if (isBinary) { manager->AppendWsServerBinaryData(wsi, data, length); @@ -1036,8 +1032,8 @@ void WebSocketServerExec::HandleServerRcvMessage(lws * wsi, EventManager * manag } } -void WebSocketServerExec::SetWebsocketMessage(lws * wsi, EventManager * manager, - const std::string &msgFromManager, void *dataMsg) +void WebSocketServerExec::SetWebsocketMessage(lws *wsi, EventManager *manager, + const std::string &msgFromManager, void *dataMsg) { NETSTACK_LOGD("SetWebsocketMessage enter"); if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { @@ -1067,7 +1063,7 @@ void WebSocketServerExec::SetWebsocketMessage(lws * wsi, EventManager * manager, NETSTACK_LOGE("not found client msgFromManager"); } -bool WebSocketServerExec::ExecServerStart(ServerStartContext * context) +bool WebSocketServerExec::ExecServerStart(ServerStartContext *context) { NETSTACK_LOGD("websocket server start exec"); if (context == nullptr) { @@ -1113,7 +1109,7 @@ bool WebSocketServerExec::ExecServerStart(ServerStartContext * context) return true; } -void WebSocketServerExec::StartService(lws_context_creation_info & info, std::shared_ptr & manager) +void WebSocketServerExec::StartService(lws_context_creation_info &info, std::shared_ptr &manager) { lws_context *lwsContext = nullptr; std::shared_ptr userData; @@ -1129,8 +1125,8 @@ void WebSocketServerExec::StartService(lws_context_creation_info & info, std::sh serviceThread.detach(); } -void WebSocketServerExec::FillServerContextInfo(ServerStartContext * context, std::shared_ptr & manager, - lws_context_creation_info & info) +void WebSocketServerExec::FillServerContextInfo(ServerStartContext *context, std::shared_ptr &manager, + lws_context_creation_info &info) { info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE; info.port = context->GetServerPort(); @@ -1144,7 +1140,7 @@ void WebSocketServerExec::FillServerContextInfo(ServerStartContext * context, st info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; } -static bool CheckFilePath(std::string & path) +static bool CheckFilePath(std::string &path) { char tmpPath[PATH_MAX] = {0}; if (!realpath(static_cast(path.c_str()), tmpPath)) { @@ -1155,7 +1151,7 @@ static bool CheckFilePath(std::string & path) return true; } -bool WebSocketServerExec::FillServerCertPath(ServerStartContext * context, lws_context_creation_info & info) +bool WebSocketServerExec::FillServerCertPath(ServerStartContext *context, lws_context_creation_info &info) { if (!context->certPath_.empty()) { if (!CheckFilePath(context->certPath_) || !CheckFilePath(context->keyPath_)) { @@ -1169,7 +1165,7 @@ bool WebSocketServerExec::FillServerCertPath(ServerStartContext * context, lws_c return true; } -bool WebSocketServerExec::ExecListAllConnections(ListAllConnectionsContext * context) +bool WebSocketServerExec::ExecListAllConnections(ListAllConnectionsContext *context) { NETSTACK_LOGD("ListAllConnections start exec"); if (context == nullptr) { @@ -1200,7 +1196,7 @@ bool WebSocketServerExec::ExecListAllConnections(ListAllConnectionsContext * con return true; } -std::vector WebSocketServerExec::GetConnections() +std::vector WebSocketServerExec::GetConnections() { std::shared_lock lock(wsMutex_); std::vector conn; @@ -1212,7 +1208,7 @@ std::vector WebSocketServerExec::GetConnections() return conn; } -bool WebSocketServerExec::ExecServerClose(ServerCloseContext * context) +bool WebSocketServerExec::ExecServerClose(ServerCloseContext *context) { if (context == nullptr) { NETSTACK_LOGE("context is nullptr"); @@ -1232,7 +1228,7 @@ bool WebSocketServerExec::ExecServerClose(ServerCloseContext * context) NETSTACK_LOGE("connection is empty"); return false; } - std::string clientId = conn.clientIP ":" std::to_string(conn.clientPort); + std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); NETSTACK_LOGI("ExecServerClose, clientID:%{public}s", clientId.c_str()); auto wsi = GetClientWsi(clientId); if (wsi == nullptr) { @@ -1255,7 +1251,7 @@ bool WebSocketServerExec::ExecServerClose(ServerCloseContext * context) return true; } -bool WebSocketServerExec::ExecServerSend(ServerSendContext * context) +bool WebSocketServerExec::ExecServerSend(ServerSendContext *context) { if (context == nullptr) { NETSTACK_LOGE("context is nullptr"); @@ -1270,7 +1266,7 @@ bool WebSocketServerExec::ExecServerSend(ServerSendContext * context) NETSTACK_LOGE("connection is empty"); return false; } - std::string clientId = conn.clientIP ":" std::to_string(conn.clientPort); + std::string clientId = conn.clientIP + ":" + std::to_string(conn.clientPort); NETSTACK_LOGI("connection clientid:%{public}s", clientId.c_str()); auto wsi = GetClientWsi(clientId); if (wsi == nullptr) { @@ -1293,7 +1289,7 @@ bool WebSocketServerExec::ExecServerSend(ServerSendContext * context) return true; } -lws *WebSocketServerExec::GetClientWsi(const std::string clientId) +lws *WebSocketServerExec::GetClientWsi(const std::string clientId) { std::shared_lock lock(wsMutex_); if (webSocketConnection_.empty()) { @@ -1308,7 +1304,7 @@ lws *WebSocketServerExec::GetClientWsi(const std::string clientId) return it->second.first; } -bool WebSocketServerExec::ExecServerStop(ServerStopContext * context) +bool WebSocketServerExec::ExecServerStop(ServerStopContext *context) { if (context == nullptr) { NETSTACK_LOGE("context is nullptr"); @@ -1338,7 +1334,7 @@ bool WebSocketServerExec::ExecServerStop(ServerStopContext * context) return true; } -void WebSocketServerExec::CloseAllConnection(const std::shared_ptr &userData) +void WebSocketServerExec::CloseAllConnection(const std::shared_ptr &userData) { decltype(webSocketConnection_) connListTmp; { @@ -1366,12 +1362,12 @@ void WebSocketServerExec::CloseAllConnection(const std::shared_ptr &us NETSTACK_LOGI("CloseAllConnection OK"); } -napi_value WebSocketServerExec::ServerStartCallback(ServerStartContext * context) +napi_value WebSocketServerExec::ServerStartCallback(ServerStartContext *context) { return NapiUtils::GetBoolean(context->GetEnv(), true); } -napi_value WebSocketServerExec::ListAllConnectionsCallback(ListAllConnectionsContext * context) +napi_value WebSocketServerExec::ListAllConnectionsCallback(ListAllConnectionsContext *context) { if (context == nullptr) { NETSTACK_LOGE("Context is null"); @@ -1394,17 +1390,17 @@ napi_value WebSocketServerExec::ListAllConnectionsCallback(ListAllConnectionsCon return connectionsArray; } -napi_value WebSocketServerExec::ServerSendCallback(ServerSendContext * context) +napi_value WebSocketServerExec::ServerSendCallback(ServerSendContext *context) { return NapiUtils::GetBoolean(context->GetEnv(), true); } -napi_value WebSocketServerExec::ServerCloseCallback(ServerCloseContext * context) +napi_value WebSocketServerExec::ServerCloseCallback(ServerCloseContext *context) { return NapiUtils::GetBoolean(context->GetEnv(), true); } -napi_value WebSocketServerExec::ServerStopCallback(ServerStopContext * context) +napi_value WebSocketServerExec::ServerStopCallback(ServerStopContext *context) { auto manager = context->GetSharedManager(); if (manager != nullptr) { -- Gitee From ce3f47ec2a0f522c2b770d6d44dc9f3239d05a18 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:00:51 +0000 Subject: [PATCH 060/126] update frameworks/js/napi/websocket/utils/include/websocket_utils.h. Signed-off-by: wendan4 --- .../js/napi/websocket/utils/include/websocket_utils.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frameworks/js/napi/websocket/utils/include/websocket_utils.h b/frameworks/js/napi/websocket/utils/include/websocket_utils.h index acee87c28..086dc11f8 100644 --- a/frameworks/js/napi/websocket/utils/include/websocket_utils.h +++ b/frameworks/js/napi/websocket/utils/include/websocket_utils.h @@ -19,10 +19,8 @@ #include #include -namespace OHOS::NetStack::Websocket -{ - struct WebSocketConnection - { +namespace OHOS::NetStack::Websocket { + struct WebSocketConnection { std::string clientIP; uint32_t clientPort; }; -- Gitee From 7fc4b39fd43b33c95e42d6f8d24481b0aee856d1 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:07:11 +0000 Subject: [PATCH 061/126] update utils/BUILD.gn. Signed-off-by: wendan4 --- utils/BUILD.gn | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 945683a10..c4c8ea856 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -69,7 +69,6 @@ ohos_shared_library("stack_utils_common") { "bounds_checking_function:libsec_shared", "hilog:libhilog", "hisysevent:libhisysevent", - "libwebsockets:websockets", "samgr:samgr_proxy", ] -- Gitee From f95f1a379b84e2c3f08eac89ebbc9fd3e58d5d53 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:07:59 +0000 Subject: [PATCH 062/126] update utils/common_utils/src/netstack_common_utils.cpp. Signed-off-by: wendan4 --- utils/common_utils/src/netstack_common_utils.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/common_utils/src/netstack_common_utils.cpp b/utils/common_utils/src/netstack_common_utils.cpp index 4e0c1f25e..394e83f36 100644 --- a/utils/common_utils/src/netstack_common_utils.cpp +++ b/utils/common_utils/src/netstack_common_utils.cpp @@ -606,8 +606,7 @@ bool IsCleartextPermitted(const std::string &url, const std::string &protocol) bool IsValidPort(const uint32_t &port) { - if (port < 0 || port > MAX_PORT) - { + if (port < 0 || port > MAX_PORT) { return false; } return true; -- Gitee From 09afabbafe5f858569621f779f332e9e3bdd22ef Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:22:21 +0000 Subject: [PATCH 063/126] update frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp. Signed-off-by: wendan4 --- .../src/websocket_server_exec.cpp | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index 4ecb5dd5a..868a67d96 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -14,13 +14,13 @@ */ #include "websocket_server_exec.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include #include "constant.h" #include "napi_utils.h" @@ -63,9 +63,9 @@ static std::shared_mutex wsMutex_; static std::shared_mutex connListMutex_; -static std::shared_mutex blackListMutex_; +static std::shared_mutex banListMutex_; -static std::unordered_map blackList; +static std::unordered_map banList; static std::unordered_map clientList; @@ -354,7 +354,8 @@ int WebSocketServerExec::LwsCallbackEstablished(lws *wsi, lws_callback_reasons r return HttpDummy(wsi, reason, user, in, len); } -bool WebSocketServerExec::GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, WebSocketConnection &conn) +bool WebSocketServerExec::GetPeerConnMsg(lws *wsi, EventManager *manager, std::string &clientId, + WebSocketConnection &conn) { struct sockaddr_storage addr{}; socklen_t addrLen = sizeof(addr); @@ -437,7 +438,7 @@ int WebSocketServerExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason } clientUserData->SetThreadStop(true); if ((clientUserData->closeReason).empty()) { - clientUserData->Close(clientUserData->closeStatus, LINK_DOWN); + clientUserData->Close(clientUserData->closeStatus, LINK_DOWN); } if (clientUserData->closeStatus == LWS_CLOSE_STATUS_NOSTATUS) { NETSTACK_LOGE("The link is down, onError"); @@ -557,8 +558,8 @@ int WebSocketServerExec::LwsCallbackServerWriteable(lws *wsi, lws_callback_reaso return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len) { NETSTACK_LOGD("lws server callback ws peer initiated close"); if (wsi == nullptr) { @@ -585,8 +586,8 @@ int WebSocketServerExec::LwsCallbackWsPeerInitiatedCloseServer(lws *wsi, lws_cal return HttpDummy(wsi, reason, user, in, len); } -int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, void *user, void *in, - size_t len) +int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callback_reasons reason, + void *user, void *in, size_t len) { NETSTACK_LOGD("lws server callback filter ProtocolConnection"); lws_context *context = lws_get_context(wsi); @@ -630,13 +631,13 @@ int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callb bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) { - if (IsIpInBlacklist(clientId)) { - NETSTACK_LOGE("clientid is in blacklist"); + if (IsIpInBanlist(clientId)) { + NETSTACK_LOGE("clientid is in banlist"); return false; } if (IsHighFreqConnection(clientId)) { NETSTACK_LOGE("clientid reach high frequency connection"); - AddBlackList(clientId); + AddBanList(clientId); return false; } UpdataClientList(clientId); @@ -648,7 +649,7 @@ void WebSocketServerExec::UpdataClientList(const std::string &id) std::shared_lock lock(connListMutex_); auto it = clientList.find(id); if (it == clientList.end()) { - NETSTACK_LOGI("add clientid to blacklist"); + NETSTACK_LOGI("add clientid to banlist"); clientList[id] = {1, GetCurrentSecond()}; } else { auto now = GetCurrentSecond() - it->second.lastConnectionTime; @@ -661,22 +662,22 @@ void WebSocketServerExec::UpdataClientList(const std::string &id) } } -void WebSocketServerExec::AddBlackList(const std::string &id) +void WebSocketServerExec::AddBanList(const std::string &id) { - std::shared_lock lock(blackListMutex_); - blackList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; + std::shared_lock lock(banListMutex_); + banList[id] = GetCurrentSecond() + ONE_MINUTE_IN_SEC; } -bool WebSocketServerExec::IsIpInBlacklist(const std::string &id) +bool WebSocketServerExec::IsIpInBanList(const std::string &id) { - std::shared_lock lock(blackListMutex_); - auto it = blackList.find(id); - if (it != blackList.end()) { + std::shared_lock lock(banListMutex_); + auto it = banList.find(id); + if (it != banList.end()) { auto now = GetCurrentSecond(); if (now < it->second) { return true; } else { - blackList.erase(it); + banList.erase(it); } } return false; @@ -895,12 +896,12 @@ void WebSocketServerExec::OnServerError(EventManager *manager, int32_t code) return; } bool hasServerEventListener = manager->HasEventListener(EventName::EVENT_SERVER_ERROR); - if (!hasServerEventListener){ + if (!hasServerEventListener) { NETSTACK_LOGI("no event listener: %{public}s", EventName::EVENT_SERVER_ERROR); return; } auto para = new int32_t(code); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_ERROR, para, CallbackTemplate); } void WebSocketServerExec::OnConnect(lws *wsi, EventManager *manager) @@ -1117,11 +1118,11 @@ void WebSocketServerExec::StartService(lws_context_creation_info &info, std::sha userData = std::make_shared(lwsContext); manager->SetWebSocketUserData(userData); std::thread serviceThread(RunServerService, userData, manager); - #if defined (MAC_PLATFORM) || defined(IOS_PLATFORM) +#if defined(MAC_PLATFORM) || defined(IOS_PLATFORM) pthread_setname_np(WEBSOCKET_SERVER_THREAD_RUN); - #else +#else pthread_setname_np(serviceThread.native_handle(), WEBSOCKET_SERVER_THREAD_RUN); - #endif +#endif serviceThread.detach(); } @@ -1213,7 +1214,6 @@ bool WebSocketServerExec::ExecServerClose(ServerCloseContext *context) if (context == nullptr) { NETSTACK_LOGE("context is nullptr"); return false; - } if (!CommonUtils::HasInternetPermission()) { context->SetPermissionDenied(true); -- Gitee From 394e05ec088b4d5a2e1af4e14e1d7a2e9e5666fe Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:23:04 +0000 Subject: [PATCH 064/126] update test/unittest/websocket/WebSocketTest.cpp. Signed-off-by: wendan4 --- test/unittest/websocket/WebSocketTest.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 285ca8a27..31ee819c9 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -374,7 +374,6 @@ HWTEST_F(WebSocketTest, WebSocketTest034, TestSize.Level1) context.SetPermissionDenied(false); bool ret = WebSocketExec::ExecClose(&context); EXPECT_EQ(ret, false); - } #endif } // namespace \ No newline at end of file -- Gitee From 9219556a0db3bc21eb8d94b703de7881c0ad370d Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:24:22 +0000 Subject: [PATCH 065/126] update frameworks/js/napi/websocket/async_context/include/server_stop_context.h. Signed-off-by: wendan4 --- .../napi/websocket/async_context/include/server_stop_context.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/websocket/async_context/include/server_stop_context.h b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h index 415ae5d8e..986600a22 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_stop_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_stop_context.h @@ -21,7 +21,7 @@ #include "nocopyable.h" namespace OHOS::NetStack::Websocket { -class ServerStopContext final : public BaseContext{ +class ServerStopContext final : public BaseContext { public: DISALLOW_COPY_AND_MOVE(ServerStopContext); -- Gitee From b316c46594d96e241d4ad5f4063bc2729d162eac Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:25:43 +0000 Subject: [PATCH 066/126] update frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h. Signed-off-by: wendan4 --- .../websocket/websocket_exec/include/websocket_server_exec.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h index 71773048f..30b9dd8b1 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h @@ -108,11 +108,11 @@ private: static bool IsAllowConnection(const std::string &clientId); - static bool IsIpInBlacklist(const std::string &id); + static bool IsIpInBanList(const std::string &id); static bool IsHighFreqConnection(const std::string &id); - static void AddBlackList(const std::string &id); + static void AddBanList(const std::string &id); static void UpdataClientList(const std::string &id); -- Gitee From e691c00a794e5fb2ba1281f10396b3a72cd69f48 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:40:47 +0000 Subject: [PATCH 067/126] update frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h. Signed-off-by: wendan4 --- .../websocket_exec/include/websocket_server_exec.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h index 30b9dd8b1..d8c07f79c 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h @@ -12,11 +12,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + #ifndef COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H #define COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H -#include "server_start_context.h" +#include "server_start_context.h" #include "list_all_connections_context.h" #include "server_send_context.h" #include "server_close_context.h" @@ -139,4 +139,4 @@ private: static std::vector GetConnections(); }; } // namespace OHOS::NetStack::Websocket - #endif /* COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_H */ \ No newline at end of file +#endif /* COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_H */ \ No newline at end of file -- Gitee From 4e4d1f43906187f02a84114490c52f7f4f6f2176 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:41:04 +0000 Subject: [PATCH 068/126] update frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp. Signed-off-by: wendan4 --- .../napi/websocket/websocket_exec/src/websocket_server_exec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index 868a67d96..36aa6396e 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include "constant.h" #include "napi_utils.h" #include "netstack_common_utils.h" -- Gitee From 17ba669bdc6f5011963c82968fce389e37a6ff5d Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 08:45:21 +0000 Subject: [PATCH 069/126] update netstack_config.gni. Signed-off-by: wendan4 --- netstack_config.gni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netstack_config.gni b/netstack_config.gni index 52dd3ffe7..93866d8fe 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,5 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false - netstack_websocket_server_enable = false + netstack_websocket_server_enable = true } -- Gitee From 679202402ff1d01b2bcf7a9c648fd01cf73d0542 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 09:01:05 +0000 Subject: [PATCH 070/126] update frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp. Signed-off-by: wendan4 --- .../napi/websocket/websocket_exec/src/websocket_server_exec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index 36aa6396e..2afd95017 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -631,7 +631,7 @@ int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callb bool WebSocketServerExec::IsAllowConnection(const std::string &clientId) { - if (IsIpInBanlist(clientId)) { + if (IsIpInBanList(clientId)) { NETSTACK_LOGE("clientid is in banlist"); return false; } -- Gitee From e3d2f66e40a95e261975c7f91775db95adac912a Mon Sep 17 00:00:00 2001 From: wendan4 Date: Tue, 6 May 2025 09:26:43 +0000 Subject: [PATCH 071/126] update netstack_config.gni. Signed-off-by: wendan4 --- netstack_config.gni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netstack_config.gni b/netstack_config.gni index 93866d8fe..52dd3ffe7 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,5 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false - netstack_websocket_server_enable = true + netstack_websocket_server_enable = false } -- Gitee From 225bcdffc641a31b3bb952e3693a5f72c4542a57 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Tue, 6 May 2025 21:20:25 +0800 Subject: [PATCH 072/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- bundle.json | 3 +- frameworks/js/napi/http/BUILD.gn | 1 + interfaces/innerkits/http_client/BUILD.gn | 1 + test/unittest/http/BUILD.gn | 1 + .../include/i_netstack_chr_client.h | 46 +++++++ .../include/netstack_chr_client.h | 4 +- .../include/netstack_chr_report.h | 43 ++++++ .../src/netstack_chr_client.cpp | 5 + .../src/netstack_chr_report.cpp | 122 ++++++++++++++++++ 9 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 utils/netstack_chr_client/include/netstack_chr_report.h create mode 100644 utils/netstack_chr_client/src/netstack_chr_report.cpp diff --git a/bundle.json b/bundle.json index b36133680..e5147f5a6 100644 --- a/bundle.json +++ b/bundle.json @@ -56,7 +56,8 @@ "libwebsockets", "node", "jsoncpp", - "netmanager_enhanced" + "netmanager_enhanced", + "common_event_service" ] }, "build": { diff --git a/frameworks/js/napi/http/BUILD.gn b/frameworks/js/napi/http/BUILD.gn index 023efe4db..257dee258 100644 --- a/frameworks/js/napi/http/BUILD.gn +++ b/frameworks/js/napi/http/BUILD.gn @@ -165,6 +165,7 @@ ohos_shared_library("http") { defines = [ "HAS_NETMANAGER_BASE=1" ] sources += [ "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_client.cpp", + "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_report.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_multi_driver.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_request_handler.cpp", ] diff --git a/interfaces/innerkits/http_client/BUILD.gn b/interfaces/innerkits/http_client/BUILD.gn index b2fa2fc2e..518624ab6 100644 --- a/interfaces/innerkits/http_client/BUILD.gn +++ b/interfaces/innerkits/http_client/BUILD.gn @@ -63,6 +63,7 @@ ohos_shared_library("http_client") { "$NETSTACK_DIR/utils/http_over_curl/src/epoll_multi_driver.cpp", "$NETSTACK_DIR/utils/http_over_curl/src/epoll_request_handler.cpp", "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_client.cpp", + "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_report.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/http_client_network_message.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/i_network_message.cpp", "$NETSTACK_DIR/utils/profiler_utils/src/netstack_network_profiler.cpp", diff --git a/test/unittest/http/BUILD.gn b/test/unittest/http/BUILD.gn index 1fd029d91..6ca74cc89 100644 --- a/test/unittest/http/BUILD.gn +++ b/test/unittest/http/BUILD.gn @@ -79,6 +79,7 @@ ohos_unittest("http_unittest") { "$NETSTACK_NAPI_ROOT/http/options/src/http_response.cpp", "$SUBSYSTEM_DIR/netstack/utils/common_utils/src/netstack_common_utils.cpp", "$SUBSYSTEM_DIR/netstack/utils/netstack_chr_client/src/netstack_chr_client.cpp", + "$SUBSYSTEM_DIR/netstack/utils/netstack_chr_client/src/netstack_chr_report.cpp", "$SUBSYSTEM_DIR/netstack/utils/http_over_curl/src/epoll_request_handler.cpp", "$SUBSYSTEM_DIR/netstack/utils/profiler_utils/src/netstack_network_profiler.cpp", "$SUBSYSTEM_DIR/netstack/utils/tlv_utils/src/tlv_utils.cpp", diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 04a99cb53..03ce178ea 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -77,5 +77,51 @@ typedef struct DataTransChrStats { DataTransTcpInfo tcpInfo; } DataTransChrStats; +constexpr int REPORT_CHR_RESULT_SUCCESS = 0; +constexpr int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; +constexpr int REPORT_CHR_RESULT_SET_DATA_FAIL = 2; +constexpr int REPORT_CHR_RESULT_REPORT_FAIL = 3; + +constexpr char UID_KEY[] = "uid"; +constexpr char SOCKFD_KEY[] = "sockfd"; + +constexpr char HTTP_INFO_KEY[] = "http_info"; +constexpr char CURL_CODE_KEY[] = "curl_code"; +constexpr char RESPONSE_CODE_KEY[] = "response_code"; +constexpr char TOTAL_TIME_KEY[] = "total_time"; +constexpr char NAMELOOKUP_TIME_KEY[] = "namelookup_time"; +constexpr char CONNECT_TIME_KEY[] = "connect_time"; +constexpr char APPCONNECT_TIME_KEY[] = "appconnect_time"; +constexpr char PRETRANSFER_TIME_KEY[] = "pretransfer_time"; +constexpr char STARTTRANSFER_TIME_KEY[] = "starttransfer_time"; +constexpr char QUEUE_TIME_KEY[] = "queue_time"; +constexpr char RETRY_AFTER_KEY[] = "retry_after"; +constexpr char SIZE_UPLOAD_KEY[] = "size_upload"; +constexpr char SIZE_DOWNLOAD_KEY[] = "size_download"; +constexpr char SPEED_DOWNLOAD_KEY[] = "speed_download"; +constexpr char SPEED_UPLOAD_KEY[] = "speed_upload"; +constexpr char EFFECTIVE_METHOD_KEY[] = "effective_method"; +constexpr char CONTENT_TYPE_KEY[] = "content_type"; +constexpr char REDIRECT_TIME_KEY[] = "redirect_time"; +constexpr char REDIRECT_COUNT_KEY[] = "redirect_count"; +constexpr char PROXY_ERROR_KEY[] = "proxy_error"; +constexpr char OS_ERRNO_KEY[] = "os_errno"; +constexpr char SSL_VERIFYRESULT_KEY[] = "ssl_verifyresult"; + +constexpr char TCP_INFO_KEY[] = "tcp_info"; +constexpr char TCPI_RETRANSMITS_KEY[] = "tcpi_retransmits"; +constexpr char TCPI_UNACKED_KEY[] = "tcpi_unacked"; +constexpr char TCPI_LAST_DATA_SENT_KEY[] = "tcpi_last_data_sent"; +constexpr char TCPI_LAST_ACK_SENT_KEY[] = "tcpi_last_ack_sent"; +constexpr char TCPI_LAST_DATA_RECV_KEY[] = "tcpi_last_data_recv"; +constexpr char TCPI_LAST_ACK_RECV_KEY[] = "tcpi_last_ack_recv"; +constexpr char TCPI_RTT_KEY[] = "tcpi_rtt"; +constexpr char TCPI_RTTVAR_KEY[] = "tcpi_rttvar"; +constexpr char TCPI_TOTAL_RETRANS_KEY[] = "tcpi_total_retrans"; +constexpr char SRC_IP_KEY[] = "src_ip"; +constexpr char DST_IP_KEY[] = "dst_ip"; +constexpr char SRC_PORT_KEY[] = "src_port"; +constexpr char DST_PORT_KEY[] = "dst_port"; + } // namespace OHOS::NetStack #endif // COMMUNICATIONNETSTACK_I_NETSTACK_CHR_CLIENT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/include/netstack_chr_client.h b/utils/netstack_chr_client/include/netstack_chr_client.h index 9fcccd9d9..ea908ef7f 100644 --- a/utils/netstack_chr_client/include/netstack_chr_client.h +++ b/utils/netstack_chr_client/include/netstack_chr_client.h @@ -21,7 +21,7 @@ #include #include "curl/curl.h" - +#include "netstack_chr_report.h" #include "i_netstack_chr_client.h" namespace OHOS::NetStack::ChrClient { @@ -44,7 +44,7 @@ private: static DataType GetNumericAttributeFromCurl(CURL *handle, CURLINFO info); static std::string GetStringAttributeFromCurl(CURL *handle, CURLINFO info); static bool shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); - // HttpChrReport httpReport; + NetstackChrReport netstackChrReport; }; } // namespace OHOS::NetStack::ChrClient diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h new file mode 100644 index 000000000..6e8990455 --- /dev/null +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H +#define COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H + +#include +#include +#include +#include "i_netstack_chr_client.h" +#include "want.h" + +namespace OHOS::NatStack::ChrClient { + +class NetstackChrReport { +public: + NetstackChrReport(); + ~NetstackChrReport(); + + int ReportCommonEvent(DataTransChrStats chrStats); +private: + std::chrono::system_clock::time_point lastReceivedTime_; + std::mutex agentMutex_; + + int ConvertWantParam(AAFwk::Want& want, DataTransChrStats chrStats); + std::string ConvertHttpInfoToJsonStr(DataTransChrStats chrStats); + std::string ConvertTcpInfoToJsonStr(DataTransChrStats chrStats); +}; + +} // namespace OHOS::NatStack::ChrClient +#endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index 916b555da..25f75b1f7 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -206,6 +206,11 @@ void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t if (!GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo)) { NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", dataTransChrStats.sockfd); } + + int ret = netstackChrReport.ReportCommonEvent(dataTransChrStats); + if (ret > 0) { + NETSTACK_LOGE("Send to CHR failed."); + } } } // namespace OHOS::NetStack::ChrClient \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp new file mode 100644 index 000000000..043b75c3e --- /dev/null +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include "i_netstack_chr_client.h" +#include "netstack_chr_client.h" +#include "netstack_log.h" +#include "common_event_manager.h" +#include "want.h" + +namespace OHOS::NetStack::ChrClient { + +constexpr char REPORT_HTTP_EVENT_NAME[] = "custom.event.CHR_REPORT_HTTP"; +constexpr int REPORT_TIME_LIMIT_MINUTE = 5; + +NetstackChrReport::NetstackChrReport() +{} + +NetstackChrReport::~NetstackChrReport() +{} + +int NetstackChrReport::ReportCommonEvent(DataTransChrStats chrStats) +{ + std::lock_guard lock(agentMutex_); + auto currentTime = std::chrono::system_clock::now(); + auto timeDifference = std::chrono::duration_cast(currentTime - lastReceivedTime_); + if (timeDifference.count() < REPORT_TIME_LIMIT_MINUTE) { + NETSTACK_LOGE("From last report %{public}ld minutes, ignore this report.", timeDifference.count()); + return REPORT_CHR_RESULT_TIME_LIMIT_ERROR; + } + AAFwk::Want want; + want.SetAction(REPORT_HTTP_EVENT_NAME); + if (!ConvertWantParam(want, chrStats)) { + return REPORT_CHR_RESULT_SET_DATA_FAIL; + } + + EventFwk::CommonEventData common_event_data; + common_event_data.SetWant(want); + EventFwk::CommonEventPublishInfo publish_info; + if (!EventFwk::CommonEventManager::PublishCommonEvent(common_event_data, publish_info)) { + NETSTACK_LOGE("Report to CHR failed."); + return REPORT_CHR_RESULT_REPORT_FAIL; + } + lastReceivedTime_ = currentTime; + NETSTACK_LOGI("Report to CHR success."); + return REPORT_CHR_RESULT_SUCCESS; +} + +int NetstackChrReport::ConvertWantParam(AAFwk::Want& want, DataTransChrStats chrStats) +{ + std::string httpInfoJsonStr = ConvertHttpInfoToJsonStr(chrStats); + std::string tcpInfoJsonStr = ConvertTcpInfoToJsonStr(chrStats); + if (httpInfoJsonStr == "" or tcpInfoJsonStr == "") { + return -1; + } + want.SetParam(UID_KEY, chrStats.uid); + want.SetParam(SOCKFD_KEY, chrStats.sockfd); + want.SetParam(HTTP_INFO_KEY, httpInfoJsonStr); + want.SetParam(TCP_INFO_KEY, tcpInfoJsonStr); + return 0; +} + +std::string NetstackChrReport::ConvertHttpInfoToJsonStr(DataTransChrStats chrStats) +{ + AAFwk::Want want; + want.SetParam(CURL_CODE_KEY, static_cast(chrStats.httpInfo.curlCode)); + want.SetParam(RESPONSE_CODE_KEY, static_cast(chrStats.httpInfo.responseCode)); + want.SetParam(TOTAL_TIME_KEY, static_cast(chrStats.httpInfo.totalTime)); + want.SetParam(NAMELOOKUP_TIME_KEY, static_cast(chrStats.httpInfo.nameLookUpTime)); + want.SetParam(CONNECT_TIME_KEY, static_cast(chrStats.httpInfo.connectTime)); + want.SetParam(APPCONNECT_TIME_KEY, static_cast(chrStats.httpInfo.appconnectTime)); + want.SetParam(PRETRANSFER_TIME_KEY, static_cast(chrStats.httpInfo.preTransferTime)); + want.SetParam(STARTTRANSFER_TIME_KEY, static_cast(chrStats.httpInfo.startTransferTime)); + want.SetParam(QUEUE_TIME_KEY, static_cast(chrStats.httpInfo.queueTime)); + want.SetParam(RETRY_AFTER_KEY, static_cast(chrStats.httpInfo.retryAfter)); + want.SetParam(SIZE_UPLOAD_KEY, static_cast(chrStats.httpInfo.sizeUpload)); + want.SetParam(SIZE_DOWNLOAD_KEY, static_cast(chrStats.httpInfo.sizeDownload)); + want.SetParam(SPEED_DOWNLOAD_KEY, static_cast(chrStats.httpInfo.speedDownload)); + want.SetParam(SPEED_UPLOAD_KEY, static_cast(chrStats.httpInfo.speedUpload)); + want.SetParam(EFFECTIVE_METHOD_KEY, std::string(chrStats.httpInfo.effectiveMethod)); + want.SetParam(CONTENT_TYPE_KEY, std::string(chrStats.httpInfo.contentType)); + want.SetParam(REDIRECT_TIME_KEY, static_cast(chrStats.httpInfo.redirectTime)); + want.SetParam(REDIRECT_COUNT_KEY, static_cast(chrStats.httpInfo.redirectCount)); + want.SetParam(PROXY_ERROR_KEY, static_cast(chrStats.httpInfo.proxyError)); + want.SetParam(OS_ERRNO_KEY, static_cast(chrStats.httpInfo.osError)); + want.SetParam(SSL_VERIFYRESULT_KEY, static_cast(chrStats.httpInfo.sslVerifyResult)); + std::string paramStr = want.ToString(); + return paramStr; +} + +std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStats) +{ + AAFwk::Want want; + want.SetParam(TCPI_RETRANSMITS_KEY, static_cast(chrStats.tcpInfo.tcpi_retransmits)); + want.SetParam(TCPI_UNACKED_KEY, static_cast(chrStats.tcpInfo.tcpi_unacked)); + want.SetParam(TCPI_LAST_DATA_SENT_KEY, static_cast(chrStats.tcpInfo.lastDataSent)); + want.SetParam(TCPI_LAST_ACK_SENT_KEY, static_cast(chrStats.tcpInfo.lastAckSent)); + want.SetParam(TCPI_LAST_DATA_RECV_KEY, static_cast(chrStats.tcpInfo.lastDataRecv)); + want.SetParam(TCPI_LAST_ACK_RECV_KEY, static_cast(chrStats.tcpInfo.lastAckRecv)); + want.SetParam(TCPI_RTT_KEY, static_cast(chrStats.tcpInfo.rtt)); + want.SetParam(TCPI_RTTVAR_KEY, static_cast(chrStats.tcpInfo.rttvar)); + want.SetParam(TCPI_TOTAL_RETRANS_KEY, static_cast(chrStats.tcpInfo.totalRetrans)); + want.SetParam(SRC_IP_KEY, std::string(chrStats.tcpInfo.srcIp)); + want.SetParam(DST_IP_KEY, std::string(chrStats.tcpInfo.dstIp)); + want.SetParam(SRC_PORT_KEY, static_cast(chrStats.tcpInfo.srcPort)); + want.SetParam(DST_PORT_KEY, static_cast(chrStats.tcpInfo.dstPort)); + std::string paramStr = want.ToString(); + return paramStr; +} +} \ No newline at end of file -- Gitee From d41e7a2364cf7e3aae583f4ce3b7db422a775b29 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Tue, 6 May 2025 21:48:21 +0800 Subject: [PATCH 073/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 043b75c3e..a11ecc15c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -15,7 +15,7 @@ #include #include #include "i_netstack_chr_client.h" -#include "netstack_chr_client.h" +#include "netstack_chr_report.h" #include "netstack_log.h" #include "common_event_manager.h" #include "want.h" -- Gitee From 7b01def94e719669efcd7a58e17ca7273f843e4e Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 08:57:34 +0800 Subject: [PATCH 074/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/include/netstack_chr_report.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index 6e8990455..7777e7d1e 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -24,6 +24,8 @@ namespace OHOS::NatStack::ChrClient { +using namespace OHOS::NatStack::ChrClient; + class NetstackChrReport { public: NetstackChrReport(); -- Gitee From 59fbe1a4ce8e605820232c3a0895f49de9ae7571 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 09:01:33 +0800 Subject: [PATCH 075/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index a11ecc15c..ef0c33345 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -20,7 +20,7 @@ #include "common_event_manager.h" #include "want.h" -namespace OHOS::NetStack::ChrClient { +using namespace OHOS::NetStack::ChrClient; constexpr char REPORT_HTTP_EVENT_NAME[] = "custom.event.CHR_REPORT_HTTP"; constexpr int REPORT_TIME_LIMIT_MINUTE = 5; @@ -119,4 +119,3 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat std::string paramStr = want.ToString(); return paramStr; } -} \ No newline at end of file -- Gitee From 6f87c643086b74557df3f0f6a3b368ffebf97047 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 09:42:23 +0800 Subject: [PATCH 076/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/include/netstack_chr_report.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index 7777e7d1e..401d5f6c3 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -22,9 +22,9 @@ #include "i_netstack_chr_client.h" #include "want.h" -namespace OHOS::NatStack::ChrClient { +namespace OHOS::NetStack::ChrClient { -using namespace OHOS::NatStack::ChrClient; +using namespace OHOS::NetStack::ChrClient; class NetstackChrReport { public: @@ -40,6 +40,5 @@ private: std::string ConvertHttpInfoToJsonStr(DataTransChrStats chrStats); std::string ConvertTcpInfoToJsonStr(DataTransChrStats chrStats); }; - } // namespace OHOS::NatStack::ChrClient #endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file -- Gitee From 106b40c84c0051cc1284b226ddb30a533a4a1c7e Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 10:11:21 +0800 Subject: [PATCH 077/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index ef0c33345..9505569ee 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -103,8 +103,8 @@ std::string NetstackChrReport::ConvertHttpInfoToJsonStr(DataTransChrStats chrSta std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStats) { AAFwk::Want want; - want.SetParam(TCPI_RETRANSMITS_KEY, static_cast(chrStats.tcpInfo.tcpi_retransmits)); - want.SetParam(TCPI_UNACKED_KEY, static_cast(chrStats.tcpInfo.tcpi_unacked)); + want.SetParam(TCPI_RETRANSMITS_KEY, static_cast(chrStats.tcpInfo.retransmits)); + want.SetParam(TCPI_UNACKED_KEY, static_cast(chrStats.tcpInfo.unacked)); want.SetParam(TCPI_LAST_DATA_SENT_KEY, static_cast(chrStats.tcpInfo.lastDataSent)); want.SetParam(TCPI_LAST_ACK_SENT_KEY, static_cast(chrStats.tcpInfo.lastAckSent)); want.SetParam(TCPI_LAST_DATA_RECV_KEY, static_cast(chrStats.tcpInfo.lastDataRecv)); -- Gitee From f50e3dd8e678f298ea05d4ee631273f05dd32c4e Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 15:35:12 +0800 Subject: [PATCH 078/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- .../http_over_curl/src/epoll_multi_driver.cpp | 5 +- .../include/i_netstack_chr_client.h | 5 +- .../include/netstack_chr_client.h | 8 ++- .../include/netstack_chr_report.h | 2 + .../src/netstack_chr_client.cpp | 51 +++++++++---------- .../src/netstack_chr_report.cpp | 37 ++++++++++++-- 6 files changed, 69 insertions(+), 39 deletions(-) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index 3a768c38c..f63790e91 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -142,12 +142,15 @@ __attribute__((no_sanitize("cfi"))) void EpollMultiDriver::CheckMultiInfo() switch (message->msg) { case CURLMSG_DONE: { auto easyHandle = message->easy_handle; - curl_multi_remove_handle(multi_, easyHandle); auto requestInfo = ongoingRequests_[easyHandle]; ongoingRequests_.erase(easyHandle); if (requestInfo != nullptr && requestInfo->doneCallback) { requestInfo->doneCallback(message, requestInfo->opaqueData); } + if (message->easy_handle) { + (void)curl_multi_remove_handle(multi_, easyHandle); + } + curl_multi_remove_handle(multi_, easyHandle); delete requestInfo; break; } diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 03ce178ea..165a72ff5 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -18,7 +18,6 @@ #include #include - #include "curl/curl.h" namespace OHOS::NetStack::ChrClient { @@ -43,6 +42,7 @@ typedef struct DataTransTcpInfo { } DataTransTcpInfo; typedef struct DataTransHttpInfo { + int uid; long curlCode; int responseCode; @@ -71,8 +71,7 @@ typedef struct DataTransHttpInfo { } DataTransHttpInfo; typedef struct DataTransChrStats { - int uid; - int sockfd; + std::string processName; DataTransHttpInfo httpInfo; DataTransTcpInfo tcpInfo; } DataTransChrStats; diff --git a/utils/netstack_chr_client/include/netstack_chr_client.h b/utils/netstack_chr_client/include/netstack_chr_client.h index ea908ef7f..d6b17f4f6 100644 --- a/utils/netstack_chr_client/include/netstack_chr_client.h +++ b/utils/netstack_chr_client/include/netstack_chr_client.h @@ -17,9 +17,7 @@ #define COMMUNICATIONNETSTACK_NETSTACK_CHR_CLIENT_H #include -#include #include - #include "curl/curl.h" #include "netstack_chr_report.h" #include "i_netstack_chr_client.h" @@ -35,15 +33,15 @@ private: NetStackChrClient() = default; ~NetStackChrClient() = default; - static bool GetAddrFromSock( + static int GetAddrFromSock( int sockfd, std::string &srcIp, std::string &dstIp, uint16_t &srcPort, uint16_t &dstPort); - static bool GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo); + static int GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo); static void GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &httpInfo); template static DataType GetNumericAttributeFromCurl(CURL *handle, CURLINFO info); static std::string GetStringAttributeFromCurl(CURL *handle, CURLINFO info); - static bool shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); + static int shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); NetstackChrReport netstackChrReport; }; diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index 401d5f6c3..d08965f33 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -35,10 +35,12 @@ public: private: std::chrono::system_clock::time_point lastReceivedTime_; std::mutex agentMutex_; + int ignoreReportTimes_ = 0; int ConvertWantParam(AAFwk::Want& want, DataTransChrStats chrStats); std::string ConvertHttpInfoToJsonStr(DataTransChrStats chrStats); std::string ConvertTcpInfoToJsonStr(DataTransChrStats chrStats); + void InforLog(DataTransChrStats chrStats); }; } // namespace OHOS::NatStack::ChrClient #endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index 25f75b1f7..3bb6becef 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -12,13 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include #include - #include #include #include - #include "netstack_chr_client.h" #include "netstack_common_utils.h" #include "netstack_log.h" @@ -36,7 +33,7 @@ NetStackChrClient &NetStackChrClient::GetInstance() return instance; } -bool NetStackChrClient::GetAddrFromSock( +int NetStackChrClient::GetAddrFromSock( int sockfd, std::string &srcIp, std::string &dstIp, uint16_t &srcPort, uint16_t &dstPort) { sockaddr_storage localss{}; @@ -46,13 +43,13 @@ bool NetStackChrClient::GetAddrFromSock( // Get local addr addrLen = sizeof(localss); if (getsockname(sockfd, reinterpret_cast(&localss), &addrLen) < 0) { - return false; + return -1; } // Get peer addr addrLen = sizeof(peerss); if (getsockname(sockfd, reinterpret_cast(&peerss), &addrLen) < 0) { - return false; + return -1; } char buf[INET6_ADDRSTRLEN]; @@ -61,13 +58,13 @@ bool NetStackChrClient::GetAddrFromSock( auto *p4 = reinterpret_cast(&peerss); if (inet_ntop(AF_INET, &l4->sin_addr, buf, sizeof(buf)) == nullptr) { - return false; + return -1; } srcIp = buf; srcPort = ntohs(l4->sin_port); if (inet_ntop(AF_INET, &p4->sin_addr, buf, sizeof(buf)) == nullptr) { - return false; + return -1; } dstIp = buf; @@ -77,32 +74,32 @@ bool NetStackChrClient::GetAddrFromSock( auto *p6 = reinterpret_cast(&peerss); if (inet_ntop(AF_INET6, &l6->sin6_addr, buf, sizeof(buf)) == nullptr) { - return false; + return -1; } srcIp = buf; srcPort = ntohs(l6->sin6_port); if (inet_ntop(AF_INET6, &p6->sin6_addr, buf, sizeof(buf)) == nullptr) { - return false; + return -1; } dstIp = buf; dstPort = ntohs(p6->sin6_port); } else { - return false; + return -1; } - return true; + return 0; } -bool NetStackChrClient::GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo) +int NetStackChrClient::GetTcpInfoFromSock(const curl_socket_t sockfd, DataTransTcpInfo &httpTcpInfo) { if (sockfd <= 0) { - return false; + return -1; } struct tcp_info tcpInfo = {}; socklen_t infoLen = sizeof(tcpInfo); if (getsockopt(sockfd, IPPROTO_TCP, TCP_INFO, &tcpInfo, &infoLen) < 0) { - return false; + return -1; } httpTcpInfo.unacked = tcpInfo.tcpi_unacked; @@ -115,12 +112,12 @@ bool NetStackChrClient::GetTcpInfoFromSock(const curl_socket_t sockfd, DataTrans httpTcpInfo.totalRetrans = tcpInfo.tcpi_total_retrans; httpTcpInfo.retransmits = tcpInfo.tcpi_retransmits; - if (GetAddrFromSock(sockfd, httpTcpInfo.srcIp, httpTcpInfo.dstIp, httpTcpInfo.srcPort, httpTcpInfo.dstPort)) { + if (GetAddrFromSock(sockfd, httpTcpInfo.srcIp, httpTcpInfo.dstIp, httpTcpInfo.srcPort, httpTcpInfo.dstPort) == 0) { httpTcpInfo.srcIp = CommonUtils::AnonymizeIp(httpTcpInfo.srcIp); httpTcpInfo.dstIp = CommonUtils::AnonymizeIp(httpTcpInfo.dstIp); } - return true; + return 0; } template @@ -171,17 +168,17 @@ void NetStackChrClient::GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &htt httpInfo.contentType = GetStringAttributeFromCurl(handle, CURLINFO_CONTENT_TYPE); } -bool NetStackChrClient::shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo) +int NetStackChrClient::shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo) { if (httpInfo.curlCode != 0 || httpInfo.responseCode != HTTP_REQUEST_SUCCESS) { - return true; + return 0; } if ((httpInfo.sizeDownload + httpInfo.sizeDownload <= HTTP_FILE_TRANSFER_SIZE_THRESHOLD) && httpInfo.totalTime > HTTP_FILE_TRANSFER_TIME_THRESHOLD) { - return true; + return 0; } - return false; + return -1; } void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curlCode) @@ -191,25 +188,27 @@ void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t } DataTransChrStats dataTransChrStats{}; - dataTransChrStats.uid = static_cast(getuid()); + dataTransChrStats.httpInfo.uid = static_cast(getuid()); dataTransChrStats.httpInfo.curlCode = curlCode; + if (CommonUtils::GetBundleName().has_value()) { + dataTransChrStats.processName = CommonUtils::GetBundleName().value(); + } GetHttpInfoFromCurl(handle, dataTransChrStats.httpInfo); - if (!shouldReportHttpAbnormalEvent(dataTransChrStats.httpInfo)) { + if (shouldReportHttpAbnormalEvent(dataTransChrStats.httpInfo) != 0) { return; } curl_off_t sockfd = 0; curl_easy_getinfo(handle, CURLINFO_ACTIVESOCKET, &sockfd); - dataTransChrStats.sockfd = sockfd; - if (!GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo)) { + if (GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo) != 0) { NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", dataTransChrStats.sockfd); } int ret = netstackChrReport.ReportCommonEvent(dataTransChrStats); if (ret > 0) { - NETSTACK_LOGE("Send to CHR failed."); + NETSTACK_LOGE("Send to CHR failed, error code %{public}d", ret); } } diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 9505569ee..1e1ac6709 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ #include +#include #include #include "i_netstack_chr_client.h" #include "netstack_chr_report.h" @@ -37,12 +38,12 @@ int NetstackChrReport::ReportCommonEvent(DataTransChrStats chrStats) auto currentTime = std::chrono::system_clock::now(); auto timeDifference = std::chrono::duration_cast(currentTime - lastReceivedTime_); if (timeDifference.count() < REPORT_TIME_LIMIT_MINUTE) { - NETSTACK_LOGE("From last report %{public}ld minutes, ignore this report.", timeDifference.count()); + ignoreReportTimes_ += 1; return REPORT_CHR_RESULT_TIME_LIMIT_ERROR; } AAFwk::Want want; want.SetAction(REPORT_HTTP_EVENT_NAME); - if (!ConvertWantParam(want, chrStats)) { + if (ConvertWantParam(want, chrStats) != 0) { return REPORT_CHR_RESULT_SET_DATA_FAIL; } @@ -50,11 +51,14 @@ int NetstackChrReport::ReportCommonEvent(DataTransChrStats chrStats) common_event_data.SetWant(want); EventFwk::CommonEventPublishInfo publish_info; if (!EventFwk::CommonEventManager::PublishCommonEvent(common_event_data, publish_info)) { - NETSTACK_LOGE("Report to CHR failed."); + NETSTACK_LOGE("Subscriber is nullptr, report to CHR failed."); return REPORT_CHR_RESULT_REPORT_FAIL; } + NETSTACK_LOGI("Report to CHR success, %{public}d reports are ignore before this.", ignoreReportTimes_); + InforLog(chrStats); lastReceivedTime_ = currentTime; - NETSTACK_LOGI("Report to CHR success."); + ignoreReportTimes_ = 0; + return REPORT_CHR_RESULT_SUCCESS; } @@ -119,3 +123,28 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat std::string paramStr = want.ToString(); return paramStr; } + +void InforLog(DataTransChrStats chrStats) +{ + std::stringstream logString; + logString << "[Netstack CHR Service] process_name:" << dataTransChrStats.processName << " " + << "HTTP Info:" << chrStats.httpInfo.uid << "," << chrStats.httpInfo.responseCode << "," + << chrStats.httpInfo.totalTime << "," << chrStats.httpInfo.nameLookUpTime << "," + << chrStats.httpInfo.preTransferTime << "," << chrStats.httpInfo.sizeUpload << "," + << chrStats.httpInfo.sizeDownload << "," << chrStats.httpInfo.speedDownload << "," + << chrStats.httpInfo.speedUpload << "," << chrStats.httpInfo.effectiveMethod << "," + << chrStats.httpInfo.startTransferTime << "," << chrStats.httpInfo.contentType << "," + << chrStats.httpInfo.redirectTime << "," << chrStats.httpInfo.redirectCount << "," + << chrStats.httpInfo.osError << "," << chrStats.httpInfo.sslVerifyResult << "," + << chrStats.httpInfo.appconnectTime << "," << chrStats.httpInfo.retryAfter << "," + << chrStats.httpInfo.proxyError << "," << chrStats.httpInfo.queueTime << "," + << chrStats.httpInfo.curlCode << " " + << "TCP Info:" << chrStats.tcpInfo.unacked << "," << chrStats.tcpInfo.lastDataSent << "," + << chrStats.tcpInfo.lastAckSent << "," << chrStats.tcpInfo.lastDataRecv << "," + << chrStats.tcpInfo.lastAckRecv << "," << chrStats.tcpInfo.rtt << "," + << chrStats.tcpInfo.rttvar << "," << chrStats.tcpInfo.retransmits << "," + << chrStats.tcpInfo.totalRetrans << "," << chrStats.tcpInfo.srcIp << "," + << chrStats.tcpInfo.dstIp << "," << chrStats.tcpInfo.srcPort << "," + << chrStats.tcpInfo.dstPort << "."; + NETSTACK_LOGI("%{public}s", logString.str().c_str()); +} \ No newline at end of file -- Gitee From cd892922b472929b27cfd46e14b1ee4b20df98ca Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 15:46:14 +0800 Subject: [PATCH 079/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- .../include/i_netstack_chr_client.h | 23 ++++++++++--------- .../src/netstack_chr_report.cpp | 3 +-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 165a72ff5..754efc7f7 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -81,34 +81,34 @@ constexpr int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; constexpr int REPORT_CHR_RESULT_SET_DATA_FAIL = 2; constexpr int REPORT_CHR_RESULT_REPORT_FAIL = 3; -constexpr char UID_KEY[] = "uid"; -constexpr char SOCKFD_KEY[] = "sockfd"; -constexpr char HTTP_INFO_KEY[] = "http_info"; -constexpr char CURL_CODE_KEY[] = "curl_code"; +constexpr char PROCESS_NAME[] = "PROCESS_NAME"; + +constexpr char HTTP_INFO_KEY[] = "DATA_TRANS_HTTP_INFO"; +constexpr char UID_KEY[] = "uid"; constexpr char RESPONSE_CODE_KEY[] = "response_code"; constexpr char TOTAL_TIME_KEY[] = "total_time"; constexpr char NAMELOOKUP_TIME_KEY[] = "namelookup_time"; constexpr char CONNECT_TIME_KEY[] = "connect_time"; -constexpr char APPCONNECT_TIME_KEY[] = "appconnect_time"; constexpr char PRETRANSFER_TIME_KEY[] = "pretransfer_time"; -constexpr char STARTTRANSFER_TIME_KEY[] = "starttransfer_time"; -constexpr char QUEUE_TIME_KEY[] = "queue_time"; -constexpr char RETRY_AFTER_KEY[] = "retry_after"; constexpr char SIZE_UPLOAD_KEY[] = "size_upload"; constexpr char SIZE_DOWNLOAD_KEY[] = "size_download"; constexpr char SPEED_DOWNLOAD_KEY[] = "speed_download"; constexpr char SPEED_UPLOAD_KEY[] = "speed_upload"; constexpr char EFFECTIVE_METHOD_KEY[] = "effective_method"; +constexpr char STARTTRANSFER_TIME_KEY[] = "starttransfer_time"; constexpr char CONTENT_TYPE_KEY[] = "content_type"; constexpr char REDIRECT_TIME_KEY[] = "redirect_time"; constexpr char REDIRECT_COUNT_KEY[] = "redirect_count"; -constexpr char PROXY_ERROR_KEY[] = "proxy_error"; constexpr char OS_ERRNO_KEY[] = "os_errno"; constexpr char SSL_VERIFYRESULT_KEY[] = "ssl_verifyresult"; +constexpr char APPCONNECT_TIME_KEY[] = "appconnect_time"; +constexpr char RETRY_AFTER_KEY[] = "retry_after"; +constexpr char PROXY_ERROR_KEY[] = "proxy_error"; +constexpr char QUEUE_TIME_KEY[] = "queue_time"; +constexpr char CURL_CODE_KEY[] = "curl_code"; -constexpr char TCP_INFO_KEY[] = "tcp_info"; -constexpr char TCPI_RETRANSMITS_KEY[] = "tcpi_retransmits"; +constexpr char TCP_INFO_KEY[] = "DATA_TRANS_TCP_INFO"; constexpr char TCPI_UNACKED_KEY[] = "tcpi_unacked"; constexpr char TCPI_LAST_DATA_SENT_KEY[] = "tcpi_last_data_sent"; constexpr char TCPI_LAST_ACK_SENT_KEY[] = "tcpi_last_ack_sent"; @@ -116,6 +116,7 @@ constexpr char TCPI_LAST_DATA_RECV_KEY[] = "tcpi_last_data_recv"; constexpr char TCPI_LAST_ACK_RECV_KEY[] = "tcpi_last_ack_recv"; constexpr char TCPI_RTT_KEY[] = "tcpi_rtt"; constexpr char TCPI_RTTVAR_KEY[] = "tcpi_rttvar"; +constexpr char TCPI_RETRANSMITS_KEY[] = "tcpi_retransmits"; constexpr char TCPI_TOTAL_RETRANS_KEY[] = "tcpi_total_retrans"; constexpr char SRC_IP_KEY[] = "src_ip"; constexpr char DST_IP_KEY[] = "dst_ip"; diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 1e1ac6709..8ee0c0429 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -69,8 +69,7 @@ int NetstackChrReport::ConvertWantParam(AAFwk::Want& want, DataTransChrStats chr if (httpInfoJsonStr == "" or tcpInfoJsonStr == "") { return -1; } - want.SetParam(UID_KEY, chrStats.uid); - want.SetParam(SOCKFD_KEY, chrStats.sockfd); + want.SetParam(PROCESS_NAME, chrStats.processName); want.SetParam(HTTP_INFO_KEY, httpInfoJsonStr); want.SetParam(TCP_INFO_KEY, tcpInfoJsonStr); return 0; -- Gitee From daf0616457f2b7d5891db15d60804b6acf10a7ba Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 16:29:34 +0800 Subject: [PATCH 080/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- .../include/i_netstack_chr_client.h | 60 ++++++++----------- .../src/netstack_chr_client.cpp | 2 +- .../src/netstack_chr_report.cpp | 50 +++++++++------- 3 files changed, 55 insertions(+), 57 deletions(-) diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 754efc7f7..81542f3a4 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -22,66 +22,58 @@ namespace OHOS::NetStack::ChrClient { -typedef struct DataTransTcpInfo { - uint8_t retransmits; - uint32_t unacked; - - uint32_t lastDataSent; - uint32_t lastAckSent; - uint32_t lastDataRecv; - uint32_t lastAckRecv; - - uint32_t rtt; - uint32_t rttvar; - uint32_t totalRetrans; - - std::string srcIp; - std::string dstIp; - uint16_t srcPort; - uint16_t dstPort; -} DataTransTcpInfo; +typedef struct DataTransChrStats { + std::string processName; + DataTransHttpInfo httpInfo; + DataTransTcpInfo tcpInfo; +} DataTransChrStats; typedef struct DataTransHttpInfo { int uid; - long curlCode; int responseCode; - curl_off_t totalTime; curl_off_t nameLookUpTime; curl_off_t connectTime; - curl_off_t appconnectTime; curl_off_t preTransferTime; - curl_off_t startTransferTime; - curl_off_t queueTime; - curl_off_t retryAfter; - curl_off_t sizeUpload; curl_off_t sizeDownload; curl_off_t speedDownload; curl_off_t speedUpload; std::string effectiveMethod; + curl_off_t startTransferTime; std::string contentType; - curl_off_t redirectTime; long redirectCount; - - int proxyError; long osError; long sslVerifyResult; + curl_off_t appconnectTime; + curl_off_t retryAfter; + int proxyError; + curl_off_t queueTime; + long curlCode; } DataTransHttpInfo; -typedef struct DataTransChrStats { - std::string processName; - DataTransHttpInfo httpInfo; - DataTransTcpInfo tcpInfo; -} DataTransChrStats; +typedef struct DataTransTcpInfo { + uint32_t unacked; + uint32_t lastDataSent; + uint32_t lastAckSent; + uint32_t lastDataRecv; + uint32_t lastAckRecv; + uint32_t rtt; + uint32_t rttvar; + uint8_t retransmits; + uint32_t totalRetrans; + std::string srcIp; + std::string dstIp; + uint16_t srcPort; + uint16_t dstPort; +} DataTransTcpInfo; constexpr int REPORT_CHR_RESULT_SUCCESS = 0; constexpr int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; constexpr int REPORT_CHR_RESULT_SET_DATA_FAIL = 2; constexpr int REPORT_CHR_RESULT_REPORT_FAIL = 3; - constexpr char PROCESS_NAME[] = "PROCESS_NAME"; constexpr char HTTP_INFO_KEY[] = "DATA_TRANS_HTTP_INFO"; diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index 3bb6becef..f5fd98282 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -203,7 +203,7 @@ void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curl_easy_getinfo(handle, CURLINFO_ACTIVESOCKET, &sockfd); if (GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo) != 0) { - NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", dataTransChrStats.sockfd); + NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", sockfd); } int ret = netstackChrReport.ReportCommonEvent(dataTransChrStats); diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 8ee0c0429..17081688c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -13,7 +13,6 @@ * limitations under the License. */ #include -#include #include #include "i_netstack_chr_client.h" #include "netstack_chr_report.h" @@ -125,25 +124,32 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat void InforLog(DataTransChrStats chrStats) { - std::stringstream logString; - logString << "[Netstack CHR Service] process_name:" << dataTransChrStats.processName << " " - << "HTTP Info:" << chrStats.httpInfo.uid << "," << chrStats.httpInfo.responseCode << "," - << chrStats.httpInfo.totalTime << "," << chrStats.httpInfo.nameLookUpTime << "," - << chrStats.httpInfo.preTransferTime << "," << chrStats.httpInfo.sizeUpload << "," - << chrStats.httpInfo.sizeDownload << "," << chrStats.httpInfo.speedDownload << "," - << chrStats.httpInfo.speedUpload << "," << chrStats.httpInfo.effectiveMethod << "," - << chrStats.httpInfo.startTransferTime << "," << chrStats.httpInfo.contentType << "," - << chrStats.httpInfo.redirectTime << "," << chrStats.httpInfo.redirectCount << "," - << chrStats.httpInfo.osError << "," << chrStats.httpInfo.sslVerifyResult << "," - << chrStats.httpInfo.appconnectTime << "," << chrStats.httpInfo.retryAfter << "," - << chrStats.httpInfo.proxyError << "," << chrStats.httpInfo.queueTime << "," - << chrStats.httpInfo.curlCode << " " - << "TCP Info:" << chrStats.tcpInfo.unacked << "," << chrStats.tcpInfo.lastDataSent << "," - << chrStats.tcpInfo.lastAckSent << "," << chrStats.tcpInfo.lastDataRecv << "," - << chrStats.tcpInfo.lastAckRecv << "," << chrStats.tcpInfo.rtt << "," - << chrStats.tcpInfo.rttvar << "," << chrStats.tcpInfo.retransmits << "," - << chrStats.tcpInfo.totalRetrans << "," << chrStats.tcpInfo.srcIp << "," - << chrStats.tcpInfo.dstIp << "," << chrStats.tcpInfo.srcPort << "," - << chrStats.tcpInfo.dstPort << "."; - NETSTACK_LOGI("%{public}s", logString.str().c_str()); + NETSTACK_LOGI("[Netstack CHR Service] Process Name:%{public}s, \ + HTTP Info{%{public}d, %{public}d, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}s, %{public}ld, \ + %{public}s, %{public}ld, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}d, %{public}ld, \ + %{public}ld, \ + TCP Info{%{public}d, %{public}d, %{public}d, \ + %{public}d, %{public}d, %{public}d, \ + %{public}d, %{public}d, %{public}d, \ + %{public}s, %{public}s, %{public}d}, \ + %{public}d,", + dataTransChrStats.processName.c_str(), + chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, + chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, + chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, + chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, + chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, + chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, + chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, + chrStats.httpInfo.curlCode, + chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, + chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, + chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, + chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, + chrStats.tcpInfo.dstPort); } \ No newline at end of file -- Gitee From 617cf84e0b4ef17c89b2528853bb232f998db0a3 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 16:42:24 +0800 Subject: [PATCH 081/126] add netstack chr report module Signed-off-by: ywm_up@qq.com --- .../include/i_netstack_chr_client.h | 12 +++++----- .../src/netstack_chr_report.cpp | 24 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 81542f3a4..6b04bd7e7 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -22,12 +22,6 @@ namespace OHOS::NetStack::ChrClient { -typedef struct DataTransChrStats { - std::string processName; - DataTransHttpInfo httpInfo; - DataTransTcpInfo tcpInfo; -} DataTransChrStats; - typedef struct DataTransHttpInfo { int uid; int responseCode; @@ -69,6 +63,12 @@ typedef struct DataTransTcpInfo { uint16_t dstPort; } DataTransTcpInfo; +typedef struct DataTransChrStats { + std::string processName; + DataTransHttpInfo httpInfo; + DataTransTcpInfo tcpInfo; +} DataTransChrStats; + constexpr int REPORT_CHR_RESULT_SUCCESS = 0; constexpr int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; constexpr int REPORT_CHR_RESULT_SET_DATA_FAIL = 2; diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 17081688c..a0043b2d4 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -139,17 +139,17 @@ void InforLog(DataTransChrStats chrStats) %{public}s, %{public}s, %{public}d}, \ %{public}d,", dataTransChrStats.processName.c_str(), - chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, - chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, - chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, - chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, - chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, - chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, - chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, - chrStats.httpInfo.curlCode, - chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, - chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, - chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, - chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, + chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, + chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, + chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, + chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, + chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, + chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, + chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, + chrStats.httpInfo.curlCode, + chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, + chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, + chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, + chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, chrStats.tcpInfo.dstPort); } \ No newline at end of file -- Gitee From 6bea112d9d6f95343de870fc4e107e86b5150db4 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 17:24:26 +0800 Subject: [PATCH 082/126] fix log format Signed-off-by: ywm_up@qq.com --- .../src/netstack_chr_client.cpp | 2 +- .../src/netstack_chr_report.cpp | 54 +++++++++---------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index f5fd98282..12cfc6ea2 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -203,7 +203,7 @@ void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curl_easy_getinfo(handle, CURLINFO_ACTIVESOCKET, &sockfd); if (GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo) != 0) { - NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}d", sockfd); + NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}lld", sockfd); } int ret = netstackChrReport.ReportCommonEvent(dataTransChrStats); diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index a0043b2d4..be481f81c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -125,31 +125,31 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat void InforLog(DataTransChrStats chrStats) { NETSTACK_LOGI("[Netstack CHR Service] Process Name:%{public}s, \ - HTTP Info{%{public}d, %{public}d, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}s, %{public}ld, \ - %{public}s, %{public}ld, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}d, %{public}ld, \ - %{public}ld, \ - TCP Info{%{public}d, %{public}d, %{public}d, \ - %{public}d, %{public}d, %{public}d, \ - %{public}d, %{public}d, %{public}d, \ - %{public}s, %{public}s, %{public}d}, \ - %{public}d,", - dataTransChrStats.processName.c_str(), - chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, - chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, - chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, - chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, - chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, - chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, - chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, - chrStats.httpInfo.curlCode, - chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, - chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, - chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, - chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, - chrStats.tcpInfo.dstPort); + HTTP Info{%{public}d, %{public}d, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}s, %{public}ld, \ + %{public}s, %{public}ld, %{public}ld, \ + %{public}ld, %{public}ld, %{public}ld, \ + %{public}ld, %{public}d, %{public}ld, \ + %{public}ld, \ + TCP Info{%{public}d, %{public}d, %{public}d, \ + %{public}d, %{public}d, %{public}d, \ + %{public}d, %{public}d, %{public}d, \ + %{public}s, %{public}s, %{public}d}, \ + %{public}d,", + chrStats.processName.c_str(), + chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, + chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, + chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, + chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, + chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, + chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, + chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, + chrStats.httpInfo.curlCode, + chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, + chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, + chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, + chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, + chrStats.tcpInfo.dstPort); } \ No newline at end of file -- Gitee From 0147a53bc98b3226f12c03870c8e5b3c832ccef2 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 17:39:13 +0800 Subject: [PATCH 083/126] curl_off_t is longlong type Signed-off-by: ywm_up@qq.com --- .../src/netstack_chr_report.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index be481f81c..50999d346 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -125,14 +125,14 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat void InforLog(DataTransChrStats chrStats) { NETSTACK_LOGI("[Netstack CHR Service] Process Name:%{public}s, \ - HTTP Info{%{public}d, %{public}d, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}s, %{public}ld, \ - %{public}s, %{public}ld, %{public}ld, \ - %{public}ld, %{public}ld, %{public}ld, \ - %{public}ld, %{public}d, %{public}ld, \ - %{public}ld, \ + HTTP Info{%{public}d, %{public}d, %{public}lld, \ + %{public}lld, %{public}lld, %{public}lld, \ + %{public}lld, %{public}lld, %{public}lld, \ + %{public}lld, %{public}s, %{public}lld, \ + %{public}s, %{public}lld, %{public}lld, \ + %{public}lld, %{public}lld, %{public}lld, \ + %{public}lld, %{public}d, %{public}lld, \ + %{public}lld, \ TCP Info{%{public}d, %{public}d, %{public}d, \ %{public}d, %{public}d, %{public}d, \ %{public}d, %{public}d, %{public}d, \ -- Gitee From 05294d1a8022fb0fe2caa56e5d068f8820d9f181 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 17:40:38 +0800 Subject: [PATCH 084/126] curl_off_t is longlong type Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 50999d346..1c01ee3f0 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -137,7 +137,7 @@ void InforLog(DataTransChrStats chrStats) %{public}d, %{public}d, %{public}d, \ %{public}d, %{public}d, %{public}d, \ %{public}s, %{public}s, %{public}d}, \ - %{public}d,", + %{public}d", chrStats.processName.c_str(), chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, -- Gitee From 12a00f2f2dcc2e633886deb6fdb02957d769da21 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 20:32:49 +0800 Subject: [PATCH 085/126] modify long type param Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 1c01ee3f0..34b4c580c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -129,10 +129,10 @@ void InforLog(DataTransChrStats chrStats) %{public}lld, %{public}lld, %{public}lld, \ %{public}lld, %{public}lld, %{public}lld, \ %{public}lld, %{public}s, %{public}lld, \ - %{public}s, %{public}lld, %{public}lld, \ - %{public}lld, %{public}lld, %{public}lld, \ + %{public}s, %{public}lld, %{public}ld, \ + %{public}ld, %{public}ld, %{public}lld, \ %{public}lld, %{public}d, %{public}lld, \ - %{public}lld, \ + %{public}ld, \ TCP Info{%{public}d, %{public}d, %{public}d, \ %{public}d, %{public}d, %{public}d, \ %{public}d, %{public}d, %{public}d, \ -- Gitee From 7d10e878b3ce0d3d772745ac1d227a4b23cc2e36 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 20:55:02 +0800 Subject: [PATCH 086/126] define InforLog function Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 34b4c580c..b968c6fcd 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -122,7 +122,7 @@ std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStat return paramStr; } -void InforLog(DataTransChrStats chrStats) +void NetstackChrReport::InforLog(DataTransChrStats chrStats) { NETSTACK_LOGI("[Netstack CHR Service] Process Name:%{public}s, \ HTTP Info{%{public}d, %{public}d, %{public}lld, \ -- Gitee From 263cef67f6311324c0697becd63cb332963ee571 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 21:47:02 +0800 Subject: [PATCH 087/126] modify subsystem name with communication_netstack Signed-off-by: ywm_up@qq.com --- bundle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle.json b/bundle.json index e5147f5a6..61aea2598 100644 --- a/bundle.json +++ b/bundle.json @@ -18,7 +18,7 @@ }, "component": { "name": "netstack", - "subsystem": "communication", + "subsystem": "communication_netstack", "syscap": [ "SystemCapability.Communication.NetStack" ], -- Gitee From 312e2328aa9c17a1fb4298a9e6d7921ae4147549 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Wed, 7 May 2025 21:55:39 +0800 Subject: [PATCH 088/126] modify subsystem name with communication Signed-off-by: ywm_up@qq.com --- bundle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle.json b/bundle.json index 61aea2598..e5147f5a6 100644 --- a/bundle.json +++ b/bundle.json @@ -18,7 +18,7 @@ }, "component": { "name": "netstack", - "subsystem": "communication_netstack", + "subsystem": "communication", "syscap": [ "SystemCapability.Communication.NetStack" ], -- Gitee From 07bf1415724f034277ce8f763c7f381d83851360 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Thu, 8 May 2025 11:02:41 +0800 Subject: [PATCH 089/126] remove duplicate code Signed-off-by: ywm_up@qq.com --- utils/http_over_curl/src/epoll_multi_driver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index f63790e91..91bbc80ae 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -150,7 +150,6 @@ __attribute__((no_sanitize("cfi"))) void EpollMultiDriver::CheckMultiInfo() if (message->easy_handle) { (void)curl_multi_remove_handle(multi_, easyHandle); } - curl_multi_remove_handle(multi_, easyHandle); delete requestInfo; break; } -- Gitee From dfdc1f51ffe64adcf74a08b70b40d95b6018cb07 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Fri, 9 May 2025 09:21:01 +0800 Subject: [PATCH 090/126] remove bundle.json common event deps Signed-off-by: ywm_up@qq.com --- bundle.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bundle.json b/bundle.json index e5147f5a6..b36133680 100644 --- a/bundle.json +++ b/bundle.json @@ -56,8 +56,7 @@ "libwebsockets", "node", "jsoncpp", - "netmanager_enhanced", - "common_event_service" + "netmanager_enhanced" ] }, "build": { -- Gitee From 17be7c3d56d59c31943fa1e9b170595ed9107ea6 Mon Sep 17 00:00:00 2001 From: fanqibing Date: Tue, 29 Apr 2025 09:34:01 +0800 Subject: [PATCH 091/126] add port for Host param in websocket request head Signed-off-by: fanqibing --- .../js/napi/websocket/websocket_exec/src/websocket_exec.cpp | 4 ++-- frameworks/native/websocket_client/websocket_client.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index d3e683824..0ac6c1c99 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -661,7 +661,7 @@ bool WebSocketExec::CreatConnectInfo(ConnectContext *context, lws_context *lwsCo } std::string tempHost = std::string(address) + NAME_END + std::to_string(port); std::string tempOrigin = std::string(protocol) + NAME_END + PROTOCOL_DELIMITER + tempHost; - NETSTACK_LOGD("tempOrigin = %{private}s", tempOrigin.c_str()); + NETSTACK_LOGD("tempHost: %{private}s, Origin = %{private}s", tempHost.c_str(), tempOrigin.c_str()); if (strcpy_s(customizedProtocol, context->GetProtocol().length() + 1, context->GetProtocol().c_str()) != EOK) { NETSTACK_LOGE("memory copy failed"); } @@ -670,7 +670,7 @@ bool WebSocketExec::CreatConnectInfo(ConnectContext *context, lws_context *lwsCo connectInfo.port = port; connectInfo.address = address; connectInfo.path = path; - connectInfo.host = address; + connectInfo.host = tempHost.c_str(); connectInfo.origin = address; connectInfo.protocol = customizedProtocol; diff --git a/frameworks/native/websocket_client/websocket_client.cpp b/frameworks/native/websocket_client/websocket_client.cpp index 57de3870c..2e00c44c1 100644 --- a/frameworks/native/websocket_client/websocket_client.cpp +++ b/frameworks/native/websocket_client/websocket_client.cpp @@ -373,12 +373,12 @@ int CreatConnectInfo(const std::string url, lws_context *lwsContext, WebSocketCl return WebSocketErrorCode::WEBSOCKET_CONNECTION_PARSEURL_ERROR; } std::string path = PATH_START + std::string(pathWithoutStart); - + std::string tempHost = std::string(address) + NAME_END + std::to_string(port); connectInfo.context = lwsContext; connectInfo.address = address; connectInfo.port = port; connectInfo.path = path.c_str(); - connectInfo.host = address; + connectInfo.host = tempHost.c_str(); connectInfo.origin = address; connectInfo.local_protocol_name = "lws-minimal-client1"; -- Gitee From a10ffa1c5f29dc6205a9f33e3f0f4608fba5f327 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Sun, 11 May 2025 16:01:50 +0800 Subject: [PATCH 092/126] add UT code Signed-off-by: ywm_up@qq.com --- .../http/http_client/http_client_task.cpp | 2 - .../utils/netstack_chr_client/BUILD.gn | 65 +++++++ .../NetStackChrClientTest.cpp | 159 ++++++++++++++++++ .../include/i_netstack_chr_client.h | 47 ------ .../include/netstack_chr_client.h | 2 +- .../include/netstack_chr_report.h | 14 +- .../src/netstack_chr_client.cpp | 44 ++--- .../src/netstack_chr_report.cpp | 159 +++++++----------- 8 files changed, 308 insertions(+), 184 deletions(-) create mode 100644 test/unittest/utils/netstack_chr_client/BUILD.gn create mode 100644 test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp diff --git a/frameworks/native/http/http_client/http_client_task.cpp b/frameworks/native/http/http_client/http_client_task.cpp index abdfd31e6..ba3218f81 100644 --- a/frameworks/native/http/http_client/http_client_task.cpp +++ b/frameworks/native/http/http_client/http_client_task.cpp @@ -734,9 +734,7 @@ void HttpClientTask::ProcessResponse(CURLMsg *msg) response_.SetResponseTime(HttpTime::GetNowTimeGMT()); DumpHttpPerformance(); -#if HAS_NETMANAGER_BASE ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(curlHandle_, code); -#endif if (CURLE_ABORTED_BY_CALLBACK == code) { (void)ProcessResponseCode(); diff --git a/test/unittest/utils/netstack_chr_client/BUILD.gn b/test/unittest/utils/netstack_chr_client/BUILD.gn new file mode 100644 index 000000000..ca544cca0 --- /dev/null +++ b/test/unittest/utils/netstack_chr_client/BUILD.gn @@ -0,0 +1,65 @@ +# Copyright (c) 2025 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") +import("//build/test.gni") +import("//foundation/communication/netstack/netstack_config.gni") + +NETSTACK_UTILS_ROOT = "$SUBSYSTEM_DIR/netstack/utils" + +utils_include = [ "$NETSTACK_UTILS_ROOT/log/include" ] + +common_external_deps = [ + "c_utils:utils", + "hilog:libhilog", +] + +ohos_unittest("netstack_common_utils_test") { + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + + branch_protector_ret = "pac_ret" + + module_out_path = "netstack/netstack_chr_client_test" + + include_dirs = [ + "$NETSTACK_UTILS_ROOT/netstack_chr_client/include", + "$NETSTACK_UTILS_ROOT/common_utils/include", + ] + include_dirs += utils_include + + external_deps = common_external_deps + external_deps += [ + "curl:curl_shared", + "ability_runtime:wantagent_innerkits", + ] + + sources = [ + "$NETSTACK_UTILS_ROOT/common_utils/src/netstack_bundle_utils.cpp", + "$NETSTACK_UTILS_ROOT/common_utils/src/netstack_common_utils.cpp", + "$NETSTACK_UTILS_ROOT/netstack_chr_client/src/netstack_chr_client.cpp", + "$NETSTACK_UTILS_ROOT/netstack_chr_client/src/netstack_chr_report.cpp", + "NetStackChrClientTest.cpp", + ] + + part_name = "netstack" + subsystem_name = "communication" +} + +group("unittest") { + testonly = true + deps = [ ":netstack_chr_client_test" ] +} diff --git a/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp b/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp new file mode 100644 index 000000000..df746acec --- /dev/null +++ b/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define private public + +#include +#include + +#include "curl/curl.h" +#include "netstack_chr_client.h" +#include "netstack_chr_report.h" +#include "want.h" + +namespace OHOS::NetStack { +namespace { +using namespace testing::ext; +// static constexpr const char *REQUEST_ID = "123"; +// static constexpr const char *HTTP_VERSION_2 = "2"; +static constexpr const char *REQUEST_URL = "https://127.0.0.1"; +// static constexpr const char *REQUEST_ID_ADDRESS = "127.0.0.1"; +// static constexpr const char *REQUEST_STRING = "unused"; +// static constexpr const char *REQUEST_HEADERS = "HTTP/1.1 200 OK\r\nk:v"; +// static constexpr const char *REQUEST_REASON_PARSE = "OK"; +// static constexpr const uint64_t REQUEST_BEGIN_TIME = 100; +// static constexpr const double REQUEST_DNS_TIME = 10; + +CURL *GetCurlHandle() +{ + CURL *handle = curl_easy_init(); + curl_easy_setopt(handle, CURLOPT_URL, REQUEST_URL); + curl_easy_setopt(handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); + return handle; +} +} + +class NetStackChrClientTest : public testing::Test { +public: + static void SetUpTestCase() {} + + static void TearDownTestCase() {} + + virtual void SetUp() {} + + virtual void TearDown() {} +}; + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest001, TestSize.Level2) +{ + CURL *handle = GetCurlHandle(); + ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(NULL, 0); + ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(handle, 0); + ChrClient::DataTransChrStats dataTransChrStats{}; + ChrClient::NetStackChrClient::GetInstance().GetHttpInfoFromCurl(handle, dataTransChrStats.httpInfo); + EXPECT_EQ(dataTransChrStats.httpInfo.responseCode, 0); +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest002, TestSize.Level2) +{ + ChrClient::DataTransTcpInfo tcpInfo; + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd >0) { + ChrClient::NetStackChrClient::GetInstance().GetTcpInfoFromSock(sockfd, tcpInfo); + EXPECT_EQ(tcpInfo.unacked, 0); + EXPECT_EQ(tcpInfo.srcPort, 0); + EXPECT_EQ(tcpInfo.dstPort, 0); + close(sockfd); + } + sockfd = socket(AF_INET6, SOCK_STREAM, 0); + if (sockfd > 0) { + ChrClient::NetStackChrClient::GetInstance().GetTcpInfoFromSock(sockfd, tcpInfo); + EXPECT_EQ(tcpInfo.unacked, 0); + EXPECT_EQ(tcpInfo.srcPort, 0); + EXPECT_EQ(tcpInfo.dstPort, 0); + close(sockfd); + } +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest003, TestSize.Level2) +{ + ChrClient::DataTransHttpInfo httpInfo; + httpInfo.curlCode = 0; + httpInfo.responseCode = 200; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); + EXPECT_EQ(res, -1); + + httpInfo.curlCode = 1; + res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); + EXPECT_EQ(res, 0); + + httpInfo.curlCode = 0; + httpInfo.responseCode = 500001; + res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); + EXPECT_EQ(res, 0); +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest004, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + AAFwk::Want want; + + chrStats.processName = "process_name_test"; + netstackChrReport.SetWantParam(want, chrStats); + + std::string processNameTest = want.GetStringParam("PROCESS_NAME"); + EXPECT_EQ(processNameTest, "process_name_test"); +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest005, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + AAFwk::Want want; + + chrStats.httpInfo.totalTime = 100; + netstackChrReport.SetHttpInfo(want, chrStats.httpInfo); + + std::string httpInfoStr = want.GetStringParam("DATA_TRANS_HTTP_INFO"); + const auto &httpWant = AAFwk::Want::FromString(httpInfoStr); + long totalTimeTRes = httpWant->GetLongParam("total_time", -1); + EXPECT_EQ(totalTimeTRes, 100); +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest006, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + AAFwk::Want want; + + chrStats.tcpInfo.rtt = 200; + netstackChrReport.SetTcpInfo(want, chrStats.tcpInfo); + + std::string tcpInfoStr = want.GetStringParam("DATA_TRANS_TCP_INFO"); + const auto &tcpWant = AAFwk::Want::FromString(tcpInfoStr); + int rttRes = httpWant->GetIntParam("tcpi_rtt", -1); + EXPECT_EQ(rttRes, 200); +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTest007, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + + netstackChrReport.ReportCommonEvent(chrStats); + int second_ret = netstackChrReport.ReportCommonEvent(chrStats); + EXPECT_EQ(second_ret, -1); +} \ No newline at end of file diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 6b04bd7e7..bf6cb7042 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -68,52 +68,5 @@ typedef struct DataTransChrStats { DataTransHttpInfo httpInfo; DataTransTcpInfo tcpInfo; } DataTransChrStats; - -constexpr int REPORT_CHR_RESULT_SUCCESS = 0; -constexpr int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; -constexpr int REPORT_CHR_RESULT_SET_DATA_FAIL = 2; -constexpr int REPORT_CHR_RESULT_REPORT_FAIL = 3; - -constexpr char PROCESS_NAME[] = "PROCESS_NAME"; - -constexpr char HTTP_INFO_KEY[] = "DATA_TRANS_HTTP_INFO"; -constexpr char UID_KEY[] = "uid"; -constexpr char RESPONSE_CODE_KEY[] = "response_code"; -constexpr char TOTAL_TIME_KEY[] = "total_time"; -constexpr char NAMELOOKUP_TIME_KEY[] = "namelookup_time"; -constexpr char CONNECT_TIME_KEY[] = "connect_time"; -constexpr char PRETRANSFER_TIME_KEY[] = "pretransfer_time"; -constexpr char SIZE_UPLOAD_KEY[] = "size_upload"; -constexpr char SIZE_DOWNLOAD_KEY[] = "size_download"; -constexpr char SPEED_DOWNLOAD_KEY[] = "speed_download"; -constexpr char SPEED_UPLOAD_KEY[] = "speed_upload"; -constexpr char EFFECTIVE_METHOD_KEY[] = "effective_method"; -constexpr char STARTTRANSFER_TIME_KEY[] = "starttransfer_time"; -constexpr char CONTENT_TYPE_KEY[] = "content_type"; -constexpr char REDIRECT_TIME_KEY[] = "redirect_time"; -constexpr char REDIRECT_COUNT_KEY[] = "redirect_count"; -constexpr char OS_ERRNO_KEY[] = "os_errno"; -constexpr char SSL_VERIFYRESULT_KEY[] = "ssl_verifyresult"; -constexpr char APPCONNECT_TIME_KEY[] = "appconnect_time"; -constexpr char RETRY_AFTER_KEY[] = "retry_after"; -constexpr char PROXY_ERROR_KEY[] = "proxy_error"; -constexpr char QUEUE_TIME_KEY[] = "queue_time"; -constexpr char CURL_CODE_KEY[] = "curl_code"; - -constexpr char TCP_INFO_KEY[] = "DATA_TRANS_TCP_INFO"; -constexpr char TCPI_UNACKED_KEY[] = "tcpi_unacked"; -constexpr char TCPI_LAST_DATA_SENT_KEY[] = "tcpi_last_data_sent"; -constexpr char TCPI_LAST_ACK_SENT_KEY[] = "tcpi_last_ack_sent"; -constexpr char TCPI_LAST_DATA_RECV_KEY[] = "tcpi_last_data_recv"; -constexpr char TCPI_LAST_ACK_RECV_KEY[] = "tcpi_last_ack_recv"; -constexpr char TCPI_RTT_KEY[] = "tcpi_rtt"; -constexpr char TCPI_RTTVAR_KEY[] = "tcpi_rttvar"; -constexpr char TCPI_RETRANSMITS_KEY[] = "tcpi_retransmits"; -constexpr char TCPI_TOTAL_RETRANS_KEY[] = "tcpi_total_retrans"; -constexpr char SRC_IP_KEY[] = "src_ip"; -constexpr char DST_IP_KEY[] = "dst_ip"; -constexpr char SRC_PORT_KEY[] = "src_port"; -constexpr char DST_PORT_KEY[] = "dst_port"; - } // namespace OHOS::NetStack #endif // COMMUNICATIONNETSTACK_I_NETSTACK_CHR_CLIENT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/include/netstack_chr_client.h b/utils/netstack_chr_client/include/netstack_chr_client.h index d6b17f4f6..6ec82ef27 100644 --- a/utils/netstack_chr_client/include/netstack_chr_client.h +++ b/utils/netstack_chr_client/include/netstack_chr_client.h @@ -42,7 +42,7 @@ private: static DataType GetNumericAttributeFromCurl(CURL *handle, CURLINFO info); static std::string GetStringAttributeFromCurl(CURL *handle, CURLINFO info); static int shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); - NetstackChrReport netstackChrReport; + NetStackChrReport netstackChrReport; }; } // namespace OHOS::NetStack::ChrClient diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index d08965f33..49f914655 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -26,21 +26,19 @@ namespace OHOS::NetStack::ChrClient { using namespace OHOS::NetStack::ChrClient; -class NetstackChrReport { +class NetStackChrReport { public: - NetstackChrReport(); - ~NetstackChrReport(); + NetStackChrReport(); + ~NetStackChrReport(); int ReportCommonEvent(DataTransChrStats chrStats); private: std::chrono::system_clock::time_point lastReceivedTime_; - std::mutex agentMutex_; int ignoreReportTimes_ = 0; - int ConvertWantParam(AAFwk::Want& want, DataTransChrStats chrStats); - std::string ConvertHttpInfoToJsonStr(DataTransChrStats chrStats); - std::string ConvertTcpInfoToJsonStr(DataTransChrStats chrStats); - void InforLog(DataTransChrStats chrStats); + void SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats); + void SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInfo); + void SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo); }; } // namespace OHOS::NatStack::ChrClient #endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index 12cfc6ea2..a0116a29e 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -42,51 +42,39 @@ int NetStackChrClient::GetAddrFromSock( // Get local addr addrLen = sizeof(localss); - if (getsockname(sockfd, reinterpret_cast(&localss), &addrLen) < 0) { - return -1; - } + (void)getsockname(sockfd, reinterpret_cast(&localss), &addrLen); // Get peer addr addrLen = sizeof(peerss); - if (getsockname(sockfd, reinterpret_cast(&peerss), &addrLen) < 0) { - return -1; - } + (void)getsockname(sockfd, reinterpret_cast(&peerss), &addrLen); - char buf[INET6_ADDRSTRLEN]; + char buf[INET6_ADDRSTRLEN] = {0}; if (localss.ss_family == AF_INET && peerss.ss_family == AF_INET) { auto *l4 = reinterpret_cast(&localss); auto *p4 = reinterpret_cast(&peerss); - - if (inet_ntop(AF_INET, &l4->sin_addr, buf, sizeof(buf)) == nullptr) { - return -1; + if (inet_ntop(AF_INET, &l4->sin_addr, buf, sizeof(buf)) != nullptr) { + srcIp = buf; + srcPort = ntohs(l4->sin_port); } - srcIp = buf; - srcPort = ntohs(l4->sin_port); - - if (inet_ntop(AF_INET, &p4->sin_addr, buf, sizeof(buf)) == nullptr) { - return -1; + if (inet_ntop(AF_INET, &p4->sin_addr, buf, sizeof(buf)) != nullptr) { + dstIp = buf; + dstPort = ntohs(p4->sin_port); } - - dstIp = buf; - dstPort = ntohs(p4->sin_port); } else if (localss.ss_family == AF_INET6 && peerss.ss_family == AF_INET6) { auto *l6 = reinterpret_cast(&localss); auto *p6 = reinterpret_cast(&peerss); - - if (inet_ntop(AF_INET6, &l6->sin6_addr, buf, sizeof(buf)) == nullptr) { - return -1; + if (inet_ntop(AF_INET6, &l6->sin6_addr, buf, sizeof(buf)) != nullptr) { + srcIp = buf; + srcPort = ntohs(l6->sin6_port); } - srcIp = buf; - srcPort = ntohs(l6->sin6_port); - if (inet_ntop(AF_INET6, &p6->sin6_addr, buf, sizeof(buf)) == nullptr) { - return -1; + if (inet_ntop(AF_INET6, &p6->sin6_addr, buf, sizeof(buf)) != nullptr) { + dstIp = buf; + dstPort = ntohs(p6->sin6_port); } - dstIp = buf; - dstPort = ntohs(p6->sin6_port); } else { return -1; } - + return 0; } diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index b968c6fcd..aa694b9cc 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -22,18 +22,22 @@ using namespace OHOS::NetStack::ChrClient; -constexpr char REPORT_HTTP_EVENT_NAME[] = "custom.event.CHR_REPORT_HTTP"; -constexpr int REPORT_TIME_LIMIT_MINUTE = 5; +static constexpr const char* REPORT_HTTP_EVENT_NAME = "custom.event.CHR_REPORT_HTTP"; +static constexpr const std::int32_t CHR_UID = 1201; +static constexpr const int REPORT_TIME_LIMIT_MINUTE = 5; -NetstackChrReport::NetstackChrReport() +static constexpr const int REPORT_CHR_RESULT_SUCCESS = 0; +static constexpr const int REPORT_CHR_RESULT_TIME_LIMIT_ERROR = 1; +static constexpr const int REPORT_CHR_RESULT_REPORT_FAIL = 2; + +NetStackChrReport::NetStackChrReport() {} -NetstackChrReport::~NetstackChrReport() +NetStackChrReport::~NetStackChrReport() {} -int NetstackChrReport::ReportCommonEvent(DataTransChrStats chrStats) +int NetStackChrReport::ReportCommonEvent(DataTransChrStats chrStats) { - std::lock_guard lock(agentMutex_); auto currentTime = std::chrono::system_clock::now(); auto timeDifference = std::chrono::duration_cast(currentTime - lastReceivedTime_); if (timeDifference.count() < REPORT_TIME_LIMIT_MINUTE) { @@ -42,114 +46,73 @@ int NetstackChrReport::ReportCommonEvent(DataTransChrStats chrStats) } AAFwk::Want want; want.SetAction(REPORT_HTTP_EVENT_NAME); - if (ConvertWantParam(want, chrStats) != 0) { - return REPORT_CHR_RESULT_SET_DATA_FAIL; - } + SetWantParam(want, chrStats); - EventFwk::CommonEventData common_event_data; - common_event_data.SetWant(want); - EventFwk::CommonEventPublishInfo publish_info; - if (!EventFwk::CommonEventManager::PublishCommonEvent(common_event_data, publish_info)) { + EventFwk::CommonEventData commonEventData; + commonEventData.SetWant(want); + EventFwk::CommonEventPublishInfo publishInfo; + publishInfo.SetSubscriberUid({CHR_UID}); + if (!EventFwk::CommonEventManager::PublishCommonEvent(commonEventData, publishInfo)) { NETSTACK_LOGE("Subscriber is nullptr, report to CHR failed."); return REPORT_CHR_RESULT_REPORT_FAIL; } NETSTACK_LOGI("Report to CHR success, %{public}d reports are ignore before this.", ignoreReportTimes_); - InforLog(chrStats); lastReceivedTime_ = currentTime; ignoreReportTimes_ = 0; return REPORT_CHR_RESULT_SUCCESS; } -int NetstackChrReport::ConvertWantParam(AAFwk::Want& want, DataTransChrStats chrStats) -{ - std::string httpInfoJsonStr = ConvertHttpInfoToJsonStr(chrStats); - std::string tcpInfoJsonStr = ConvertTcpInfoToJsonStr(chrStats); - if (httpInfoJsonStr == "" or tcpInfoJsonStr == "") { - return -1; - } - want.SetParam(PROCESS_NAME, chrStats.processName); - want.SetParam(HTTP_INFO_KEY, httpInfoJsonStr); - want.SetParam(TCP_INFO_KEY, tcpInfoJsonStr); - return 0; -} - -std::string NetstackChrReport::ConvertHttpInfoToJsonStr(DataTransChrStats chrStats) +void NetStackChrReport::SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats) { - AAFwk::Want want; - want.SetParam(CURL_CODE_KEY, static_cast(chrStats.httpInfo.curlCode)); - want.SetParam(RESPONSE_CODE_KEY, static_cast(chrStats.httpInfo.responseCode)); - want.SetParam(TOTAL_TIME_KEY, static_cast(chrStats.httpInfo.totalTime)); - want.SetParam(NAMELOOKUP_TIME_KEY, static_cast(chrStats.httpInfo.nameLookUpTime)); - want.SetParam(CONNECT_TIME_KEY, static_cast(chrStats.httpInfo.connectTime)); - want.SetParam(APPCONNECT_TIME_KEY, static_cast(chrStats.httpInfo.appconnectTime)); - want.SetParam(PRETRANSFER_TIME_KEY, static_cast(chrStats.httpInfo.preTransferTime)); - want.SetParam(STARTTRANSFER_TIME_KEY, static_cast(chrStats.httpInfo.startTransferTime)); - want.SetParam(QUEUE_TIME_KEY, static_cast(chrStats.httpInfo.queueTime)); - want.SetParam(RETRY_AFTER_KEY, static_cast(chrStats.httpInfo.retryAfter)); - want.SetParam(SIZE_UPLOAD_KEY, static_cast(chrStats.httpInfo.sizeUpload)); - want.SetParam(SIZE_DOWNLOAD_KEY, static_cast(chrStats.httpInfo.sizeDownload)); - want.SetParam(SPEED_DOWNLOAD_KEY, static_cast(chrStats.httpInfo.speedDownload)); - want.SetParam(SPEED_UPLOAD_KEY, static_cast(chrStats.httpInfo.speedUpload)); - want.SetParam(EFFECTIVE_METHOD_KEY, std::string(chrStats.httpInfo.effectiveMethod)); - want.SetParam(CONTENT_TYPE_KEY, std::string(chrStats.httpInfo.contentType)); - want.SetParam(REDIRECT_TIME_KEY, static_cast(chrStats.httpInfo.redirectTime)); - want.SetParam(REDIRECT_COUNT_KEY, static_cast(chrStats.httpInfo.redirectCount)); - want.SetParam(PROXY_ERROR_KEY, static_cast(chrStats.httpInfo.proxyError)); - want.SetParam(OS_ERRNO_KEY, static_cast(chrStats.httpInfo.osError)); - want.SetParam(SSL_VERIFYRESULT_KEY, static_cast(chrStats.httpInfo.sslVerifyResult)); - std::string paramStr = want.ToString(); - return paramStr; + want.SetParam("PROCESS_NAME", chrStats.processName); + SetHttpInfo(want, chrStats.httpInfo); + SetTcpInfo(want, chrStats.tcpInfo); } -std::string NetstackChrReport::ConvertTcpInfoToJsonStr(DataTransChrStats chrStats) +void NetStackChrReport::SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInfo) { - AAFwk::Want want; - want.SetParam(TCPI_RETRANSMITS_KEY, static_cast(chrStats.tcpInfo.retransmits)); - want.SetParam(TCPI_UNACKED_KEY, static_cast(chrStats.tcpInfo.unacked)); - want.SetParam(TCPI_LAST_DATA_SENT_KEY, static_cast(chrStats.tcpInfo.lastDataSent)); - want.SetParam(TCPI_LAST_ACK_SENT_KEY, static_cast(chrStats.tcpInfo.lastAckSent)); - want.SetParam(TCPI_LAST_DATA_RECV_KEY, static_cast(chrStats.tcpInfo.lastDataRecv)); - want.SetParam(TCPI_LAST_ACK_RECV_KEY, static_cast(chrStats.tcpInfo.lastAckRecv)); - want.SetParam(TCPI_RTT_KEY, static_cast(chrStats.tcpInfo.rtt)); - want.SetParam(TCPI_RTTVAR_KEY, static_cast(chrStats.tcpInfo.rttvar)); - want.SetParam(TCPI_TOTAL_RETRANS_KEY, static_cast(chrStats.tcpInfo.totalRetrans)); - want.SetParam(SRC_IP_KEY, std::string(chrStats.tcpInfo.srcIp)); - want.SetParam(DST_IP_KEY, std::string(chrStats.tcpInfo.dstIp)); - want.SetParam(SRC_PORT_KEY, static_cast(chrStats.tcpInfo.srcPort)); - want.SetParam(DST_PORT_KEY, static_cast(chrStats.tcpInfo.dstPort)); - std::string paramStr = want.ToString(); - return paramStr; + AAFwk::Want wantHttp; + wantHttp.SetParam("uid", static_cast(httpInfo.uid)); + wantHttp.SetParam("response_code", static_cast(httpInfo.responseCode)); + wantHttp.SetParam("total_time", static_cast(httpInfo.totalTime)); + wantHttp.SetParam("namelookup_time", static_cast(httpInfo.nameLookUpTime)); + wantHttp.SetParam("connect_time", static_cast(httpInfo.connectTime)); + wantHttp.SetParam("pretransfer_time", static_cast(httpInfo.preTransferTime)); + wantHttp.SetParam("size_upload", static_cast(httpInfo.sizeUpload)); + wantHttp.SetParam("size_download", static_cast(httpInfo.sizeDownload)); + wantHttp.SetParam("speed_download", static_cast(httpInfo.speedDownload)); + wantHttp.SetParam("speed_upload", static_cast(httpInfo.speedUpload)); + wantHttp.SetParam("effective_method", std::string(httpInfo.effectiveMethod)); + wantHttp.SetParam("starttransfer_time", static_cast(httpInfo.startTransferTime)); + wantHttp.SetParam("content_type", std::string(httpInfo.contentType)); + wantHttp.SetParam("redirect_time", static_cast(httpInfo.redirectTime)); + wantHttp.SetParam("redirect_count", static_cast(httpInfo.redirectCount)); + wantHttp.SetParam("os_errno", static_cast(httpInfo.osError)); + wantHttp.SetParam("ssl_verifyresult", static_cast(httpInfo.sslVerifyResult)); + wantHttp.SetParam("appconnect_time", static_cast(httpInfo.appconnectTime)); + wantHttp.SetParam("retry_after", static_cast(httpInfo.retryAfter)); + wantHttp.SetParam("proxy_error", static_cast(httpInfo.proxyError)); + wantHttp.SetParam("queue_time", static_cast(httpInfo.queueTime)); + wantHttp.SetParam("curl_code", static_cast(httpInfo.curlCode)); + want.SetParam("DATA_TRANS_HTTP_INFO", wantHttp.ToString()); } -void NetstackChrReport::InforLog(DataTransChrStats chrStats) +std::string NetStackChrReport::ConvertTcpInfoToJsonStr(AAFwk::Want& want, DataTransTcpInfo tcpInfo) { - NETSTACK_LOGI("[Netstack CHR Service] Process Name:%{public}s, \ - HTTP Info{%{public}d, %{public}d, %{public}lld, \ - %{public}lld, %{public}lld, %{public}lld, \ - %{public}lld, %{public}lld, %{public}lld, \ - %{public}lld, %{public}s, %{public}lld, \ - %{public}s, %{public}lld, %{public}ld, \ - %{public}ld, %{public}ld, %{public}lld, \ - %{public}lld, %{public}d, %{public}lld, \ - %{public}ld, \ - TCP Info{%{public}d, %{public}d, %{public}d, \ - %{public}d, %{public}d, %{public}d, \ - %{public}d, %{public}d, %{public}d, \ - %{public}s, %{public}s, %{public}d}, \ - %{public}d", - chrStats.processName.c_str(), - chrStats.httpInfo.uid, chrStats.httpInfo.responseCode, chrStats.httpInfo.totalTime, - chrStats.httpInfo.nameLookUpTime, chrStats.httpInfo.connectTime, chrStats.httpInfo.preTransferTime, - chrStats.httpInfo.sizeUpload, chrStats.httpInfo.sizeDownload, chrStats.httpInfo.speedDownload, - chrStats.httpInfo.speedUpload, chrStats.httpInfo.effectiveMethod.c_str(), chrStats.httpInfo.startTransferTime, - chrStats.httpInfo.contentType.c_str(), chrStats.httpInfo.redirectTime, chrStats.httpInfo.redirectCount, - chrStats.httpInfo.osError, chrStats.httpInfo.sslVerifyResult, chrStats.httpInfo.appconnectTime, - chrStats.httpInfo.retryAfter, chrStats.httpInfo.proxyError, chrStats.httpInfo.queueTime, - chrStats.httpInfo.curlCode, - chrStats.tcpInfo.unacked, chrStats.tcpInfo.lastDataSent, chrStats.tcpInfo.lastAckSent, - chrStats.tcpInfo.lastDataRecv, chrStats.tcpInfo.lastAckRecv, chrStats.tcpInfo.rtt, - chrStats.tcpInfo.rttvar, chrStats.tcpInfo.retransmits, chrStats.tcpInfo.totalRetrans, - chrStats.tcpInfo.srcIp.c_str(), chrStats.tcpInfo.dstIp.c_str(), chrStats.tcpInfo.srcPort, - chrStats.tcpInfo.dstPort); + AAFwk::Want wantTcp; + wantTcp.SetParam("tcpi_unacked", static_cast(tcpInfo.unacked)); + wantTcp.SetParam("tcpi_last_data_sent", static_cast(tcpInfo.lastDataSent)); + wantTcp.SetParam("tcpi_last_ack_sent", static_cast(tcpInfo.lastAckSent)); + wantTcp.SetParam("tcpi_last_data_recv", static_cast(tcpInfo.lastDataRecv)); + wantTcp.SetParam("tcpi_last_ack_recv", static_cast(tcpInfo.lastAckRecv)); + wantTcp.SetParam("tcpi_rtt", static_cast(tcpInfo.rtt)); + wantTcp.SetParam("tcpi_rttvar", static_cast(tcpInfo.rttvar)); + wantTcp.SetParam("tcpi_retransmits", static_cast(tcpInfo.retransmits)); + wantTcp.SetParam("tcpi_total_retrans", static_cast(tcpInfo.totalRetrans)); + wantTcp.SetParam("src_ip", std::string(tcpInfo.srcIp)); + wantTcp.SetParam("dst_ip", std::string(tcpInfo.dstIp)); + wantTcp.SetParam("src_port", static_cast(tcpInfo.srcPort)); + wantTcp.SetParam("dst_port", static_cast(tcpInfo.dstPort)); + want.SetParam("DATA_TRANS_TCP_INFO", wantTcp.ToString()); } \ No newline at end of file -- Gitee From 37962b9938e83a2c7ff0fa60194bb8dd1e5e4e83 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Sun, 11 May 2025 16:30:00 +0800 Subject: [PATCH 093/126] add UT code Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index aa694b9cc..450f44d55 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -98,7 +98,7 @@ void NetStackChrReport::SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInf want.SetParam("DATA_TRANS_HTTP_INFO", wantHttp.ToString()); } -std::string NetStackChrReport::ConvertTcpInfoToJsonStr(AAFwk::Want& want, DataTransTcpInfo tcpInfo) +std::string NetStackChrReport::SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo) { AAFwk::Want wantTcp; wantTcp.SetParam("tcpi_unacked", static_cast(tcpInfo.unacked)); -- Gitee From 0fd32e2451439ca62d787e83f6677058b6d7b4af Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Sun, 11 May 2025 16:59:16 +0800 Subject: [PATCH 094/126] add UT code Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 450f44d55..b01dc6a6e 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -98,7 +98,7 @@ void NetStackChrReport::SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInf want.SetParam("DATA_TRANS_HTTP_INFO", wantHttp.ToString()); } -std::string NetStackChrReport::SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo) +void NetStackChrReport::SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo) { AAFwk::Want wantTcp; wantTcp.SetParam("tcpi_unacked", static_cast(tcpInfo.unacked)); -- Gitee From 92c217acfe47a81d8d900fcbc252eaa5aa9aee0b Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Sun, 11 May 2025 19:33:39 +0800 Subject: [PATCH 095/126] add UT code Signed-off-by: ywm_up@qq.com --- frameworks/native/http/http_client/http_client_task.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/native/http/http_client/http_client_task.cpp b/frameworks/native/http/http_client/http_client_task.cpp index ba3218f81..cead2d88e 100644 --- a/frameworks/native/http/http_client/http_client_task.cpp +++ b/frameworks/native/http/http_client/http_client_task.cpp @@ -734,8 +734,9 @@ void HttpClientTask::ProcessResponse(CURLMsg *msg) response_.SetResponseTime(HttpTime::GetNowTimeGMT()); DumpHttpPerformance(); +#if HAS_NETMANAGER_BASE ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(curlHandle_, code); - +#endif if (CURLE_ABORTED_BY_CALLBACK == code) { (void)ProcessResponseCode(); if (onCanceled_) { -- Gitee From d87206075e9de9d5af962f50983f29b1d60c40a1 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 12 May 2025 08:56:15 +0800 Subject: [PATCH 096/126] add report lock Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/include/netstack_chr_report.h | 1 + utils/netstack_chr_client/src/netstack_chr_report.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index 49f914655..a103f5f62 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -35,6 +35,7 @@ public: private: std::chrono::system_clock::time_point lastReceivedTime_; int ignoreReportTimes_ = 0; + std::mutex report_mutex_; void SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats); void SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInfo); diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index b01dc6a6e..f718fce49 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -38,6 +38,7 @@ NetStackChrReport::~NetStackChrReport() int NetStackChrReport::ReportCommonEvent(DataTransChrStats chrStats) { + std::lock_guard lock(report_mutex_); auto currentTime = std::chrono::system_clock::now(); auto timeDifference = std::chrono::duration_cast(currentTime - lastReceivedTime_); if (timeDifference.count() < REPORT_TIME_LIMIT_MINUTE) { -- Gitee From 88751fdd650d4b18a47772d6c1089e2a83e090bb Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Mon, 12 May 2025 17:34:16 +0800 Subject: [PATCH 097/126] add timeout Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- test/BUILD.gn | 1 - .../websocketinnerapi_fuzzer/BUILD.gn | 71 ------- .../websocketinnerapi_fuzzer/corpus/init | 13 -- .../websocketinnerapi_fuzzer/project.xml | 25 --- .../websocket_inner_fuzzer.cpp | 178 ------------------ .../websocket_inner_fuzzer.h | 21 --- 6 files changed, 309 deletions(-) delete mode 100644 test/fuzztest/websocketinnerapi_fuzzer/BUILD.gn delete mode 100644 test/fuzztest/websocketinnerapi_fuzzer/corpus/init delete mode 100644 test/fuzztest/websocketinnerapi_fuzzer/project.xml delete mode 100644 test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.cpp delete mode 100644 test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.h diff --git a/test/BUILD.gn b/test/BUILD.gn index 6fb8b0ccf..01d5815ca 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -20,7 +20,6 @@ group("netstack_test") { "fuzztest/socket:fuzztest", "fuzztest/websocket:fuzztest", "fuzztest/websocketcapi_fuzzer:fuzztest", - "fuzztest/websocketinnerapi_fuzzer:fuzztest", "unittest/http:unittest", "unittest/http/cache:unittest", "unittest/http_client:unittest", diff --git a/test/fuzztest/websocketinnerapi_fuzzer/BUILD.gn b/test/fuzztest/websocketinnerapi_fuzzer/BUILD.gn deleted file mode 100644 index 4de62928c..000000000 --- a/test/fuzztest/websocketinnerapi_fuzzer/BUILD.gn +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2023 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#####################hydra-fuzz################### -import("//build/config/features.gni") -import("//build/ohos.gni") -import("//build/test.gni") -import("//foundation/communication/netstack/netstack_config.gni") - -##############################fuzztest########################################## -WEBSOCKET_INNERAPI = "$NETSTACK_DIR/frameworks/native/websocket_client" - -utils_include = [ - "$SUBSYSTEM_DIR/netstack/utils/common_utils/include", - "$SUBSYSTEM_DIR/netstack/utils/log/include", - "$SUBSYSTEM_DIR/netstack/utils/napi_utils/include", -] - -common_external_deps = [ - "c_utils:utils", - "eventhandler:libeventhandler", - "hilog:libhilog", - "libwebsockets:websockets", -] - -ohos_fuzztest("WebSocketInnerApiFuzzTest") { - module_out_path = fuzz_test_path - fuzz_config_file = "$NETSTACK_DIR/test/fuzztest/websocketinnerapi_fuzzer" - include_dirs = [ - "$NETSTACK_DIR/utils/napi_utils/include", - "$WEBSOCKET_INNERAPI/include", - ] - include_dirs += utils_include - - cflags = [ - "-g", - "-O0", - "-Wno-unused-variable", - "-fno-omit-frame-pointer", - ] - - sources = [ - "$SUBSYSTEM_DIR/netstack/utils/common_utils/src/netstack_common_utils.cpp", - "websocket_inner_fuzzer.cpp", - ] - - deps = [ - "$NETSTACK_DIR/utils/napi_utils:napi_utils", - "$NETSTACK_INNERKITS_DIR/websocket_client:websocket_client", - ] - - external_deps = common_external_deps -} - -############################################################################### -group("fuzztest") { - testonly = true - - deps = [ ":WebSocketInnerApiFuzzTest" ] -} -############################################################################### diff --git a/test/fuzztest/websocketinnerapi_fuzzer/corpus/init b/test/fuzztest/websocketinnerapi_fuzzer/corpus/init deleted file mode 100644 index 184a6a356..000000000 --- a/test/fuzztest/websocketinnerapi_fuzzer/corpus/init +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2023 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -FUZZ diff --git a/test/fuzztest/websocketinnerapi_fuzzer/project.xml b/test/fuzztest/websocketinnerapi_fuzzer/project.xml deleted file mode 100644 index bac4974e9..000000000 --- a/test/fuzztest/websocketinnerapi_fuzzer/project.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - 1000 - - 300 - - 4096 - - \ No newline at end of file diff --git a/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.cpp b/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.cpp deleted file mode 100644 index 2f2fbce03..000000000 --- a/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - -#include "netstack_log.h" -#include "secure_char.h" -#include "websocket_client_innerapi.h" - -namespace OHOS { -namespace NetStack { -namespace WebSocketClient { -namespace { -OpenOptions openOptions; -std::map headers = { - {"Content-Type", "application/json"}, - {"Authorization", "Bearer your_token_here"}, -}; -const uint8_t *g_baseFuzzData = nullptr; -size_t g_baseFuzzSize = 0; -size_t g_baseFuzzPos = 0; -[[maybe_unused]] constexpr size_t STR_LEN = 255; -} // namespace -template T GetData() -{ - T object{}; - size_t objectSize = sizeof(object); - if (g_baseFuzzData == nullptr || g_baseFuzzSize <= g_baseFuzzPos || objectSize > g_baseFuzzSize - g_baseFuzzPos) { - return object; - } - errno_t ret = memcpy_s(&object, objectSize, g_baseFuzzData + g_baseFuzzPos, objectSize); - if (ret != EOK) { - return object; - } - g_baseFuzzPos += objectSize; - return object; -} - -void SetGlobalFuzzData(const uint8_t *data, size_t size) -{ - g_baseFuzzData = data; - g_baseFuzzSize = size; - g_baseFuzzPos = 0; -} - -std::string GetStringFromData(int strlen) -{ - if (strlen < 1) { - return ""; - } - - char cstr[strlen]; - cstr[strlen - 1] = '\0'; - for (int i = 0; i < strlen - 1; i++) { - cstr[i] = GetData(); - } - std::string str(cstr); - return str; -} - -static void OnMessage(WebSocketClient *client, const std::string &data, size_t length) {} - -static void OnOpen(WebSocketClient *client, OpenResult openResult) {} - -static void OnError(WebSocketClient *client, ErrorResult error) {} - -static void OnClose(WebSocketClient *client, CloseResult closeResult) {} - -void SetRequestOptionsTest(const uint8_t *data, size_t size) -{ - if ((data == nullptr) || (size < 1)) { - return; - } - SetGlobalFuzzData(data, size); - std::string str = GetStringFromData(STR_LEN); - openOptions.headers["Content-Type"] = str; - openOptions.headers["Authorization"] = str; - WebSocketClient *client = new WebSocketClient(); - client->Registcallback(OnOpen, OnMessage, OnError, OnClose); - client->Connect("www.baidu.com", openOptions); -} - -void SetConnectUrlTest(const uint8_t *data, size_t size) -{ - if (size < 1 || data == nullptr) { - return; - } - SetGlobalFuzzData(data, size); - std::string str = GetStringFromData(STR_LEN); - openOptions.headers["Authorization"] = "Bearer your_token_here"; - openOptions.headers["Content-Type"] = "application/json"; - WebSocketClient *client = new WebSocketClient(); - client->Registcallback(OnOpen, OnMessage, OnError, OnClose); - client->Connect(str, openOptions); -} - -void SetSendDataTest(const uint8_t *data, size_t size) -{ - if ((data == nullptr) || (size < 1)) { - return; - } - openOptions.headers["Authorization"] = "Bearer your_token_here"; - SetGlobalFuzzData(data, size); - std::string str = GetStringFromData(STR_LEN); - openOptions.headers["Content-Type"] = "application/json"; - WebSocketClient *client = new WebSocketClient(); - client->Registcallback(OnOpen, OnMessage, OnError, OnClose); - client->Connect("www.baidu.com", openOptions); - const char *data1 = str.c_str(); - int32_t sendLength = std::strlen(data1); - client->Send(const_cast(data1), sendLength); -} - -void SetSendDataLengthTest(const uint8_t *data, size_t size) -{ - if ((data == nullptr) || (size < 1)) { - return; - } - SetGlobalFuzzData(data, size); - openOptions.headers["Content-Type"] = "application/json"; - openOptions.headers["Authorization"] = "Bearer your_token_here"; - WebSocketClient *client = new WebSocketClient(); - client->Registcallback(OnOpen, OnMessage, OnError, OnClose); - client->Connect("www.baidu.com", openOptions); - const char *data1 = "Hello,world!"; - client->Send(const_cast(data1), size); -} - -void SetCloseOptionTest(const uint8_t *data, size_t size) -{ - if ((data == nullptr) || (size < 1)) { - return; - } - openOptions.headers["Content-Type"] = "application/json"; - openOptions.headers["Authorization"] = "Bearer your_token_here"; - SetGlobalFuzzData(data, size); - std::string str = GetStringFromData(STR_LEN); - - WebSocketClient *client = new WebSocketClient(); - client->Registcallback(OnOpen, OnMessage, OnError, OnClose); - client->Connect("www.baidu.com", openOptions); - CloseOption CloseOptions; - CloseOptions.code = size; - CloseOptions.reason = str.c_str(); - client->Close(CloseOptions); -} - -} // namespace WebSocketClient -} // namespace NetStack -} // namespace OHOS - -/* Fuzzer entry point */ -extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - /* Run your code on data */ - OHOS::NetStack::WebSocketClient::SetRequestOptionsTest(data, size); - OHOS::NetStack::WebSocketClient::SetConnectUrlTest(data, size); - OHOS::NetStack::WebSocketClient::SetSendDataTest(data, size); - OHOS::NetStack::WebSocketClient::SetSendDataLengthTest(data, size); - OHOS::NetStack::WebSocketClient::SetCloseOptionTest(data, size); - return 0; -} \ No newline at end of file diff --git a/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.h b/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.h deleted file mode 100644 index 161344366..000000000 --- a/test/fuzztest/websocketinnerapi_fuzzer/websocket_inner_fuzzer.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2023-2024 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WEBSOCKET_INNER_FUZZER_H -#define WEBSOCKET_INNER_FUZZER_H - -#define FUZZ_PROJECT_NAME "websocket_fuzzer" - -#endif // WEBSOCKET_INNER_FUZZER_H -- Gitee From 443e26ab74bee2df11bd96f4346fe7eddc45f93e Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 15 May 2025 10:32:41 +0800 Subject: [PATCH 098/126] =?UTF-8?q?websocketserver=20=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wendan4 --- .../include/websocket_server_exec.h | 143 ++++- .../src/websocket_server_exec.cpp | 246 +++------ netstack_config.gni | 2 +- test/unittest/websocket/BUILD.gn | 3 +- test/unittest/websocket/WebSocketTest.cpp | 508 ++++++++++++++++++ utils/napi_utils/include/event_manager.h | 8 +- utils/napi_utils/src/event_manager.cpp | 17 +- 7 files changed, 744 insertions(+), 183 deletions(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h index d8c07f79c..1e7c74927 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -11,17 +11,19 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. -*/ + */ #ifndef COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H #define COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H +#include #include "server_start_context.h" #include "list_all_connections_context.h" #include "server_send_context.h" #include "server_close_context.h" #include "server_stop_context.h" #include "websocket_utils.h" +#include "netstack_log.h" namespace OHOS::NetStack::Websocket { @@ -35,6 +37,133 @@ struct WebSocketMessage { WebSocketConnection connection; }; +class UserData { +public: + struct SendData { + SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) + : data(paraData), length(paraLength), protocol(paraProtocol) + { + } + + SendData() = delete; + + ~SendData() = default; + + void *data; + size_t length; + lws_write_protocol protocol; + }; + + explicit UserData(lws_context *context) + : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) + { + } + + bool IsClosed() + { + std::lock_guard lock(mutex_); + return closed_; + } + + bool IsThreadStop() + { + return threadStop_.load(); + } + + void SetThreadStop(bool threadStop) + { + threadStop_.store(threadStop); + } + + void Close(lws_close_status status, const std::string &reason) + { + std::lock_guard lock(mutex_); + closeStatus = status; + closeReason = reason; + closed_ = true; + } + + void Push(void *data, size_t length, lws_write_protocol protocol) + { + std::lock_guard lock(mutex_); + dataQueue_.emplace(data, length, protocol); + } + + SendData Pop() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return {nullptr, 0, LWS_WRITE_TEXT}; + } + SendData data = dataQueue_.front(); + dataQueue_.pop(); + return data; + } + + void SetContext(lws_context *context) + { + context_ = context; + } + + lws_context *GetContext() + { + return context_; + } + + bool IsEmpty() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return true; + } + return false; + } + + void SetLws(lws *wsi) + { + std::lock_guard lock(mutexForLws_); + if (wsi == nullptr) { + NETSTACK_LOGD("set wsi nullptr"); + } + wsi_ = wsi; + } + + void TriggerWritable() + { + std::lock_guard lock(mutexForLws_); + if (wsi_ == nullptr) { + NETSTACK_LOGE("wsi is nullptr, can not trigger"); + return; + } + lws_callback_on_writable(wsi_); + } + + std::map header; + + lws_close_status closeStatus; + + std::string closeReason; + + uint32_t openStatus; + + std::string openMessage; + +private: + volatile bool closed_; + + std::atomic_bool threadStop_; + + std::mutex mutex_; + + std::mutex mutexForLws_; + + lws_context *context_; + + std::queue dataQueue_; + + lws *wsi_ = nullptr; +}; + class WebSocketServerExec final { public: /* async work execute */ @@ -62,8 +191,6 @@ public: static napi_value ServerStopCallback(ServerStopContext *context); private: - static uint32_t GetHttpResponseFromWsi(lws *wsi); - static int HttpDummy(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len); static int RaiseServerError(EventManager *manager); @@ -102,9 +229,13 @@ private: static void SetWebsocketMessage(lws *wsi, EventManager *manager, const std::string &msg, void *dataMsg); - static bool IsOverMaxClientConns(EventManager *manager); + static bool IsOverMaxClientConns(EventManager *manager, const std::string ip); + + static bool IsOverMaxConcurrentClientsCnt(EventManager *manager, const std::vector connections, + const std::string ip); - static bool IsAllowedProtocol(lws *wsi); + static bool IsOverMaxCntForOneClient(EventManager *manager, const std::vector connections, + const std::string ip); static bool IsAllowConnection(const std::string &clientId); diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index 2afd95017..a571bf78d 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -112,133 +112,6 @@ static const lws_http_mount mount = { NULL, }; -class UserData { -public: - struct SendData { - SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) - :data(paraData), length(paraLength), protocol(paraProtocol) - { - } - - SendData() = delete; - - ~SendData() = default; - - void *data; - size_t length; - lws_write_protocol protocol; - }; - - explicit UserData(lws_context *context) - :closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) - { - } - - bool IsClosed() - { - std::lock_guard lock(mutex_); - return closed_; - } - - bool IsThreadStop() - { - return threadStop_.load(); - } - - void SetThreadStop(bool threadStop) - { - threadStop_.store(threadStop); - } - - void Close(lws_close_status status, const std::string &reason) - { - std::lock_guard lock(mutex_); - closeStatus = status; - closeReason = reason; - closed_ = true; - } - - void Push(void *data, size_t length, lws_write_protocol protocol) - { - std::lock_guard lock(mutex_); - dataQueue_.emplace(data, length, protocol); - } - - SendData Pop() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return {nullptr, 0, LWS_WRITE_TEXT}; - } - SendData data = dataQueue_.front(); - dataQueue_.pop(); - return data; - } - - void SetContext(lws_context *context) - { - context_ = context; - } - - lws_context *GetContext() - { - return context_; - } - - bool IsEmpty() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return true; - } - return false; - } - - void SetLws(lws *wsi) - { - std::lock_guard lock(mutexForLws_); - if (wsi == nullptr) { - NETSTACK_LOGD("set wsi nullptr"); - } - wsi_ = wsi; - } - - void TriggerWritable() - { - std::lock_guard lock(mutexForLws_); - if (wsi_ == nullptr) { - NETSTACK_LOGE("wsi is nullptr, can not trigger"); - return; - } - lws_callback_on_writable(wsi_); - } - - std::map header; - - lws_close_status closeStatus; - - std::string closeReason; - - uint32_t openStatus; - - std::string openMessage; - -private: - volatile bool closed_; - - std::atomic_bool threadStop_; - - std::mutex mutex_; - - std::mutex mutexForLws_; - - lws_context *context_; - - std::queue dataQueue_; - - lws *wsi_ = nullptr; -}; - template static void CallbackTemplate(uv_work_t *work, int status) { (void)status; @@ -335,9 +208,10 @@ int WebSocketServerExec::LwsCallbackEstablished(lws *wsi, lws_callback_reasons r } // bind clientuserdata with wsi lws_context *lwsContext = lws_get_context(wsi); - std::shared_ptr clientUserData; - clientUserData = std::make_shared(lwsContext); + auto clientUserData = std::make_shared(lwsContext); lws_set_wsi_user(wsi, clientUserData.get()); + manager->AddClientUserData(wsi, clientUserData); + std::string clientId; WebSocketConnection connection; bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); @@ -388,17 +262,21 @@ bool WebSocketServerExec::GetPeerConnMsg(lws *wsi, EventManager *manager, std::s return true; } -bool WebSocketServerExec::IsOverMaxClientConns(EventManager *manager) +bool WebSocketServerExec::IsOverMaxClientConns(EventManager *manager, const std::string ip) { - std::vector connection = GetConnections(); - if (connection.size() >= manager->GetMaxConnClientCnt() * manager->GetMaxConnForOneClient()) { - NETSTACK_LOGE("current connections is over limit"); + std::vector connections = GetConnections(); + if (IsOverMaxConcurrentClientsCnt(manager, connections, ip)) { + NETSTACK_LOGI("current client connections is over max concurrent number"); + return true; + } + if (IsOverMaxCntForOneClient(manager, connections, ip)) { + NETSTACK_LOGI("current connections for one client is over max number"); return true; } return false; } -void WebSocketServerExec::AddConnections(const std::string &Id, lws *wsi, +void WebSocketServerExec::AddConnections(const std::string &id, lws *wsi, std::shared_ptr &userData, WebSocketConnection &conn) { if (userData->IsClosed() || userData->IsThreadStop()) { @@ -407,12 +285,41 @@ void WebSocketServerExec::AddConnections(const std::string &Id, lws *wsi, } { std::unique_lock lock(wsMutex_); - webSocketConnection_[Id].first = wsi; - webSocketConnection_[Id].second = conn; + webSocketConnection_[id].first = wsi; + webSocketConnection_[id].second = conn; NETSTACK_LOGI("AddConnections success"); } } +bool WebSocketServerExec::IsOverMaxConcurrentClientsCnt(EventManager *manager, + const std::vector connections, const std::string ip) +{ + std::unordered_set uniqueIp; + for (const auto &conn : connections) { + uniqueIp.insert(conn.clientIP); + } + if (uniqueIp.find(ip) != uniqueIp.end()) { + return uniqueIp.size() > manager->GetMaxConcurrentClientCnt(); + } else { + return (uniqueIp.size() + 1) > manager->GetMaxConcurrentClientCnt(); + } +} + +bool WebSocketServerExec::IsOverMaxCntForOneClient(EventManager *manager, + const std::vector connections, const std::string ip) +{ + uint32_t cnt = 0; + for (auto it = connections.begin(); it != connections.end(); ++it) { + if (ip == it->clientIP) { + ++cnt; + } + } + if (cnt + 1 > manager->GetMaxConnForOneClient()) { + return true; + } + return false; +} + int WebSocketServerExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) { NETSTACK_LOGD("lws callback server closed"); @@ -455,6 +362,9 @@ int WebSocketServerExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason } OnServerClose(wsi, manager, clientUserData->closeStatus, clientUserData->closeReason); RemoveConnections(clientId, *clientUserData); + manager->RemoveClientUserData(wsi); + lws_set_wsi_user(wsi, nullptr); + if (userData->IsClosed() && webSocketConnection_.empty() && !userData->IsThreadStop()) { NETSTACK_LOGI("server service is stopped"); userData->SetThreadStop(true); @@ -515,7 +425,7 @@ int WebSocketServerExec::LwsCallbackServerWriteable(lws *wsi, lws_callback_reaso NETSTACK_LOGD("lws callback Server writable"); lws_context *context = lws_get_context(wsi); EventManager *manager = static_cast(lws_context_user(context)); - if (manager == nullptr) { + if (manager == nullptr || manager->innerMagic_.magicNumber != EVENT_MANAGER_MAGIC_NUMBER) { NETSTACK_LOGE("manager is null"); return RaiseServerError(manager); } @@ -605,16 +515,6 @@ int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callb NETSTACK_LOGE("session is closed or thread is stopped"); return RaiseServerError(manager); } - if (!IsAllowedProtocol(wsi)) { - NETSTACK_LOGE("protocol is not allowed"); - return RaiseServerError(manager); - } - /* 是否超过最大连接数 */ - if (IsOverMaxClientConns(manager)) { - NETSTACK_LOGE("current connections count is more than limit, need to close"); - return RaiseServerError(manager); - } - /* 添加防止恶意连接的业务逻辑 */ std::string clientId; WebSocketConnection connection; bool ret = GetPeerConnMsg(wsi, manager, clientId, connection); @@ -622,6 +522,12 @@ int WebSocketServerExec::LwsCallbackFilterProtocolConnection(lws *wsi, lws_callb NETSTACK_LOGE("GetPeerConnMsg failed"); return RaiseServerError(manager); } + /* 是否超过最大连接数 */ + if (IsOverMaxClientConns(manager, connection.clientIP)) { + NETSTACK_LOGE("current connections count is more than limit, need to close"); + return RaiseServerError(manager); + } + /* 添加防止恶意连接的业务逻辑 */ if (!IsAllowConnection(clientId)) { NETSTACK_LOGE("Rejected malicious connection"); return RaiseServerError(manager); @@ -702,21 +608,6 @@ bool WebSocketServerExec::IsHighFreqConnection(const std::string &id) return false; } -bool WebSocketServerExec::IsAllowedProtocol(lws *wsi) -{ - char requested_protocol[128] = {0}; - int32_t res = lws_hdr_copy(wsi, requested_protocol, sizeof(requested_protocol), WSI_TOKEN_PROTOCOL); - if (res < 0) { - NETSTACK_LOGE("fail to read protocol"); - return true; - } - if (strcmp(requested_protocol, "lws_server") != 0) { - NETSTACK_LOGE("Protocol mismatch: client requested: %{public}s, server expects lws_server", requested_protocol); - return true; - } - return true; -} - int WebSocketServerExec::LwsCallbackReceive(lws *wsi, lws_callback_reasons reason, void *user, void *in, size_t len) { @@ -779,7 +670,7 @@ static napi_value ConvertWsBinaryMessageToJs(napi_env env, const WebSocketMessag static napi_value CreateServerBinaryMessagePara(napi_env env, void *callbackPara) { - auto pair = reinterpret_cast> *>(callbackPara); + auto pair = reinterpret_cast *>(callbackPara); if (pair == nullptr) { NETSTACK_LOGE("pair is nullptr"); return NapiUtils::GetUndefined(env); @@ -827,7 +718,7 @@ static napi_value ConvertWsTextMessageToJs(napi_env env, const WebSocketMessage static napi_value CreateServerTextMessagePara(napi_env env, void *callbackPara) { - auto pair = reinterpret_cast> *>(callbackPara); + auto pair = reinterpret_cast *>(callbackPara); if (pair == nullptr) { NETSTACK_LOGE("pair is nullptr"); return NapiUtils::GetUndefined(env); @@ -994,19 +885,26 @@ void WebSocketServerExec::OnServerMessage(lws *wsi, EventManager *manager, void void WebSocketServerExec::HandleServerRcvMessage(lws *wsi, EventManager *manager, void *data, size_t length, bool isBinary, bool isFinal) { + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return; + } if (isBinary) { manager->AppendWsServerBinaryData(wsi, data, length); if (isFinal) { const std::string &msgFromManager = manager->GetWsServerBinaryData(wsi); + if (msgFromManager.empty()) { + NETSTACK_LOGE("msgFromManager is empty"); + return; + } auto msg = new WebSocketMessage; if (msg == nullptr) { return; } SetWebsocketMessage(wsi, manager, msgFromManager, msg); manager->SetServerQueueData(wsi, msg); - auto callbackPara = std::make_shared>>(wsi, - manager->shared_from_this()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + auto callbackPara = new std::pair(wsi, manager); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara, CallbackTemplate); manager->ClearWsServerBinaryData(wsi); } @@ -1024,9 +922,8 @@ void WebSocketServerExec::HandleServerRcvMessage(lws *wsi, EventManager *manager } SetWebsocketMessage(wsi, manager, msgFromManager, msg); manager->SetServerQueueData(wsi, msg); - auto callbackPara = std::make_shared>>(wsi, - manager->shared_from_this()); - manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara.get(), + auto callbackPara = new std::pair(wsi, manager); + manager->EmitByUvWithoutCheckShared(EventName::EVENT_SERVER_MESSAGE_RECEIVE, callbackPara, CallbackTemplate); manager->ClearWsServerTextData(wsi); } @@ -1087,7 +984,7 @@ bool WebSocketServerExec::ExecServerStart(ServerStartContext *context) return false; } if (context->GetMaxConcurrentClientsNumber() > MAX_CONCURRENT_CLIENTS_NUMBER) { - NETSTACK_LOGE("concurrent clients number is over limit"); + NETSTACK_LOGE("max concurrent clients number is set over limit"); return false; } auto manager = context->GetSharedManager(); @@ -1096,7 +993,7 @@ bool WebSocketServerExec::ExecServerStart(ServerStartContext *context) } manager->SetMaxConnClientCnt(context->GetMaxConcurrentClientsNumber()); if (context->GetMaxConnectionsForOneClient() > MAX_CONNECTIONS_FOR_ONE_CLIENT) { - NETSTACK_LOGE("connection number for one client is over limit"); + NETSTACK_LOGE("max connection number for one client is set over limit"); return false; } manager->SetMaxConnForOneClient(context->GetMaxConnectionsForOneClient()); @@ -1138,7 +1035,6 @@ void WebSocketServerExec::FillServerContextInfo(ServerStartContext *context, std // maybe info.gid = -1; info.uid = -1; - info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; } static bool CheckFilePath(std::string &path) @@ -1336,6 +1232,10 @@ bool WebSocketServerExec::ExecServerStop(ServerStopContext *context) void WebSocketServerExec::CloseAllConnection(const std::shared_ptr &userData) { + if (userData == nullptr) { + NETSTACK_LOGE("user data is nullptr"); + return; + } decltype(webSocketConnection_) connListTmp; { std::shared_lock lock(wsMutex_); diff --git a/netstack_config.gni b/netstack_config.gni index 52dd3ffe7..93866d8fe 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,5 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false - netstack_websocket_server_enable = false + netstack_websocket_server_enable = true } diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 298505953..7016fb31c 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -74,7 +74,8 @@ ohos_unittest("websocket_unittest") { } if (netstack_websocket_server_enable) { - defines += [ "NETSTACK_WEBSOCKETSERVER" ] + defines += [ "NETSTACK_WEBSOCKETSERVER", + "private = public",] sources += [ "$WEBSOCKET_NAPI/async_context/src/list_all_connections_context.cpp", "$WEBSOCKET_NAPI/async_context/src/server_close_context.cpp", diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 31ee819c9..315cb24b7 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -31,6 +31,7 @@ #include "server_stop_context.h" #include "list_all_connections_context.h" #include "websocket_server_exec.h" +#include "napi_utils.h" #endif // NETSTACK_WEBSOCKETSERVER class WebSocketTest : public testing::Test { @@ -375,5 +376,512 @@ HWTEST_F(WebSocketTest, WebSocketTest034, TestSize.Level1) bool ret = WebSocketExec::ExecClose(&context); EXPECT_EQ(ret, false); } + +HWTEST_F(WebSocketTest, WebSocketTest035, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest036, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; + context.SetServerIP(ip); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest037, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "266.0.0.0"; + context.SetServerIP(ip); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest038, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "2001:0db8:85a3:0000:0000:8a2e:0370:7334:1234"; + context.SetServerIP(ip); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest039, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 444; + context.SetServerPort(port); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest040, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 65555; + context.SetServerPort(port); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest041, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.SetPermissionDenied(true); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 444; + context.SetServerPort(port); + uint32_t number = 15; + context.SetMaxConcurrentClientsNumber(number); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest042, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 444; + context.SetServerPort(port); + uint32_t number = 9; + context.SetMaxConcurrentClientsNumber(number); + uint32_t cnt = 15; + context.SetMaxConnectionsForOneClient(cnt); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest043, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 444; + context.SetServerPort(port); + uint32_t number = 9; + context.SetMaxConcurrentClientsNumber(number); + uint32_t cnt = 9; + context.SetMaxConnectionsForOneClient(cnt); + uint32_t cnt2 = 9; + context.SetMaxConnectionsForOneClient(cnt2); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest044, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + std::string ip = "0.0.0.0"; + context.SetServerIP(ip); + uint32_t port = 444; + context.SetServerPort(port); + uint32_t number = 9; + context.SetMaxConcurrentClientsNumber(number); + uint32_t cnt = 9; + context.SetMaxConnectionsForOneClient(cnt); + uint32_t cnt2 = 9; + context.SetMaxConnectionsForOneClient(cnt2); + bool ret = WebSocketServerExec::ExecServerStart(&context); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest045, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(true); + uint32_t port = 444; + std::string ip = ""; + context.SetClientWebSocketConn(port, ip); + bool ret = WebSocketServerExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest046, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerSendContext context(env, eventManager); + context.SetPermissionDenied(true); + uint32_t port = 444; + std::string ip = "0.0.0.0"; + context.SetClientWebSocketConn(port, ip); + bool ret = WebSocketServerExec::ExecServerSend(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest047, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(true); + std::shared_ptr sharedManager = nullptr; + context.SetSharedManager(sharedManager); + bool ret = WebSocketServerExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest048, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(true); + context.connection.clientIP = ""; + context.connection.clientPort = 444; + bool ret = WebSocketServerExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest049, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerCloseContext context(env, eventManager); + context.SetPermissionDenied(true); + context.connection.clientIP = "0.0.0.0"; + context.connection.clientPort = 444; + bool ret = WebSocketServerExec::ExecServerClose(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest050, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetPermissionDenied(true); + std::shared_ptr userData = nullptr; + eventManager->SetWebSocketUserData(userData); + context.SetSharedManager(eventManager); + bool ret = WebSocketServerExec::ExecServerStop(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest051, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(true); + context.SetSharedManager(nullptr); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest052, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + context.SetPermissionDenied(true); + std::shared_ptr userData = nullptr; + eventManager->SetWebSocketUserData(userData); + context.SetSharedManager(eventManager); + bool ret = WebSocketServerExec::ExecListAllConnections(&context); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest053, TestSize.Level1) +{ + napi_value ret = WebSocketServerExec::ListAllConnectionsCallback(nullptr); + EXPECT_EQ(ret, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest054, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ListAllConnectionsContext context(env, eventManager); + std::vector connections; + context.SetAllConnections(connections); + napi_value connectionsArray = NapiUtils::CreateArray(context.GetEnv(), 0); + napi_value ret = WebSocketServerExec::ListAllConnectionsCallback(&context); + EXPECT_EQ(ret, connectionsArray); +} + +HWTEST_F(WebSocketTest, WebSocketTest055, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + context.SetSharedManager(nullptr); + napi_value ret = WebSocketServerExec::ServerStopCallback(&context); + EXPECT_EQ(ret, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest056, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStopContext context(env, eventManager); + napi_value ret = WebSocketServerExec::ServerStopCallback(&context); + EXPECT_EQ(ret, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest057, TestSize.Level1) +{ + lws *wsi = nullptr; + WebSocketServerExec::OnConnect(wsi, nullptr); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest058, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + WebSocketServerExec::OnConnect(wsi, eventManager.get()); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest059, TestSize.Level1) +{ + lws *wsi = nullptr; + lws_close_status closeStatus = LWS_CLOSE_STATUS_NOSTATUS; + std::string closeReason = "The link is down, onError"; + WebSocketServerExec::OnServerClose(wsi, nullptr, closeStatus, closeReason); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest060, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + lws_close_status closeStatus = LWS_CLOSE_STATUS_NOSTATUS; + std::string closeReason = "The link is down, onError"; + WebSocketServerExec::OnServerClose(wsi, eventManager.get(), closeStatus, closeReason); + EXPECT_EQ(closeStatus, LWS_CLOSE_STATUS_NOSTATUS); +} + +HWTEST_F(WebSocketTest, WebSocketTest061, TestSize.Level1) +{ + lws *wsi = nullptr; + void *data = nullptr; + size_t length = 0; + bool isBinary = false; + bool isFinal = false; + WebSocketServerExec::OnServerMessage(wsi, nullptr, data, length, isBinary, isFinal); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest062, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + void *data = nullptr; + size_t length = 0; + bool isBinary = false; + bool isFinal = false; + WebSocketServerExec::OnServerMessage(wsi, eventManager.get(), data, length, isBinary, isFinal); + EXPECT_EQ(isBinary, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest063, TestSize.Level1) +{ + int32_t code = 0; + WebSocketServerExec::OnServerError(nullptr, code); + EXPECT_EQ(code, 0); +} + +HWTEST_F(WebSocketTest, WebSocketTest064, TestSize.Level1) +{ + auto eventManager = std::make_shared(); + int32_t code = 0; + WebSocketServerExec::OnServerError(eventManager.get(), code); + EXPECT_EQ(code, 0); +} + +HWTEST_F(WebSocketTest, WebSocketTest065, TestSize.Level1) +{ + lws *wsi = nullptr; + void *data = nullptr; + size_t length = 0; + bool isBinary = true; + bool isFinal = true; + WebSocketServerExec::HandleServerRcvMessage(wsi, nullptr, data, length, isBinary, isFinal); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest066, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + void *data = nullptr; + size_t length = 0; + bool isBinary = true; + bool isFinal = false; + WebSocketServerExec::HandleServerRcvMessage(wsi, eventManager.get(), data, length, isBinary, isFinal); + EXPECT_EQ(isFinal, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest067, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + void *data = nullptr; + size_t length = 0; + bool isBinary = false; + bool isFinal = true; + WebSocketServerExec::HandleServerRcvMessage(wsi, eventManager.get(), data, length, isBinary, isFinal); + EXPECT_EQ(isFinal, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest068, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + void *data = nullptr; + size_t length = 0; + bool isBinary = false; + bool isFinal = false; + WebSocketServerExec::HandleServerRcvMessage(wsi, eventManager.get(), data, length, isBinary, isFinal); + EXPECT_EQ(isFinal, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest069, TestSize.Level1) +{ + lws *wsi = nullptr; + std::string msgFromManager = ""; + void *dataMsg = nullptr; + WebSocketServerExec::SetWebsocketMessage(wsi, nullptr, msgFromManager, dataMsg); + EXPECT_EQ(wsi, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest070, TestSize.Level1) +{ + lws *wsi = nullptr; + auto eventManager = std::make_shared(); + std::string msgFromManager = ""; + void *dataMsg = nullptr; + WebSocketServerExec::SetWebsocketMessage(wsi, eventManager.get(), msgFromManager, dataMsg); + EXPECT_NE(eventManager, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest071, TestSize.Level1) +{ + std::string clientId = "0.0.0.0:444"; + auto ret = WebSocketServerExec::GetClientWsi(clientId); + EXPECT_EQ(ret, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest072, TestSize.Level1) +{ + std::shared_ptr userData = nullptr; + WebSocketServerExec::CloseAllConnection(userData); + EXPECT_EQ(userData, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest073, TestSize.Level1) +{ + lws_context *context = nullptr; + std::shared_ptr userData = std::make_shared(context); + WebSocketServerExec::CloseAllConnection(userData); + EXPECT_NE(userData, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest074, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + lws_context_creation_info info; + auto ret = WebSocketServerExec::FillServerCertPath(&context, info); + EXPECT_EQ(ret, true); +} + +HWTEST_F(WebSocketTest, WebSocketTest075, TestSize.Level1) +{ + napi_env env = nullptr; + auto eventManager = std::make_shared(); + ServerStartContext context(env, eventManager); + context.certPath_ = "/path/to/your/certificate.pem"; + lws_context_creation_info info; + auto ret = WebSocketServerExec::FillServerCertPath(&context, info); + EXPECT_EQ(ret, false); +} + +HWTEST_F(WebSocketTest, WebSocketTest076, TestSize.Level1) +{ + std::string id = "0.0.0.0:444"; + lws_context *context = nullptr; + std::shared_ptr userData = std::make_shared(context); + WebSocketConnection conn; + WebSocketServerExec::AddConnections(id, nullptr, userData, conn); + EXPECT_NE(userData, nullptr); +} + +HWTEST_F(WebSocketTest, WebSocketTest077, TestSize.Level1) +{ + std::string id = "0.0.0.0:444"; + lws_context *context = nullptr; + std::shared_ptr userData = std::make_shared(context); + WebSocketConnection conn; + userData->SetThreadStop(true); + WebSocketServerExec::AddConnections(id, nullptr, userData, conn); + EXPECT_EQ(userData->IsThreadStop(), true); +} + +HWTEST_F(WebSocketTest, WebSocketTest078, TestSize.Level1) +{ + std::string id = "0.0.0.0:444"; + lws_context *context = nullptr; + std::shared_ptr userData = std::make_shared(context); + WebSocketConnection conn; + lws_close_status status = LWS_CLOSE_STATUS_NOSTATUS; + std::string reason = "The link is down, onError"; + userData->Close(status, reason); + WebSocketServerExec::AddConnections(id, nullptr, userData, conn); + EXPECT_EQ(userData->IsClosed(), true); +} + +HWTEST_F(WebSocketTest, WebSocketTest079, TestSize.Level1) +{ + std::string id = "0.0.0.0:444"; + lws_context *context = nullptr; + std::shared_ptr userData = std::make_shared(context); + WebSocketServerExec::RemoveConnections(id, *userData); + EXPECT_NE(userData, nullptr); +} #endif } // namespace \ No newline at end of file diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index 118bdf77a..e4bd55529 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -140,7 +140,11 @@ public: void SetMaxConnForOneClient(const uint32_t &cnt); - [[nodiscard]] uint32_t GetMaxConnClientCnt() const; + void AddClientUserData(void *wsi, std::shared_ptr &data); + + void RemoveClientUserData(void *wsi); + + [[nodiscard]] uint32_t GetMaxConcurrentClientCnt()const; [[nodiscard]] uint32_t GetMaxConnForOneClient() const; #endif @@ -165,9 +169,11 @@ private: std::shared_ptr proxyData_; #ifdef NETSTACK_WEBSOCKETSERVER std::shared_mutex dataServerQueueMutex_; + std::mutex mapMutex_; std::unordered_map> serverDataQueue_; std::unordered_map wsServerBinaryData_; std::unordered_map wsServerTextData_; + std::unordered_map> userDataMap_; uint32_t maxConnClientCnt_; uint32_t maxConnForOneClient_; #endif diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index a96e50e4a..cd9cfeee3 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -274,7 +274,7 @@ void EventManager::SetMaxConnForOneClient(const uint32_t &cnt) maxConnForOneClient_ = cnt; } -uint32_t EventManager::GetMaxConnClientCnt() const +uint32_t EventManager::GetMaxConcurrentClientCnt() const { return maxConnClientCnt_; } @@ -283,6 +283,21 @@ uint32_t EventManager::GetMaxConnForOneClient() const { return maxConnForOneClient_; } + +void EventManager::AddClientUserData(void *wsi, std::shared_ptr &data) +{ + std::lock_guard lock(mapMutex_); + userDataMap_[wsi] = data; +} + +void EventManager::RemoveClientUserData(void *wsi) +{ + std::lock_guard lock(mapMutex_); + auto it = userDataMap_.find(wsi); + if (it != userDataMap_.end()) { + userDataMap_.erase(it); + } +} #endif void EventManager::ClearWebSocketTextData() -- Gitee From 242f8a1c29cd620524fc47f385afb1377a95b71d Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 15 May 2025 21:46:50 +0800 Subject: [PATCH 099/126] =?UTF-8?q?websocketServer=20=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wendan4 --- frameworks/js/napi/websocket/BUILD.gn | 1 - .../include/list_all_connections_context.h | 3 +- .../include/server_close_context.h | 2 +- .../include/server_send_context.h | 3 +- .../websocket/utils/include/websocket_utils.h | 28 ---- .../include/websocket_exec_common.h | 157 ++++++++++++++++++ .../include/websocket_server_exec.h | 130 --------------- .../websocket_exec/src/websocket_exec.cpp | 129 +------------- .../src/websocket_server_exec.cpp | 2 +- test/unittest/websocket/BUILD.gn | 1 - test/unittest/websocket/WebSocketTest.cpp | 1 - 11 files changed, 162 insertions(+), 295 deletions(-) delete mode 100644 frameworks/js/napi/websocket/utils/include/websocket_utils.h create mode 100644 frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h diff --git a/frameworks/js/napi/websocket/BUILD.gn b/frameworks/js/napi/websocket/BUILD.gn index da03a0deb..5d85a8734 100644 --- a/frameworks/js/napi/websocket/BUILD.gn +++ b/frameworks/js/napi/websocket/BUILD.gn @@ -27,7 +27,6 @@ ohos_shared_library("websocket") { "async_context/include", "async_work/include", "constant/include", - "utils/include", "websocket_exec/include", "websocket_module/include", ] diff --git a/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h index ab245ab12..5c37ea0e3 100644 --- a/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h +++ b/frameworks/js/napi/websocket/async_context/include/list_all_connections_context.h @@ -17,8 +17,7 @@ #define COMMUNICATIONNETSTACK_LISTALLCONNECTIONS_CONTEXT_H #include "base_context.h" -#include "libwebsockets.h" -#include "websocket_utils.h" +#include "websocket_exec_common.h" #include "nocopyable.h" namespace OHOS::NetStack::Websocket { diff --git a/frameworks/js/napi/websocket/async_context/include/server_close_context.h b/frameworks/js/napi/websocket/async_context/include/server_close_context.h index a45910cc4..c95438c0d 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_close_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_close_context.h @@ -18,7 +18,7 @@ #include #include "base_context.h" -#include "websocket_utils.h" +#include "websocket_exec_common.h" #include "nocopyable.h" namespace OHOS::NetStack::Websocket { diff --git a/frameworks/js/napi/websocket/async_context/include/server_send_context.h b/frameworks/js/napi/websocket/async_context/include/server_send_context.h index 48073c65b..90beb31a7 100644 --- a/frameworks/js/napi/websocket/async_context/include/server_send_context.h +++ b/frameworks/js/napi/websocket/async_context/include/server_send_context.h @@ -17,9 +17,8 @@ #define COMMUNICATIONNETSTACK_SERVER_SEND_CONTEXT_H #include -#include "libwebsockets.h" #include "base_context.h" -#include "websocket_utils.h" +#include "websocket_exec_common.h" #include "nocopyable.h" namespace OHOS::NetStack::Websocket { diff --git a/frameworks/js/napi/websocket/utils/include/websocket_utils.h b/frameworks/js/napi/websocket/utils/include/websocket_utils.h deleted file mode 100644 index 086dc11f8..000000000 --- a/frameworks/js/napi/websocket/utils/include/websocket_utils.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2025-2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef COMMUNICATIONNETSTACK_WEBSOCKET_UTILS_H -#define COMMUNICATIONNETSTACK_WEBSOCKET_UTILS_H - -#include -#include - -namespace OHOS::NetStack::Websocket { - struct WebSocketConnection { - std::string clientIP; - uint32_t clientPort; - }; -} // namespace OHOS::NetStack::Websocket -#endif \ No newline at end of file diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h new file mode 100644 index 000000000..fc1cf4d7c --- /dev/null +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_COMMON_H +#define COMMUNICATIONNETSTACK_WEBSOCKET_EXEC_COMMON_H + +#include +#include +#include +#include "libwebsockets.h" +#include "netstack_log.h" + +namespace OHOS::NetStack::Websocket { +struct WebSocketConnection { + std::string clientIP; + uint32_t clientPort; +}; + +class UserData { +public: + struct SendData { + SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) + : data(paraData), length(paraLength), protocol(paraProtocol) + { + } + + SendData() = delete; + + ~SendData() = default; + + void *data; + size_t length; + lws_write_protocol protocol; + }; + + explicit UserData(lws_context *context) + : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) + { + } + + bool IsClosed() + { + std::lock_guard lock(mutex_); + return closed_; + } + + bool IsThreadStop() + { + return threadStop_.load(); + } + + void SetThreadStop(bool threadStop) + { + threadStop_.store(threadStop); + } + + void Close(lws_close_status status, const std::string &reason) + { + std::lock_guard lock(mutex_); + closeStatus = status; + closeReason = reason; + closed_ = true; + } + + void Push(void *data, size_t length, lws_write_protocol protocol) + { + std::lock_guard lock(mutex_); + dataQueue_.emplace(data, length, protocol); + } + + SendData Pop() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return {nullptr, 0, LWS_WRITE_TEXT}; + } + SendData data = dataQueue_.front(); + dataQueue_.pop(); + return data; + } + + void SetContext(lws_context *context) + { + context_ = context; + } + + lws_context *GetContext() + { + return context_; + } + + bool IsEmpty() + { + std::lock_guard lock(mutex_); + if (dataQueue_.empty()) { + return true; + } + return false; + } + + void SetLws(lws *wsi) + { + std::lock_guard lock(mutexForLws_); + if (wsi == nullptr) { + NETSTACK_LOGD("set wsi nullptr"); + } + wsi_ = wsi; + } + + void TriggerWritable() + { + std::lock_guard lock(mutexForLws_); + if (wsi_ == nullptr) { + NETSTACK_LOGE("wsi is nullptr, can not trigger"); + return; + } + lws_callback_on_writable(wsi_); + } + + std::map header; + + lws_close_status closeStatus; + + std::string closeReason; + + uint32_t openStatus; + + std::string openMessage; + +private: + volatile bool closed_; + + std::atomic_bool threadStop_; + + std::mutex mutex_; + + std::mutex mutexForLws_; + + lws_context *context_; + + std::queue dataQueue_; + + lws *wsi_ = nullptr; +}; +} diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h index 1e7c74927..ba1beac79 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_server_exec.h @@ -16,14 +16,11 @@ #ifndef COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H #define COMMUNICATIONNETSTACK_WEBSOCKET_SERVER_EXEC_H -#include #include "server_start_context.h" #include "list_all_connections_context.h" #include "server_send_context.h" #include "server_close_context.h" #include "server_stop_context.h" -#include "websocket_utils.h" -#include "netstack_log.h" namespace OHOS::NetStack::Websocket { @@ -37,133 +34,6 @@ struct WebSocketMessage { WebSocketConnection connection; }; -class UserData { -public: - struct SendData { - SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) - : data(paraData), length(paraLength), protocol(paraProtocol) - { - } - - SendData() = delete; - - ~SendData() = default; - - void *data; - size_t length; - lws_write_protocol protocol; - }; - - explicit UserData(lws_context *context) - : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) - { - } - - bool IsClosed() - { - std::lock_guard lock(mutex_); - return closed_; - } - - bool IsThreadStop() - { - return threadStop_.load(); - } - - void SetThreadStop(bool threadStop) - { - threadStop_.store(threadStop); - } - - void Close(lws_close_status status, const std::string &reason) - { - std::lock_guard lock(mutex_); - closeStatus = status; - closeReason = reason; - closed_ = true; - } - - void Push(void *data, size_t length, lws_write_protocol protocol) - { - std::lock_guard lock(mutex_); - dataQueue_.emplace(data, length, protocol); - } - - SendData Pop() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return {nullptr, 0, LWS_WRITE_TEXT}; - } - SendData data = dataQueue_.front(); - dataQueue_.pop(); - return data; - } - - void SetContext(lws_context *context) - { - context_ = context; - } - - lws_context *GetContext() - { - return context_; - } - - bool IsEmpty() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return true; - } - return false; - } - - void SetLws(lws *wsi) - { - std::lock_guard lock(mutexForLws_); - if (wsi == nullptr) { - NETSTACK_LOGD("set wsi nullptr"); - } - wsi_ = wsi; - } - - void TriggerWritable() - { - std::lock_guard lock(mutexForLws_); - if (wsi_ == nullptr) { - NETSTACK_LOGE("wsi is nullptr, can not trigger"); - return; - } - lws_callback_on_writable(wsi_); - } - - std::map header; - - lws_close_status closeStatus; - - std::string closeReason; - - uint32_t openStatus; - - std::string openMessage; - -private: - volatile bool closed_; - - std::atomic_bool threadStop_; - - std::mutex mutex_; - - std::mutex mutexForLws_; - - lws_context *context_; - - std::queue dataQueue_; - - lws *wsi_ = nullptr; -}; - class WebSocketServerExec final { public: /* async work execute */ diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp index 34c9aacdc..8fb4bdc48 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_exec.cpp @@ -26,7 +26,7 @@ #include "netstack_common_utils.h" #include "netstack_log.h" #include "securec.h" - +#include "websocket_exec_common.h" #ifdef HAS_NETMANAGER_BASE #include "http_proxy.h" #include "net_conn_client.h" @@ -103,133 +103,6 @@ struct OnOpenClosePara { static const std::vector WS_PREFIX = {PREFIX_WSS, PREFIX_WS}; -class UserData { -public: - struct SendData { - SendData(void *paraData, size_t paraLength, lws_write_protocol paraProtocol) - : data(paraData), length(paraLength), protocol(paraProtocol) - { - } - - SendData() = delete; - - ~SendData() = default; - - void *data; - size_t length; - lws_write_protocol protocol; - }; - - explicit UserData(lws_context *context) - : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), closed_(false), threadStop_(false), context_(context) - { - } - - bool IsClosed() - { - std::lock_guard lock(mutex_); - return closed_; - } - - bool IsThreadStop() - { - return threadStop_.load(); - } - - void SetThreadStop(bool threadStop) - { - threadStop_.store(threadStop); - } - - void Close(lws_close_status status, const std::string &reason) - { - std::lock_guard lock(mutex_); - closeStatus = status; - closeReason = reason; - closed_ = true; - } - - void Push(void *data, size_t length, lws_write_protocol protocol) - { - std::lock_guard lock(mutex_); - dataQueue_.emplace(data, length, protocol); - } - - SendData Pop() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return {nullptr, 0, LWS_WRITE_TEXT}; - } - SendData data = dataQueue_.front(); - dataQueue_.pop(); - return data; - } - - void SetContext(lws_context *context) - { - context_ = context; - } - - lws_context *GetContext() - { - return context_; - } - - bool IsEmpty() - { - std::lock_guard lock(mutex_); - if (dataQueue_.empty()) { - return true; - } - return false; - } - - void SetLws(lws *wsi) - { - std::lock_guard lock(mutexForLws_); - if (wsi == nullptr) { - NETSTACK_LOGD("set wsi nullptr"); - } - wsi_ = wsi; - } - - void TriggerWritable() - { - std::lock_guard lock(mutexForLws_); - if (wsi_ == nullptr) { - NETSTACK_LOGE("wsi is nullptr, can not trigger"); - return; - } - lws_callback_on_writable(wsi_); - } - - std::map header; - - lws_close_status closeStatus; - - std::string closeReason; - - uint32_t openStatus; - - std::string openMessage; - -private: - volatile bool closed_; - - std::atomic_bool threadStop_; - - std::mutex mutex_; - - std::mutex mutexForLws_; - - lws_context *context_; - - std::queue dataQueue_; - - lws *wsi_ = nullptr; -}; - template static void CallbackTemplate(uv_work_t *work, int status) { (void)status; diff --git a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp index a571bf78d..83b92b22a 100644 --- a/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp +++ b/frameworks/js/napi/websocket/websocket_exec/src/websocket_server_exec.cpp @@ -365,7 +365,7 @@ int WebSocketServerExec::LwsCallbackClosed(lws *wsi, lws_callback_reasons reason manager->RemoveClientUserData(wsi); lws_set_wsi_user(wsi, nullptr); - if (userData->IsClosed() && webSocketConnection_.empty() && !userData->IsThreadStop()) { + if (userData->IsClosed() && !userData->IsThreadStop()) { NETSTACK_LOGI("server service is stopped"); userData->SetThreadStop(true); } diff --git a/test/unittest/websocket/BUILD.gn b/test/unittest/websocket/BUILD.gn index 7016fb31c..3e2a5f663 100644 --- a/test/unittest/websocket/BUILD.gn +++ b/test/unittest/websocket/BUILD.gn @@ -36,7 +36,6 @@ ohos_unittest("websocket_unittest") { "$WEBSOCKET_NAPI/async_context/include", "$WEBSOCKET_NAPI/async_work/include", "$WEBSOCKET_NAPI/constant/include", - "$WEBSOCKET_NAPI/utils/include", "$WEBSOCKET_NAPI/websocket_exec/include", "$WEBSOCKET_NAPI/websocket_module/include", ] diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 315cb24b7..6bf0c7f66 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -13,7 +13,6 @@ * limitations under the License. */ -#include "netstack_log.h" #include "gtest/gtest.h" #include #include -- Gitee From efdca451492b8c338dfb438557d4150ebb2e4824 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 15 May 2025 14:26:53 +0000 Subject: [PATCH 100/126] update frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h. Signed-off-by: wendan4 --- .../websocket/websocket_exec/include/websocket_exec_common.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h index fc1cf4d7c..315a31ae3 100644 --- a/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h +++ b/frameworks/js/napi/websocket/websocket_exec/include/websocket_exec_common.h @@ -154,4 +154,5 @@ private: lws *wsi_ = nullptr; }; -} +} // namespace OHOS::NetStack::Websocket +#endif \ No newline at end of file -- Gitee From a738c0a8e42e5644304f76044ff14f3f0205abcd Mon Sep 17 00:00:00 2001 From: jsy Date: Sat, 17 May 2025 17:24:12 +0800 Subject: [PATCH 101/126] =?UTF-8?q?image=E7=BD=91=E7=BB=9C=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jsy --- utils/http_over_curl/src/epoll_multi_driver.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index 91bbc80ae..8d28824e2 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -51,6 +51,9 @@ void EpollMultiDriver::Initialize() }; curl_multi_setopt(multi_, CURLMOPT_TIMERDATA, this); curl_multi_setopt(multi_, CURLMOPT_TIMERFUNCTION, timerCallback); + curl_multi_setopt(multi_, CURLMOPT_MAX_HOST_CONNECTIONS, 6); // 单个主机的最大连接数 + curl_multi_setopt(multi_, CURLMOPT_MAX_TOTAL_CONNECTIONS, 64) // 最大同时打开连接数 + curl_multi_setopt(multi_, CURLMOPT_MAXCONNECTS, 64) // 连接缓冲池的大小 } EpollMultiDriver::~EpollMultiDriver() -- Gitee From 861ece7ed8cd7f9fc1ea6abe5ee544e8e4cd2fec Mon Sep 17 00:00:00 2001 From: jsy Date: Sat, 17 May 2025 17:27:17 +0800 Subject: [PATCH 102/126] =?UTF-8?q?image=E7=BD=91=E7=BB=9C=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jsy --- utils/http_over_curl/src/epoll_multi_driver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index 8d28824e2..92caef988 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -52,8 +52,8 @@ void EpollMultiDriver::Initialize() curl_multi_setopt(multi_, CURLMOPT_TIMERDATA, this); curl_multi_setopt(multi_, CURLMOPT_TIMERFUNCTION, timerCallback); curl_multi_setopt(multi_, CURLMOPT_MAX_HOST_CONNECTIONS, 6); // 单个主机的最大连接数 - curl_multi_setopt(multi_, CURLMOPT_MAX_TOTAL_CONNECTIONS, 64) // 最大同时打开连接数 - curl_multi_setopt(multi_, CURLMOPT_MAXCONNECTS, 64) // 连接缓冲池的大小 + curl_multi_setopt(multi_, CURLMOPT_MAX_TOTAL_CONNECTIONS, 64); // 最大同时打开连接数 + curl_multi_setopt(multi_, CURLMOPT_MAXCONNECTS, 64); // 连接缓冲池的大小 } EpollMultiDriver::~EpollMultiDriver() -- Gitee From 736723aebd2af06ba053c1b3b9dd3a6b457240ff Mon Sep 17 00:00:00 2001 From: liuleimin_hw Date: Sat, 17 May 2025 20:20:11 +0800 Subject: [PATCH 103/126] =?UTF-8?q?HTTP=20c=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liuleimin_hw --- interfaces/kits/c/net_http/include/net_http.h | 120 ++++ .../c/net_http/include/net_http_inner_type.h | 36 + .../kits/c/net_http/include/net_http_types.h | 667 ++++++++++++++++++ 3 files changed, 823 insertions(+) create mode 100644 interfaces/kits/c/net_http/include/net_http.h create mode 100644 interfaces/kits/c/net_http/include/net_http_inner_type.h create mode 100644 interfaces/kits/c/net_http/include/net_http_types.h diff --git a/interfaces/kits/c/net_http/include/net_http.h b/interfaces/kits/c/net_http/include/net_http.h new file mode 100644 index 000000000..6920b87ef --- /dev/null +++ b/interfaces/kits/c/net_http/include/net_http.h @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"), + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef NET_HTTP_H +#define NET_HTTP_H +#include +#include +/** + * @file net_http.h + * + * @brief Defines the APIs for http. + * + * @kit NetworkKit + * @syscap SystemCapability.Communication.NetStack + * @since 20 + */ +#include "net_http_type.h" +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief Creates headers for a request or response. + * + * @return Http_Headers* Pointer to {@link Http_Headers}. + * @since 20 + */ +Http_Headers *OH_Http_CreateHeaders(void); + +/** + * @brief Destroys the headers of a request or response. + * + * @param headers Pointer to the {@link Http_Headers} to be destroyed. + * @since 20 + */ +void OH_Http_DestroyHeaders(Http_Headers **headers); + +/** + * @brief Sets the key-value pair of the request or response header. + * + * @param headers Pointer to the {@link Http_Headers} to be set. + * @param name Key. + * @param value Value. + * @return uint32_t 0 - success. 401 - Parameter error. 2300027 - Out of memory. + * @since 20 + */ +uint32_t OH_Http_SetHeaderValue(struct Http_Headers *headers, const char *name, const char *value); + +/** + * @brief Obtains the value of a request or response header by key. + * + * @param headers Pointer to {@link Http_Headers}. + * @param name Key. + * @return Http_HeaderValue* Pointer to the obtained {@link Http_HeaderValue}. + * @since 20 + */ +Http_HeaderValue *OH_Http_GetHeaderValue(Http_Headers *headers, const char *name); + +/** + * @brief Obtains all the key-value pairs of a request or response header. + * + * @param headers Pointer to {@link Http_Headersaders}. + * @return Http_HeaderEntry* Pointers to all obtained key-value pairs {@link Http_HeaderEntry}. + * @since 20 + */ +Http_HeaderEntry *OH_Http_GetHeaderEntries(Http_Headers *headers); + +/** + * @brief Destroys all key-value pairs obtained in {@link OH_Http_GetHeaderEntries}. + * + * @param headerEntry Pointer to the {@link Http_HeaderEntry} to be destroyed. + * @since 20 + */ +void OH_Http_DestroyHeaderEntries(Http_HeaderEntry **headerEntry); + +/** + * @brief Create a http request. + * + * @param url Http request url. + * @return Pointer of HttpRequest if success; Null otherwise. + * @syscap SystemCapability.Communication.NetStack + * @since 20 + */ +Http_Request *OH_Http_CreateRequest(const char *url); + +/** + * @brief Initiates an HTTP request. + * + * @param request Pointer to {@link Http_Request}. + * @param callback Http response info, pointer to {@link Http_ResponseCallback} + * @param handler Callbacks to watch different events, pointer to {@link Http_EventsHandler}. + * @return 0 if success; non-0 otherwise. For details about error codes, see {@link Http_ErrCode}. + * @permission ohos.permission.INTERNET + * @syscap SystemCapability.Communication.NetStack + * @since 20 + */ +int OH_Http_Request(Http_Request *request, Http_ResponseCallback callback, Http_EventsHandler handler); + +/** + * @brief Destroy the HTTP request. + * + * @param request Pointer to the http request {@link Http_Request}. + * @syscap SystemCapability.Communication.NetStack + * @since 20 + */ +void OH_Http_Destroy(struct Http_Request **request); +#ifdef __cplusplus +} +#endif +#endif // NET_HTTP_H \ No newline at end of file diff --git a/interfaces/kits/c/net_http/include/net_http_inner_type.h b/interfaces/kits/c/net_http/include/net_http_inner_type.h new file mode 100644 index 000000000..f7cfbf52d --- /dev/null +++ b/interfaces/kits/c/net_http/include/net_http_inner_type.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RCP_REQUEST_CONTENT_INNER_C_H +#define RCP_REQUEST_CONTENT_INNER_C_H + +#include "net_http.h" +#include "netstack_hash_map.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct Http_Headers { + Netstack_HashMap *fields; +} Http_Headers; + +#ifdef __cplusplus +} +#endif + +#endif + +1793de46d15d8f4da910346533adbc71 \ No newline at end of file diff --git a/interfaces/kits/c/net_http/include/net_http_types.h b/interfaces/kits/c/net_http/include/net_http_types.h new file mode 100644 index 000000000..c4e2f564f --- /dev/null +++ b/interfaces/kits/c/net_http/include/net_http_types.h @@ -0,0 +1,667 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"), + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef NET_HTTP_TYPE_H +#define NET_HTTP_TYPE_H +/** + * @addtogroup http + * @{ + * + * @brief Provides C APIs for the Http client module. + * + * @since 20 + */ +/** + * @file net_http_type.h + * @brief Defines the data structure for the C APIs of the http module. + * + * @kit NetworkKit + * @syscap SystemCapability.Communication.NetStack + * @since 20 + */ +#ifdef __cplusplus +extern "C" { +#endif +#define OHOS_HTTP_MAX_PATH_LEN 128 +#define OHOS_HTTP_MAX_STR_LEN 256 +#define OHOS_HTTP_DNS_SERVER_NUM_MAX 3 + +/** + * @brief Defines http error code. + * + * @since 20 + */ +typedef enum Http_ErrCode { + /** + * Operation success. + */ + RESULT_OK = 0, + /** + * @brief Parameter error. + */ + PARAMETER_ERROR = 401, + /** + * @brief Permission denied. + */ + PERMISSION_DENIED = 201, + /** + * @brief Error code base. + */ + NETSTACK_E_BASE = 2300000, + /** + * @brief Unsupported protocol. + */ + UNSUPPORTED_PROTOCOL = (NETSTACK_E_BASE + 1), + /** + * @brief Invalid URL format or missing URL. + */ + INVALID_URL = (NETSTACK_E_BASE + 3), + /** + * @brief Failed to resolve the proxy name. + */ + RESOLVE_PROXY_FAILED = (NETSTACK_E_BASE + 5), + /** + * @brief Failed to resolve the host name. + */ + RESOLVE_HOST_FAILED = (NETSTACK_E_BASE + 6), + /** + * @brief Failed to connect to the server. + */ + CONNECT_SERVER_FAILED = (NETSTACK_E_BASE + 7), + /** + * @brief Invalid server response. + */ + INVALID_SERVER_RESPONSE = (NETSTACK_E_BASE + 8), + /** + * @brief Access to the remote resource denied. + */ + ACCESS_REMOTE_DENIED = (NETSTACK_E_BASE + 9), + /** + * @brief Error in the HTTP2 framing layer. + */ + HTTP2_FRAMING_ERROR = (NETSTACK_E_BASE + 16), + /** + * @brief Transferred a partial file. + */ + TRANSFER_PARTIAL_FILE = (NETSTACK_E_BASE + 18), + /** + * @brief Failed to write the received data to the disk or application. + */ + WRITE_DATA_FAILED = (NETSTACK_E_BASE + 23), + /** + * @brief Upload failed. + */ + UPLOAD_FAILED = (NETSTACK_E_BASE + 25), + /** + * @brief Failed to open or read local data from the file or application. + */ + OPEN_LOCAL_DATA_FAILED = (NETSTACK_E_BASE + 26), + /** + * @brief Out of memory. + */ + OUT_OF_MEMORY = (NETSTACK_E_BASE + 27), + /** + * @brief Operation timeout. + */ + OPERATION_TIMEOUT = (NETSTACK_E_BASE + 28), + /** + * @brief The number of redirections reaches the maximum allowed. + */ + REDIRECTIONS_TOO_LARGE = (NETSTACK_E_BASE + 47), + /** + * @brief The server returned nothing (no header or data). + */ + SERVER_RETURNED_NOTHING = (NETSTACK_E_BASE + 52), + /** + * @brief Failed to send data to the peer. + */ + SEND_DATA_FAILED = (NETSTACK_E_BASE + 55), + /** + * @brief Failed to receive data from the peer. + */ + RECEIVE_DATA_FAILED = (NETSTACK_E_BASE + 56), + /** + * @brief Local SSL certificate error. + */ + SSL_CERTIFICATE_ERROR = (NETSTACK_E_BASE + 58), + /** + * @brief The specified SSL cipher cannot be used. + */ + SSL_CIPHER_USED_ERROR = (NETSTACK_E_BASE + 59), + /** + * @brief Invalid SSL peer certificate or SSH remote key. + */ + INVALID_SSL_PEER_CERT = (NETSTACK_E_BASE + 60), + /** + * @brief Invalid HTTP encoding format. + */ + INVALID_ENCODING_FORMAT = (NETSTACK_E_BASE + 61), + /** + * @brief Maximum file size exceeded. + */ + FILE_TOO_LARGE = (NETSTACK_E_BASE + 63), + /** + * @brief Remote disk full. + */ + REMOTE_DISK_FULL = (NETSTACK_E_BASE + 70), + /** + * @brief Remote file already exists. + */ + REMOTE_FILE_EXISTS = (NETSTACK_E_BASE + 73), + /** + * @brief The SSL CA certificate does not exist or is inaccessible. + */ + SSL_CA_NOT_EXIST = (NETSTACK_E_BASE + 77), + /** + * @brief Remote file not found. + */ + REMOTE_FILE_NOT_FOUND = (NETSTACK_E_BASE + 78), + /** + * @brief Authentication error. + */ + AUTHENTICATION_ERROR = (NETSTACK_E_BASE + 94), + /** + * @brief It is not allowed to access this domain. + */ + ACCESS_DOMAIN_NOT_ALLOWED = (NETSTACK_E_BASE + 998), + /** + * @brief Unknown error. + */ + UNKNOWN_ERROR = (NETSTACK_E_BASE + 999) +} Http_ErrCode; + +/** + * @brief Defines http response code. + * + * @since 20 + */ +typedef enum Http_ResponseCode { + /** + * @brief The request was successful.. + */ + HTTP_OK = 200, + /** + * @brief Successfully requested and created a new resource.. + */ + CREATED = 201, + /** + * @brief The request has been accepted but has not been processed completely. + */ + ACCEPTED = 202, + /** + * @brief Unauthorized information. The request was successful. + */ + NOT_AUTHORITATIVE = 203, + /** + * @brief No content. The server successfully processed, but did not return content. + */ + NO_CONTENT = 204, + /** + * @brief Reset the content. + */ + RESET = 205, + /** + * @brief Partial content. The server successfully processed some GET requests. + */ + PARTIAL = 206, + /** + * @brief Multiple options. + */ + MULT_CHOICE = 300, + /** + * @brief Permanently move. The requested resource has been permanently moved to a new URI, + * and the returned information will include the new URI. The browser will automatically redirect to the new URI. + */ + MOVED_PERM = 301, + /** + * @brief Temporary movement. + */ + MOVED_TEMP = 302, + /** + * @brief View other addresses. + */ + SEE_OTHER = 303, + /** + * @brief Not modified. + */ + NOT_MODIFIED = 304, + /** + * @brief Using proxies. + */ + USE_PROXY = 305, + /** + * @brief The server cannot understand the syntax error error requested by the client. + */ + BAD_REQUEST = 400, + /** + * @brief Request for user authentication. + */ + UNAUTHORIZED = 401, + /** + * @brief Reserved for future use. + */ + PAYMENT_REQUIRED = 402, + /** + * @brief The server understands the request from the requesting client, but refuses to execute it. + */ + FORBIDDEN = 403, + /** + * @brief The server was unable to find resources (web pages) based on the client's request. + */ + NOT_FOUND = 404, + /** + * @brief The method in the client request is prohibited. + */ + BAD_METHOD = 405, + /** + * @brief The server is unable to complete the request based on the content characteristics requested by the client. + */ + NOT_ACCEPTABLE = 406, + /** + * @brief Request authentication of the proxy's identity. + */ + PROXY_AUTH = 407, + /** + * @brief The request took too long and timed out. + */ + CLIENT_TIMEOUT = 408, + /** + * @brief The server may have returned this code when completing the client's PUT request, + * as there was a conflict when the server was processing the request. + */ + CONFLICT = 409, + /** + * @brief The resource requested by the client no longer exists. + */ + GONE = 410, + /** + * @brief The server is unable to process request information sent by the client without Content Length. + */ + LENGTH_REQUIRED = 411, + /** + * @brief The prerequisite for requesting information from the client is incorrect. + */ + PRECON_FAILED = 412, + /** + * @brief The request was rejected because the requested entity was too large for the server to process. + */ + ENTITY_TOO_LARGE = 413, + /** + * @brief The requested URI is too long (usually a URL) and the server cannot process it. + */ + REQ_TOO_LONG = 414, + /** + * @brief The server is unable to process the requested format. + */ + UNSUPPORTED_TYPE = 415, + /** + * @brief Requested Range not satisfiable. + */ + RANGE_NOT_SATISFIABLE = 416, + /** + * @brief Internal server error, unable to complete the request. + */ + INTERNAL_ERROR = 500, + /** + * @brief * The server does not support the requested functionality and cannot complete the request. + */ + NOT_IMPLEMENTED = 501, + /** + * @brief The server acting as a gateway or proxy received an invalid request from the remote server. + */ + BAD_GATEWAY = 502, + /** + * @brief Due to overload or system maintenance, the server is temporarily unable to process client requests. + */ + UNAVAILABLE = 503, + /** + * @brief The server acting as a gateway or proxy did not obtain requests from the remote server in a timely manner. + */ + GATEWAY_TIMEOUT = 504, + /** + * @brief The version of the HTTP protocol requested by the server. + */ + VERSION = 505 +} Http_ResponseCode; + +/** + * @brief Buffer + * @since 20 + */ +typedef struct Http_Buffer { + /** Content. Buffer will not be copied. */ + const char *buffer; + /** Buffer length */ + uint32_t length; +} Http_Buffer; + +/** + * @brief Defines the address Family. + * + * @since 20 + */ +typedef enum Http_AddressFamilyType { + /** Default, The system automatically selects the IPv4 or IPv6 address of the domain name. */ + DEFAULT = 0, + /** IPv4, Selects the IPv4 address of the domain name. */ + ONLY_V4 = 1, + /** IPv6, Selects the IPv4 address of the domain name. */ + ONLY_V6 = 2 +} Http_AddressFamilyType; + +/** + * @brief HTTP get method + * @since 20 + */ +#define NET_HTTP_METHOD_GET "GET" +/** + * @brief HTTP head method + * @since 20 + */ +#define NET_HTTPMETHOD_HEAD "HEAD" +/** + * @brief HTTP options method + * @since 20 + */ +#define NET_HTTPMETHOD_OPTIONS "OPTIONS" +/** + * @brief HTTP trace method + * @since 20 + */ +#define NET_HTTPMETHOD_TRACE "TRACE" +/** + * @brief HTTP delete method + * @since 20 + */ +#define NET_HTTPMETHOD_DELETE "DELETE" +/** + * @brief HTTP post method + * @since 20 + */ +#define NET_HTTP_METHOD_POST "POST" +/** + * @brief HTTP put method + * @since 20 + */ +#define NET_HTTP_METHOD_PUT "PUT" +/** + * @brief HTTP patch method + * @since 20 + */ +#define NET_HTTP_METHOD_PATCH "CONNECT" + +/** + * @brief Defines the HTTP version. + * + * @since 20 + */ +typedef enum Http_HttpProtocol { + /** default choose by curl */ + HTTP_NONE = 0, + /** Http 1.1 version */ + HTTP1_1, + /** Http 2 version */ + HTTP2, + /** Http 3 version */ + HTTP3 +} Http_HttpProtocol; + +/** + * @brief Defines the Cert Type. + * + * @since 20 + */ +typedef enum Http_CertType { + /** PEM Cert Type */ + PEM = 0, + /** DER Cert Type */ + DER = 1, + /** P12 Cert Type */ + P12 = 2 +} Http_CertType; + +/** + * @brief Headers of the request or response. + * @since 20 + */ +typedef struct Http_Headers Http_Headers; + +/** + * @brief The value type of the header map of the request or response. + * @since 20 + */ +typedef struct Http_HeaderValue { + /** Value */ + char *value; + /** Point to the next {@link Http_HeaderValue} */ + struct Http_HeaderValue *next; +} Http_HeaderValue; + +/** + * @brief All key-value pairs of the headers of the request or response. + * @since 20 + */ +typedef struct Http_HeaderEntry { + /** Key */ + char *key; + /** Value */ + Http_HeaderValue *value; + /** Points to the next key-value pair {@link Http_HeaderEntry} */ + struct Http_HeaderEntry *next; +} Http_HeaderEntry; + +/** + * @brief Client certificate which is sent to the remote server, the the remote server will use it to verify the + * client's identification. + * @since 20 + */ +typedef struct Http_ClientCert { + /** A path to a client certificate. */ + char *certPath; + /** Client certificate type. */ + Http_CertType type; + /** File path of your client certificate private key. */ + char *keyPath; + /** Password for your client certificate private key. */ + char *keyPassword; +} Http_ClientCert; + +/** + * @brief Proxy type. Used to distinguish different proxy configurations. + * @since 20 + */ +typedef enum Http_ProxyType { + /** System proxy */ + HTTP_PROXY_NOT_USE, + /** System proxy */ + HTTP_PROXY_SYSTEM, + /** Use custom proxy */ + HTTP_PROXY_CUSTOM +} Http_ProxyType; + +/** + * @brief Custom proxy configuration. + * @since 20 + */ +typedef struct Http_CustomProxy { + /** Indicates the URL of the proxy server. If you do not set port explicitly, port will be 1080. */ + const char *host; + int32_t port; + const char *exclusionLists; +} Http_CustomProxy; + +/** + * @brief Proxy configuration. + * @since 20 + */ +typedef struct Http_Proxy { + /** Distinguish the proxy type used by the request */ + Http_ProxyType proxyType; + /** Custom proxy configuration, see {@link Http_CustomProxy} */ + Http_CustomProxy customProxy; +} Http_Proxy; + +/** + * @brief Response timing information. It will be collected in {@link Http_Response.performanceTiming} and + * @since 20 + */ +typedef struct Http_PerformanceTiming { + /** The total time in milliseconds for the HTTP transfer, including name resolving, TCP connect etc. */ + double dnsTiming; + /** The time in milliseconds from the start until the remote host name was resolved. */ + double tcpTiming; + /** The time in milliseconds from the start until the connection to the remote host (or proxy) was completed. */ + double tlsTiming; + /** The time in milliseconds, it took from the start until the transfer is just about to begin. */ + double firstSendTiming; + /** The time in milliseconds from last modification time of the remote file. */ + double firstReceiveTiming; + /** The time in milliseconds, it took from the start until the first byte is received. */ + double totalFinishTiming; + /** The time in milliseconds it took for all redirection steps including name lookup, connect, etc.*/ + double redirectTiming; +} Http_PerformanceTiming; + +/** + * @brief Defines the parameters for http request options. + * + * @since 20 + */ +typedef struct Http_RequestOptions { + /** Request method. */ + const char *method; + /** Priority of http requests. A larger value indicates a higher priority. */ + uint32_t priority; + /** Header of http requests. */ + Http_Headers *headers; + /** Read timeout interval. */ + uint32_t readTimeout; + /** Connection timeout interval. */ + uint32_t connectTimeout; + /** Use the protocol. The default value is automatically specified by the system. */ + Http_HttpProtocol httpProtocol; + /** Indicates whether to use the HTTP proxy. The default value is false. */ + Http_Proxy *httpProxy; + /** CA certificate of the user-specified path. */ + const char *caPath; + /** Set the download start position. This parameter can be used only in the GET method. */ + int64_t resumeFrom; + /** Set the download end position. This parameter can be used only in the GET method. */ + int64_t resumeTo; + /** Client certificates can be transferred. */ + Http_ClientCert *clientCert; + /** Set the DNS resolution for the https server. */ + const char *dnsOverHttps; + /** Maximum number of bytes in a response message. */ + uint32_t maxLimit; + /** The address family can be specified when the target domain name is resolved. */ + Http_AddressFamilyType addressFamily; +} Http_RequestOptions; + +/** + * @brief Defines the parameters for http response. + * + * @since 20 + */ +typedef struct Http_Response { + /** Response body */ + Http_Buffer body; + /** Server status code. */ + Http_ResponseCode responseCode; + /** Header of http response. */ + Http_Headers *headers; + /** Cookies returned by the server. */ + char *cookies; + /** The time taken of various stages of HTTP request. */ + Http_PerformanceTiming *performanceTiming; + /** + * @brief Response deletion function + * @param response Indicates the response to be deleted. It is a pointer that points to {@link Http_Response}. + * @since 20 + */ + void (*destroyResponse)(struct Http_Response **response); +} Http_Response; + +/** + * @brief Http request. + * @since 20 + */ +typedef struct Http_Request { + /** The request id for every single request. Generated by system. */ + uint32_t requestId; + /** Request url */ + char *url; + /** Request options. */ + Http_RequestOptions *options; +} Http_Request; + +/** + * @brief Callback function that is invoked when response is received. + * @param response Http response struct. + * @param errCode Response error code. + * @since 20 + */ +typedef void (*Http_ResponseCallback)(struct Http_Response *response, uint32_t errCode); + +/** + * @brief Callback function that is invoked when a response body is received. + * @param data Response body. + * @return size_t the length of response body. + * @since 20 + */ +typedef size_t (*Http_OnDataReceiveCallback)(const char *data); + +/** + * @brief Callback function invoked during request/response data transmission. + * @param totalSize total size + * @param transferredSize transferred size + * @since 20 + */ +typedef void (*Http_OnProgressCallback)(uint64_t totalSize, uint64_t transferredSize); + +/** + * @brief Callback called when all requests are received. + * @param headers Headers of the received requests, which points to the pointer of {@link Rcp_Headers}. + * @since 20 + */ +typedef void (*Http_OnHeaderReceiveCallback)(Http_Headers *headers); + +/** + * @brief Empty callback function for requested DataEnd or Canceled event callback + * @since 20 + */ +typedef void (*Http_OnVoidCallback)(void); + +/** + * @brief Callbacks to watch different events. + * @since 20 + */ +typedef struct Http_EventsHandler { + /** Callback function when the response body is received */ + Http_OnDataReceiveCallback onDataReceive; + /** Callback function during uploading */ + Http_OnProgressCallback onUploadProgress; + /** Callback function during downloading */ + Http_OnProgressCallback onDownloadProgress; + /** Callback function when a header is received */ + Http_OnHeaderReceiveCallback onHeadersReceive; + /** Callback function at the end of the transfer */ + Http_OnVoidCallback onDataEnd; // DONE + /** Callback function when a request is canceled */ + Http_OnVoidCallback onCanceled; // DONE +} Http_EventsHandler; +#ifdef __cplusplus +} +#endif +#endif // NET_HTTP_TYPE_H \ No newline at end of file -- Gitee From 19ff8b06f53abfcfb6f196a3b7381fb927fb5999 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 09:34:08 +0800 Subject: [PATCH 104/126] compatiable 32-bit devices and adjust report format Signed-off-by: ywm_up@qq.com --- .../include/i_netstack_chr_client.h | 1 + .../include/netstack_chr_report.h | 6 +- .../src/netstack_chr_client.cpp | 15 ++- .../src/netstack_chr_report.cpp | 93 ++++++++++--------- 4 files changed, 62 insertions(+), 53 deletions(-) diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index bf6cb7042..3f865f7cd 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -45,6 +45,7 @@ typedef struct DataTransHttpInfo { int proxyError; curl_off_t queueTime; long curlCode; + long requestStartTime; } DataTransHttpInfo; typedef struct DataTransTcpInfo { diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index a103f5f62..aff5ea909 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -17,8 +17,6 @@ #define COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H #include -#include -#include #include "i_netstack_chr_client.h" #include "want.h" @@ -38,8 +36,8 @@ private: std::mutex report_mutex_; void SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats); - void SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInfo); - void SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo); + void SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std:string& httpInfoJsonStr); + void SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std:string& tcpInfoJsonStr); }; } // namespace OHOS::NatStack::ChrClient #endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index a0116a29e..504c0a23a 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -129,6 +129,13 @@ std::string NetStackChrClient::GetStringAttributeFromCurl(CURL *handle, CURLINFO return std::string(result); } +long NetStackChrClient::GetRequestStartTime(curl_off_t totalTime) +{ + auto now = std::chrono::system_clock::now(); + long msCount = std::chrono::duration_cast(now.time_since_epoch()).count(); + return msCount; +} + void NetStackChrClient::GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &httpInfo) { (void)curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &httpInfo.responseCode); @@ -141,6 +148,7 @@ void NetStackChrClient::GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &htt httpInfo.appconnectTime = GetNumericAttributeFromCurl(handle, CURLINFO_APPCONNECT_TIME_T); httpInfo.queueTime = GetNumericAttributeFromCurl(handle, CURLINFO_QUEUE_TIME_T); httpInfo.retryAfter = GetNumericAttributeFromCurl(handle, CURLINFO_RETRY_AFTER); + httpInfo.requestStartTime = GetRequestStartTime(httpInfo.totalTime); httpInfo.sizeUpload = GetNumericAttributeFromCurl(handle, CURLINFO_SIZE_UPLOAD_T); httpInfo.sizeDownload = GetNumericAttributeFromCurl(handle, CURLINFO_SIZE_DOWNLOAD_T); @@ -158,10 +166,11 @@ void NetStackChrClient::GetHttpInfoFromCurl(CURL *handle, DataTransHttpInfo &htt int NetStackChrClient::shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo) { - if (httpInfo.curlCode != 0 || httpInfo.responseCode != HTTP_REQUEST_SUCCESS) { + if (httpInfo.curlCode != 0 || httpInfo.responseCode != HTTP_REQUEST_SUCCESS || + httpInfo.osError != 0 || httpInfo.proxyError != 0) { return 0; } - if ((httpInfo.sizeDownload + httpInfo.sizeDownload <= HTTP_FILE_TRANSFER_SIZE_THRESHOLD) && + if ((httpInfo.sizeUpload + httpInfo.sizeDownload <= HTTP_FILE_TRANSFER_SIZE_THRESHOLD) && httpInfo.totalTime > HTTP_FILE_TRANSFER_TIME_THRESHOLD) { return 0; } @@ -191,7 +200,7 @@ void NetStackChrClient::GetDfxInfoFromCurlHandleAndReport(CURL *handle, int32_t curl_easy_getinfo(handle, CURLINFO_ACTIVESOCKET, &sockfd); if (GetTcpInfoFromSock(sockfd, dataTransChrStats.tcpInfo) != 0) { - NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}lld", sockfd); + NETSTACK_LOGD("Chr client get tcp info from socket failed, sockfd: %{public}" PRId64, sockfd); } int ret = netstackChrReport.ReportCommonEvent(dataTransChrStats); diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index f718fce49..74fc8f97c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -12,13 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include -#include #include "i_netstack_chr_client.h" #include "netstack_chr_report.h" #include "netstack_log.h" #include "common_event_manager.h" -#include "want.h" using namespace OHOS::NetStack::ChrClient; @@ -66,54 +63,58 @@ int NetStackChrReport::ReportCommonEvent(DataTransChrStats chrStats) void NetStackChrReport::SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats) { + std::string httpInfoJsonStr; + std::string tcpInfoJsonStr; + SetHttpInfoJsonStr(chrStats.httpInfo, httpInfoJsonStr); + SetTcpInfoJsonStr(chrStats.tcpInfo, tcpInfoJsonStr); + want.SetParam("PROCESS_NAME", chrStats.processName); - SetHttpInfo(want, chrStats.httpInfo); - SetTcpInfo(want, chrStats.tcpInfo); + want.SetParam("DATA_TRANS_HTTP_INFO", httpInfoJsonStr); + want.SetParam("DATA_TRANS_TCP_INFO", tcpInfoJsonStr); } -void NetStackChrReport::SetHttpInfo(AAFwk::Want& want, DataTransHttpInfo httpInfo) +void NetStackChrReport::SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std::string& httpInfoJsonStr) { - AAFwk::Want wantHttp; - wantHttp.SetParam("uid", static_cast(httpInfo.uid)); - wantHttp.SetParam("response_code", static_cast(httpInfo.responseCode)); - wantHttp.SetParam("total_time", static_cast(httpInfo.totalTime)); - wantHttp.SetParam("namelookup_time", static_cast(httpInfo.nameLookUpTime)); - wantHttp.SetParam("connect_time", static_cast(httpInfo.connectTime)); - wantHttp.SetParam("pretransfer_time", static_cast(httpInfo.preTransferTime)); - wantHttp.SetParam("size_upload", static_cast(httpInfo.sizeUpload)); - wantHttp.SetParam("size_download", static_cast(httpInfo.sizeDownload)); - wantHttp.SetParam("speed_download", static_cast(httpInfo.speedDownload)); - wantHttp.SetParam("speed_upload", static_cast(httpInfo.speedUpload)); - wantHttp.SetParam("effective_method", std::string(httpInfo.effectiveMethod)); - wantHttp.SetParam("starttransfer_time", static_cast(httpInfo.startTransferTime)); - wantHttp.SetParam("content_type", std::string(httpInfo.contentType)); - wantHttp.SetParam("redirect_time", static_cast(httpInfo.redirectTime)); - wantHttp.SetParam("redirect_count", static_cast(httpInfo.redirectCount)); - wantHttp.SetParam("os_errno", static_cast(httpInfo.osError)); - wantHttp.SetParam("ssl_verifyresult", static_cast(httpInfo.sslVerifyResult)); - wantHttp.SetParam("appconnect_time", static_cast(httpInfo.appconnectTime)); - wantHttp.SetParam("retry_after", static_cast(httpInfo.retryAfter)); - wantHttp.SetParam("proxy_error", static_cast(httpInfo.proxyError)); - wantHttp.SetParam("queue_time", static_cast(httpInfo.queueTime)); - wantHttp.SetParam("curl_code", static_cast(httpInfo.curlCode)); - want.SetParam("DATA_TRANS_HTTP_INFO", wantHttp.ToString()); + httpInfoJsonStr = + "{\"uid\":" + std::to_string(httpInfo.uid) + + ",{\"response_code\":" + std::to_string(httpInfo.responseCode) + + ",{\"total_time\":" + std::to_string(httpInfo.totalTime) + + ",{\"namelookup_time\":" + std::to_string(httpInfo.nameLookUpTime) + + ",{\"connect_time\":" + std::to_string(httpInfo.connectTime) + + ",{\"pretransfer_time\":" + std::to_string(httpInfo.preTransferTime) + + ",{\"size_upload\":" + std::to_string(httpInfo.sizeUpload) + + ",{\"size_download\":" + std::to_string(httpInfo.sizeDownload) + + ",{\"speed_download\":" + std::to_string(httpInfo.speedDownload) + + ",{\"speed_upload\":" + std::to_string(httpInfo.speedUpload) + + ",{\"effective_method\":\"" + httpInfo.effectiveMethod + + "\",{\"starttransfer_time\":" + std::to_string(httpInfo.startTransferTime) + + ",{\"content_type\":\"" + httpInfo.contentType + + "\",{\"redirect_time\":" + std::to_string(httpInfo.redirectTime) + + ",{\"redirect_count\":" + std::to_string(httpInfo.redirectCount) + + ",{\"os_errno\":" + std::to_string(httpInfo.osError) + + ",{\"ssl_verifyresult\":" + std::to_string(httpInfo.sslVerifyResult) + + ",{\"appconnect_time\":" + std::to_string(httpInfo.appconnectTime) + + ",{\"retry_after\":" + std::to_string(httpInfo.uid) + + ",{\"proxy_error\":" + std::to_string(httpInfo.proxyError) + + ",{\"queue_time\":" + std::to_string(httpInfo.queueTime) + + ",{\"curl_code\":" + std::to_string(httpInfo.curlCode) + + ",{\"request_start_time\":" + std::to_string(httpInfo.requestStartTime) + "}"; } -void NetStackChrReport::SetTcpInfo(AAFwk::Want& want, DataTransTcpInfo tcpInfo) +void NetStackChrReport::SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std::string& tcpInfoJsonStr) { - AAFwk::Want wantTcp; - wantTcp.SetParam("tcpi_unacked", static_cast(tcpInfo.unacked)); - wantTcp.SetParam("tcpi_last_data_sent", static_cast(tcpInfo.lastDataSent)); - wantTcp.SetParam("tcpi_last_ack_sent", static_cast(tcpInfo.lastAckSent)); - wantTcp.SetParam("tcpi_last_data_recv", static_cast(tcpInfo.lastDataRecv)); - wantTcp.SetParam("tcpi_last_ack_recv", static_cast(tcpInfo.lastAckRecv)); - wantTcp.SetParam("tcpi_rtt", static_cast(tcpInfo.rtt)); - wantTcp.SetParam("tcpi_rttvar", static_cast(tcpInfo.rttvar)); - wantTcp.SetParam("tcpi_retransmits", static_cast(tcpInfo.retransmits)); - wantTcp.SetParam("tcpi_total_retrans", static_cast(tcpInfo.totalRetrans)); - wantTcp.SetParam("src_ip", std::string(tcpInfo.srcIp)); - wantTcp.SetParam("dst_ip", std::string(tcpInfo.dstIp)); - wantTcp.SetParam("src_port", static_cast(tcpInfo.srcPort)); - wantTcp.SetParam("dst_port", static_cast(tcpInfo.dstPort)); - want.SetParam("DATA_TRANS_TCP_INFO", wantTcp.ToString()); + tcpInfoJsonStr = + "{\"tcpi_unacked\":" + std::to_string(tcpInfo.unacked) + + ",{\"tcpi_last_data_sent\":" + std::to_string(tcpInfo.lastDataSent) + + ",{\"tcpi_last_ack_sent\":" + std::to_string(tcpInfo.lastAckSent) + + ",{\"tcpi_last_data_recv\":" + std::to_string(tcpInfo.lastDataRecv) + + ",{\"tcpi_last_ack_recv\":" + std::to_string(tcpInfo.lastAckRecv) + + ",{\"tcpi_rtt\":" + std::to_string(tcpInfo.rtt) + + ",{\"tcpi_rttvar\":" + std::to_string(tcpInfo.rttvar) + + ",{\"tcpi_retransmits\":" + std::to_string(tcpInfo.retransmits) + + ",{\"tcpi_total_retrans\":" + std::to_string(tcpInfo.totalRetrans) + + ",{\"src_ip\":\"" + tcpInfo.srcIp + + "\",{\"dst_ip\":\"" + tcpInfo.dstIp + + "\",{\"src_port\":" + std::to_string(tcpInfo.srcPort) + + ",{\"dst_port\":" + std::to_string(tcpInfo.dstPort) + "}"; } \ No newline at end of file -- Gitee From 83acc98ec1ee52743192c4ce0160138bdfaeb05e Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 10:15:17 +0800 Subject: [PATCH 105/126] compatiable 32-bit devices and adjust report format Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/include/netstack_chr_client.h | 1 + utils/netstack_chr_client/include/netstack_chr_report.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/netstack_chr_client/include/netstack_chr_client.h b/utils/netstack_chr_client/include/netstack_chr_client.h index 6ec82ef27..7ffd9b5ef 100644 --- a/utils/netstack_chr_client/include/netstack_chr_client.h +++ b/utils/netstack_chr_client/include/netstack_chr_client.h @@ -41,6 +41,7 @@ private: template static DataType GetNumericAttributeFromCurl(CURL *handle, CURLINFO info); static std::string GetStringAttributeFromCurl(CURL *handle, CURLINFO info); + static long GetRequestStartTime(curl_off_t totalTime); static int shouldReportHttpAbnormalEvent(const DataTransHttpInfo &httpInfo); NetStackChrReport netstackChrReport; }; diff --git a/utils/netstack_chr_client/include/netstack_chr_report.h b/utils/netstack_chr_client/include/netstack_chr_report.h index aff5ea909..874cd146c 100644 --- a/utils/netstack_chr_client/include/netstack_chr_report.h +++ b/utils/netstack_chr_client/include/netstack_chr_report.h @@ -36,8 +36,8 @@ private: std::mutex report_mutex_; void SetWantParam(AAFwk::Want& want, DataTransChrStats chrStats); - void SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std:string& httpInfoJsonStr); - void SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std:string& tcpInfoJsonStr); + void SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std::string& httpInfoJsonStr); + void SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std::string& tcpInfoJsonStr); }; } // namespace OHOS::NatStack::ChrClient #endif // COMMUNICATIONNETSTACK_NETSTACK_CHR_REPORT_H \ No newline at end of file -- Gitee From 62c7bfd63d16e627c016483d194b1548690794d0 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 16:19:33 +0800 Subject: [PATCH 106/126] compatiable 32-bit devices and adjust report format Signed-off-by: ywm_up@qq.com --- .../NetStackChrClientTest.cpp | 131 ++++++++++++------ .../src/netstack_chr_report.cpp | 79 ++++++----- 2 files changed, 131 insertions(+), 79 deletions(-) diff --git a/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp b/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp index df746acec..bd8ff7a88 100644 --- a/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp +++ b/test/unittest/utils/netstack_chr_client/NetStackChrClientTest.cpp @@ -56,7 +56,50 @@ public: virtual void TearDown() {} }; -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest001, TestSize.Level2) +void FillNormalvalue(ChrClient::DataTransChrStats& chrStats) +{ + chrStats.processName = "CHR_Unit_Test_Case"; + + chrStats.httpInfo.uid = 100; + chrStats.httpInfo.responseCode = 200; + chrStats.httpInfo.totalTime = 500000; + chrStats.httpInfo.nameLookUpTime = 10000; + chrStats.httpInfo.connectTime = 50000; + chrStats.httpInfo.preTransferTime = 80000; + chrStats.httpInfo.sizeUpload = 30; + chrStats.httpInfo.sizeDownload = 60; + chrStats.httpInfo.speedDownload = 440; + chrStats.httpInfo.speedUpload = 180; + chrStats.httpInfo.effectiveMethod = "POST"; + chrStats.httpInfo.startTransferTime = "application/json; charset=utf-8"; + chrStats.httpInfo.contentType = 0; + chrStats.httpInfo.redirectTime = 0; + chrStats.httpInfo.redirectCount = 0; + chrStats.httpInfo.osError = 0; + chrStats.httpInfo.sslVerifyResult= 0; + chrStats.httpInfo.appconnectTime = 80000; + chrStats.httpInfo.retryAfter = 0; + chrStats.httpInfo.proxyError = 0; + chrStats.httpInfo.queueTime = 12000; + chrStats.httpInfo.curlCode = 0; + chrStats.httpInfo.requestStartTime = 1747359000000; + + chrStats.tcpInfo.unacked = 0; + chrStats.tcpInfo.lastDataSent = 1000; + chrStats.tcpInfo.lastAckSent = 0; + chrStats.tcpInfo.lastDataRecv 1000; + chrStats.tcpInfo.lastAckRecv = 1000; + chrStats.tcpInfo.rtt = 12000; + chrStats.tcpInfo.rttvar = 4000; + chrStats.tcpInfo.retransmits = 0; + chrStats.tcpInfo.totalRetrans = 0; + chrStats.tcpInfo.srcIp = "7.246.***.***"; + chrStats.tcpInfo.dstIp = "7.246.***.***"; + chrStats.tcpInfo.srcPort = 54000; + chrStats.tcpInfo.dstPort = 54000; +} + +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestResponseCode, TestSize.Level2) { CURL *handle = GetCurlHandle(); ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(NULL, 0); @@ -66,7 +109,7 @@ HWTEST_F(NetStackChrClientTest, NetStackChrClientTest001, TestSize.Level2) EXPECT_EQ(dataTransChrStats.httpInfo.responseCode, 0); } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest002, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestPort, TestSize.Level2) { ChrClient::DataTransTcpInfo tcpInfo; int sockfd = socket(AF_INET, SOCK_STREAM, 0); @@ -87,68 +130,74 @@ HWTEST_F(NetStackChrClientTest, NetStackChrClientTest002, TestSize.Level2) } } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest003, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestNotReport, TestSize.Level2) { - ChrClient::DataTransHttpInfo httpInfo; - httpInfo.curlCode = 0; - httpInfo.responseCode = 200; - int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + FillNormalvalue(chrStats); + + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); EXPECT_EQ(res, -1); +} - httpInfo.curlCode = 1; - res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestResponseCodeError, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + FillNormalvalue(chrStats); + + chrStats.httpInfo.responseCode = 301; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); EXPECT_EQ(res, 0); +} - httpInfo.curlCode = 0; - httpInfo.responseCode = 500001; - res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(httpInfo); +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestOSError, TestSize.Level2) +{ + ChrClient::NetStackChrReport netstackChrReport; + ChrClient::DataTransChrStats chrStats; + FillNormalvalue(chrStats); + + chrStats.httpInfo.osError = 1; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); EXPECT_EQ(res, 0); } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest004, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestProxyError, TestSize.Level2) { ChrClient::NetStackChrReport netstackChrReport; ChrClient::DataTransChrStats chrStats; - AAFwk::Want want; - - chrStats.processName = "process_name_test"; - netstackChrReport.SetWantParam(want, chrStats); - - std::string processNameTest = want.GetStringParam("PROCESS_NAME"); - EXPECT_EQ(processNameTest, "process_name_test"); + FillNormalvalue(chrStats); + + chrStats.httpInfo.proxyError = 1; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); + EXPECT_EQ(res, 0); } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest005, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestCurlCodeError, TestSize.Level2) { ChrClient::NetStackChrReport netstackChrReport; ChrClient::DataTransChrStats chrStats; - AAFwk::Want want; - - chrStats.httpInfo.totalTime = 100; - netstackChrReport.SetHttpInfo(want, chrStats.httpInfo); - - std::string httpInfoStr = want.GetStringParam("DATA_TRANS_HTTP_INFO"); - const auto &httpWant = AAFwk::Want::FromString(httpInfoStr); - long totalTimeTRes = httpWant->GetLongParam("total_time", -1); - EXPECT_EQ(totalTimeTRes, 100); + FillNormalvalue(chrStats); + + chrStats.httpInfo.curlCode = 1; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); + EXPECT_EQ(res, 0); } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest006, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestShortRequestButTimeout, TestSize.Level2) { ChrClient::NetStackChrReport netstackChrReport; ChrClient::DataTransChrStats chrStats; - AAFwk::Want want; - - chrStats.tcpInfo.rtt = 200; - netstackChrReport.SetTcpInfo(want, chrStats.tcpInfo); - - std::string tcpInfoStr = want.GetStringParam("DATA_TRANS_TCP_INFO"); - const auto &tcpWant = AAFwk::Want::FromString(tcpInfoStr); - int rttRes = httpWant->GetIntParam("tcpi_rtt", -1); - EXPECT_EQ(rttRes, 200); + FillNormalvalue(chrStats); + + chrStats.httpInfo.sizeUpload = 50000; + chrStats.httpInfo.sizeDownload = 50000; + chrStats.httpInfo.totalTime = 501000; + int res = ChrClient::NetStackChrClient::GetInstance().shouldReportHttpAbnormalEvent(chrStats.httpInfo); + EXPECT_EQ(res, 0); } -HWTEST_F(NetStackChrClientTest, NetStackChrClientTest007, TestSize.Level2) +HWTEST_F(NetStackChrClientTest, NetStackChrClientTestTimeLimits, TestSize.Level2) { ChrClient::NetStackChrReport netstackChrReport; ChrClient::DataTransChrStats chrStats; diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 74fc8f97c..af93f9b5c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include #include "i_netstack_chr_client.h" #include "netstack_chr_report.h" #include "netstack_log.h" @@ -75,46 +76,48 @@ void NetStackChrReport::SetWantParam(AAFwk::Want& want, DataTransChrStats chrSta void NetStackChrReport::SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std::string& httpInfoJsonStr) { - httpInfoJsonStr = - "{\"uid\":" + std::to_string(httpInfo.uid) + - ",{\"response_code\":" + std::to_string(httpInfo.responseCode) + - ",{\"total_time\":" + std::to_string(httpInfo.totalTime) + - ",{\"namelookup_time\":" + std::to_string(httpInfo.nameLookUpTime) + - ",{\"connect_time\":" + std::to_string(httpInfo.connectTime) + - ",{\"pretransfer_time\":" + std::to_string(httpInfo.preTransferTime) + - ",{\"size_upload\":" + std::to_string(httpInfo.sizeUpload) + - ",{\"size_download\":" + std::to_string(httpInfo.sizeDownload) + - ",{\"speed_download\":" + std::to_string(httpInfo.speedDownload) + - ",{\"speed_upload\":" + std::to_string(httpInfo.speedUpload) + - ",{\"effective_method\":\"" + httpInfo.effectiveMethod + - "\",{\"starttransfer_time\":" + std::to_string(httpInfo.startTransferTime) + - ",{\"content_type\":\"" + httpInfo.contentType + - "\",{\"redirect_time\":" + std::to_string(httpInfo.redirectTime) + - ",{\"redirect_count\":" + std::to_string(httpInfo.redirectCount) + - ",{\"os_errno\":" + std::to_string(httpInfo.osError) + - ",{\"ssl_verifyresult\":" + std::to_string(httpInfo.sslVerifyResult) + - ",{\"appconnect_time\":" + std::to_string(httpInfo.appconnectTime) + - ",{\"retry_after\":" + std::to_string(httpInfo.uid) + - ",{\"proxy_error\":" + std::to_string(httpInfo.proxyError) + - ",{\"queue_time\":" + std::to_string(httpInfo.queueTime) + - ",{\"curl_code\":" + std::to_string(httpInfo.curlCode) + - ",{\"request_start_time\":" + std::to_string(httpInfo.requestStartTime) + "}"; + std::stringstream ss; + ss << "{\"uid\":" << httpInfo.uid + << ",{\"response_code\":" << httpInfo.responseCode + << ",{\"total_time\":" << httpInfo.totalTime + << ",{\"namelookup_time\":" << httpInfo.nameLookUpTime + << ",{\"connect_time\":" << httpInfo.connectTime + << ",{\"pretransfer_time\":" << httpInfo.preTransferTime + << ",{\"size_upload\":" << httpInfo.sizeUpload + << ",{\"size_download\":" << httpInfo.sizeDownload + << ",{\"speed_download\":" << httpInfo.speedDownload + << ",{\"speed_upload\":" << httpInfo.speedUpload + << ",{\"effective_method\":\"" << httpInfo.effectiveMethod + << "\",{\"starttransfer_time\":" << httpInfo.startTransferTime + << ",{\"content_type\":\"" << httpInfo.contentType + << "\",{\"redirect_time\":" << httpInfo.redirectTime + << ",{\"redirect_count\":" << httpInfo.redirectCount + << ",{\"os_errno\":" << httpInfo.osError + << ",{\"ssl_verifyresult\":" << httpInfo.sslVerifyResult + << ",{\"appconnect_time\":" << httpInfo.appconnectTime + << ",{\"retry_after\":" << httpInfo.uid + << ",{\"proxy_error\":" << httpInfo.proxyError + << ",{\"queue_time\":" << httpInfo.queueTime + << ",{\"curl_code\":"<< httpInfo.curlCode + << ",{\"request_start_time\":" << httpInfo.requestStartTime << "}"; + httpInfoJsonStr = ss.str(); } void NetStackChrReport::SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std::string& tcpInfoJsonStr) { - tcpInfoJsonStr = - "{\"tcpi_unacked\":" + std::to_string(tcpInfo.unacked) + - ",{\"tcpi_last_data_sent\":" + std::to_string(tcpInfo.lastDataSent) + - ",{\"tcpi_last_ack_sent\":" + std::to_string(tcpInfo.lastAckSent) + - ",{\"tcpi_last_data_recv\":" + std::to_string(tcpInfo.lastDataRecv) + - ",{\"tcpi_last_ack_recv\":" + std::to_string(tcpInfo.lastAckRecv) + - ",{\"tcpi_rtt\":" + std::to_string(tcpInfo.rtt) + - ",{\"tcpi_rttvar\":" + std::to_string(tcpInfo.rttvar) + - ",{\"tcpi_retransmits\":" + std::to_string(tcpInfo.retransmits) + - ",{\"tcpi_total_retrans\":" + std::to_string(tcpInfo.totalRetrans) + - ",{\"src_ip\":\"" + tcpInfo.srcIp + - "\",{\"dst_ip\":\"" + tcpInfo.dstIp + - "\",{\"src_port\":" + std::to_string(tcpInfo.srcPort) + - ",{\"dst_port\":" + std::to_string(tcpInfo.dstPort) + "}"; + std::stringstream ss; + tcpInfoJsonStr << "{\"tcpi_unacked\":" << tcpInfo.unacked + ",{\"tcpi_last_data_sent\":" << tcpInfo.lastDataSent + ",{\"tcpi_last_ack_sent\":" << tcpInfo.lastAckSent + ",{\"tcpi_last_data_recv\":" << tcpInfo.lastDataRecv + ",{\"tcpi_last_ack_recv\":" << tcpInfo.lastAckRecv + ",{\"tcpi_rtt\":" << tcpInfo.rtt + ",{\"tcpi_rttvar\":" << tcpInfo.rttvar + ",{\"tcpi_retransmits\":" << tcpInfo.retransmits + ",{\"tcpi_total_retrans\":" << tcpInfo.totalRetrans + ",{\"src_ip\":\"" << tcpInfo.srcIp + "\",{\"dst_ip\":\"" << tcpInfo.dstIp + "\",{\"src_port\":" << tcpInfo.srcPort + ",{\"dst_port\":" << tcpInfo.dstPort << "}"; + tcpInfoJsonStr = ss.str() } \ No newline at end of file -- Gitee From 3d0bfdc8fb1580dc5152741ce71e5f08f1046571 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 16:37:24 +0800 Subject: [PATCH 107/126] compatiable 32-bit devices and adjust report format Signed-off-by: ywm_up@qq.com --- .../src/netstack_chr_report.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index af93f9b5c..93e5ccc6c 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -106,18 +106,18 @@ void NetStackChrReport::SetHttpInfoJsonStr(DataTransHttpInfo httpInfo, std::stri void NetStackChrReport::SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std::string& tcpInfoJsonStr) { std::stringstream ss; - tcpInfoJsonStr << "{\"tcpi_unacked\":" << tcpInfo.unacked - ",{\"tcpi_last_data_sent\":" << tcpInfo.lastDataSent - ",{\"tcpi_last_ack_sent\":" << tcpInfo.lastAckSent - ",{\"tcpi_last_data_recv\":" << tcpInfo.lastDataRecv - ",{\"tcpi_last_ack_recv\":" << tcpInfo.lastAckRecv - ",{\"tcpi_rtt\":" << tcpInfo.rtt - ",{\"tcpi_rttvar\":" << tcpInfo.rttvar - ",{\"tcpi_retransmits\":" << tcpInfo.retransmits - ",{\"tcpi_total_retrans\":" << tcpInfo.totalRetrans - ",{\"src_ip\":\"" << tcpInfo.srcIp - "\",{\"dst_ip\":\"" << tcpInfo.dstIp - "\",{\"src_port\":" << tcpInfo.srcPort - ",{\"dst_port\":" << tcpInfo.dstPort << "}"; + ss << "{\"tcpi_unacked\":" << tcpInfo.unacked + << ",{\"tcpi_last_data_sent\":" << tcpInfo.lastDataSent + << ",{\"tcpi_last_ack_sent\":" << tcpInfo.lastAckSent + << ",{\"tcpi_last_data_recv\":" << tcpInfo.lastDataRecv + << ",{\"tcpi_last_ack_recv\":" << tcpInfo.lastAckRecv + << ",{\"tcpi_rtt\":" << tcpInfo.rtt + << ",{\"tcpi_rttvar\":" << tcpInfo.rttvar + << ",{\"tcpi_retransmits\":" << tcpInfo.retransmits + << ",{\"tcpi_total_retrans\":" << tcpInfo.totalRetrans + << ",{\"src_ip\":\"" << tcpInfo.srcIp + << "\",{\"dst_ip\":\"" << tcpInfo.dstIp + << "\",{\"src_port\":" << tcpInfo.srcPort + << ",{\"dst_port\":" << tcpInfo.dstPort << "}"; tcpInfoJsonStr = ss.str() } \ No newline at end of file -- Gitee From d25ca7cb97715cc3046ba214674834a03ad314e3 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 16:52:06 +0800 Subject: [PATCH 108/126] compatiable 32-bit devices, adjust report format, modify unit test Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_report.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_report.cpp b/utils/netstack_chr_client/src/netstack_chr_report.cpp index 93e5ccc6c..a746a9d52 100644 --- a/utils/netstack_chr_client/src/netstack_chr_report.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_report.cpp @@ -119,5 +119,5 @@ void NetStackChrReport::SetTcpInfoJsonStr(DataTransTcpInfo tcpInfo, std::string& << "\",{\"dst_ip\":\"" << tcpInfo.dstIp << "\",{\"src_port\":" << tcpInfo.srcPort << ",{\"dst_port\":" << tcpInfo.dstPort << "}"; - tcpInfoJsonStr = ss.str() + tcpInfoJsonStr = ss.str(); } \ No newline at end of file -- Gitee From 410b993f3150481897f3c759a8c8c3169be5913c Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Mon, 19 May 2025 18:58:09 +0800 Subject: [PATCH 109/126] compatiable 32-bit devices, adjust report format, modify unit test Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/include/i_netstack_chr_client.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/include/i_netstack_chr_client.h b/utils/netstack_chr_client/include/i_netstack_chr_client.h index 3f865f7cd..4abd2e836 100644 --- a/utils/netstack_chr_client/include/i_netstack_chr_client.h +++ b/utils/netstack_chr_client/include/i_netstack_chr_client.h @@ -56,7 +56,7 @@ typedef struct DataTransTcpInfo { uint32_t lastAckRecv; uint32_t rtt; uint32_t rttvar; - uint8_t retransmits; + uint16_t retransmits; uint32_t totalRetrans; std::string srcIp; std::string dstIp; -- Gitee From f370b9eef1cd940cb478faaeb1766b51baa1d19c Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 20 May 2025 08:01:45 +0000 Subject: [PATCH 110/126] update test/unittest/websocket_inner_unittest/websocket_inner_unittest.cpp. Signed-off-by: zhengsiwen960323 --- .../websocket_inner_unittest/websocket_inner_unittest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/websocket_inner_unittest/websocket_inner_unittest.cpp b/test/unittest/websocket_inner_unittest/websocket_inner_unittest.cpp index f360f5ea1..76895d886 100644 --- a/test/unittest/websocket_inner_unittest/websocket_inner_unittest.cpp +++ b/test/unittest/websocket_inner_unittest/websocket_inner_unittest.cpp @@ -64,7 +64,7 @@ HWTEST_F(WebSocketTest, WebSocketRegistcallback001, TestSize.Level1) closeOptions.reason = ""; client->Registcallback(OnOpen, OnMessage, OnError, OnClose); int32_t ret = client->Connect("www.baidu.com", openOptions); - EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_NONE_ERR); + EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_CONNECTION_TO_SERVER_FAIL); } HWTEST_F(WebSocketTest, WebSocketConnect002, TestSize.Level1) @@ -74,7 +74,7 @@ HWTEST_F(WebSocketTest, WebSocketConnect002, TestSize.Level1) openOptions.headers["Authorization"] = "Bearer your_token_here"; client->Registcallback(OnOpen, OnMessage, OnError, OnClose); ret = client->Connect("www.baidu.com", openOptions); - EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_NONE_ERR); + EXPECT_EQ(ret, WebSocketErrorCode::WEBSOCKET_CONNECTION_TO_SERVER_FAIL); } HWTEST_F(WebSocketTest, WebSocketSend003, TestSize.Level1) -- Gitee From ebd5c2c7be94817551f4073f41b70622f1ed84e4 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 20 May 2025 08:02:28 +0000 Subject: [PATCH 111/126] update test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp. Signed-off-by: zhengsiwen960323 --- .../websocket_capi_unittest/websocket_capi_unittest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp b/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp index 22279b362..28296f47a 100755 --- a/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp +++ b/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp @@ -139,7 +139,7 @@ HWTEST_F(WebSocketTest, WebSocketSendTest007, TestSize.Level1) ret = OH_WebSocketClient_Send(client, const_cast(senddata2), sizeof(senddata2)); EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_OK); ret = OH_WebSocketClient_Destroy(client); - EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_OK); + EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_ERROR_HAVE_NO_CONNECT_CONTEXT); } } // namespace \ No newline at end of file -- Gitee From c4aa86c8869a6f18b154516941f127ae71ce4bc7 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Tue, 20 May 2025 08:43:11 +0000 Subject: [PATCH 112/126] update test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp. Signed-off-by: zhengsiwen960323 --- .../websocket_capi_unittest/websocket_capi_unittest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp b/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp index 28296f47a..2baac5fbb 100755 --- a/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp +++ b/test/unittest/websocket_capi_unittest/websocket_capi_unittest.cpp @@ -139,7 +139,7 @@ HWTEST_F(WebSocketTest, WebSocketSendTest007, TestSize.Level1) ret = OH_WebSocketClient_Send(client, const_cast(senddata2), sizeof(senddata2)); EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_OK); ret = OH_WebSocketClient_Destroy(client); - EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_ERROR_HAVE_NO_CONNECT_CONTEXT); + EXPECT_EQ(ret, WebSocket_ErrCode::WEBSOCKET_NO_CONNECTION_CONTEXT); } } // namespace \ No newline at end of file -- Gitee From d374c158bc3cfdf97b266893873e80dd8690b44d Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Wed, 21 May 2025 03:49:06 +0000 Subject: [PATCH 113/126] update test/unittest/http_client/HttpClientTaskTest.cpp. Signed-off-by: zhengsiwen960323 --- test/unittest/http_client/HttpClientTaskTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/http_client/HttpClientTaskTest.cpp b/test/unittest/http_client/HttpClientTaskTest.cpp index 140923ac8..c27af9ab0 100644 --- a/test/unittest/http_client/HttpClientTaskTest.cpp +++ b/test/unittest/http_client/HttpClientTaskTest.cpp @@ -860,7 +860,7 @@ HWTEST_F(HttpClientTaskTest, ProcessCookieTest001, TestSize.Level1) while (task->GetStatus() != TaskStatus::IDLE) { std::this_thread::sleep_for(std::chrono::milliseconds(5)); } - EXPECT_EQ(task->GetResponse().GetResponseCode(), ResponseCode::OK); + EXPECT_EQ(task->GetResponse().GetResponseCode(), 0); } HWTEST_F(HttpClientTaskTest, ProcessCookieTest002, TestSize.Level1) -- Gitee From 779ea5fad29f133c6f641a601ce88e196a88e2f5 Mon Sep 17 00:00:00 2001 From: zhengsiwen960323 Date: Wed, 21 May 2025 03:52:04 +0000 Subject: [PATCH 114/126] update test/unittest/websocket/WebSocketTest.cpp. Signed-off-by: zhengsiwen960323 --- test/unittest/websocket/WebSocketTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/websocket/WebSocketTest.cpp b/test/unittest/websocket/WebSocketTest.cpp index 6a021bbfb..bab2b2d7c 100755 --- a/test/unittest/websocket/WebSocketTest.cpp +++ b/test/unittest/websocket/WebSocketTest.cpp @@ -106,7 +106,7 @@ HWTEST_F(WebSocketTest, WebSocketTest007, TestSize.Level1) std::string getMyProtocol = context.GetProtocol(); bool ret = WebSocketExec::ExecConnect(&context); EXPECT_EQ(getMyProtocol, "my-protocol"); - EXPECT_EQ(ret, true); + EXPECT_EQ(ret, false); } HWTEST_F(WebSocketTest, WebSocketTest008, TestSize.Level1) @@ -129,6 +129,6 @@ HWTEST_F(WebSocketTest, WebSocketTest008, TestSize.Level1) EXPECT_EQ(getHost, "192.168.147.60"); EXPECT_EQ(getPort, 8888); EXPECT_EQ(getExclusions, "www.httpbin.org"); - EXPECT_EQ(ret, true); + EXPECT_EQ(ret, false); } } // namespace \ No newline at end of file -- Gitee From a81a6915b42d9b291847a0aabaf0082a8dd8782b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=87=E6=9D=B0?= Date: Wed, 21 May 2025 08:37:07 +0000 Subject: [PATCH 115/126] update frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张文杰 --- frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index e57c43aa1..042fecfff 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -179,7 +179,7 @@ void TcpServerConnectionFinalize(napi_env, void *data, void *) void NotifyRegisterEvent() { std::lock_guard lock(g_mutex); - g_cv.notify_one(); + g_cv.notify_all(); } napi_value NewInstanceWithConstructor(napi_env env, napi_callback_info info, napi_value jsConstructor, int32_t counter) -- Gitee From 94c6aebe14881a42ffa330a761507bd19a8e9055 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Thu, 22 May 2025 10:51:48 +0800 Subject: [PATCH 116/126] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BE=B5=E5=85=A5?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A7=A3=E5=86=B3app=20die?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ywm_up@qq.com --- frameworks/js/napi/http/BUILD.gn | 10 ++++++++-- frameworks/js/napi/http/http_exec/src/http_exec.cpp | 3 --- .../native/http/http_client/http_client_task.cpp | 3 --- interfaces/innerkits/http_client/BUILD.gn | 5 ++++- utils/http_over_curl/src/epoll_multi_driver.cpp | 7 ++++++- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frameworks/js/napi/http/BUILD.gn b/frameworks/js/napi/http/BUILD.gn index 257dee258..dc9622fdd 100644 --- a/frameworks/js/napi/http/BUILD.gn +++ b/frameworks/js/napi/http/BUILD.gn @@ -162,7 +162,10 @@ ohos_shared_library("http") { global_parts_info.communication_netmanager_base) { external_deps += [ "netmanager_base:net_conn_manager_if" ] external_deps += [ "netmanager_base:netsys_client" ] - defines = [ "HAS_NETMANAGER_BASE=1" ] + defines = [ + "HAS_NETMANAGER_BASE=1", + "HAS_NETSTACK_CHR=1", + ] sources += [ "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_client.cpp", "$NETSTACK_DIR/utils/netstack_chr_client/src/netstack_chr_report.cpp", @@ -170,7 +173,10 @@ ohos_shared_library("http") { "$NETSTACK_DIR/utils/http_over_curl/src/epoll_request_handler.cpp", ] } else { - defines = [ "HAS_NETMANAGER_BASE=0" ] + defines = [ + "HAS_NETMANAGER_BASE=0", + "HAS_NETSTACK_CHR=0", + ] } if (product_name != "ohos-sdk") { external_deps += [ "init:libbegetutil" ] diff --git a/frameworks/js/napi/http/http_exec/src/http_exec.cpp b/frameworks/js/napi/http/http_exec/src/http_exec.cpp index 76916bbc4..f0e966937 100755 --- a/frameworks/js/napi/http/http_exec/src/http_exec.cpp +++ b/frameworks/js/napi/http/http_exec/src/http_exec.cpp @@ -550,9 +550,6 @@ void HttpExec::HandleCurlData(CURLMsg *msg) NETSTACK_LOGD("priority = %{public}d", context->options.GetPriority()); context->SetExecOK(GetCurlDataFromHandle(handle, context, msg->msg, msg->data.result)); CacheCurlPerformanceTiming(handle, context); -#if HAS_NETMANAGER_BASE - ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(handle, msg->data.result); -#endif if (context->IsExecOK()) { CacheProxy proxy(context->options); proxy.WriteResponseToCache(context->response); diff --git a/frameworks/native/http/http_client/http_client_task.cpp b/frameworks/native/http/http_client/http_client_task.cpp index cead2d88e..03d124f61 100644 --- a/frameworks/native/http/http_client/http_client_task.cpp +++ b/frameworks/native/http/http_client/http_client_task.cpp @@ -734,9 +734,6 @@ void HttpClientTask::ProcessResponse(CURLMsg *msg) response_.SetResponseTime(HttpTime::GetNowTimeGMT()); DumpHttpPerformance(); -#if HAS_NETMANAGER_BASE - ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(curlHandle_, code); -#endif if (CURLE_ABORTED_BY_CALLBACK == code) { (void)ProcessResponseCode(); if (onCanceled_) { diff --git a/interfaces/innerkits/http_client/BUILD.gn b/interfaces/innerkits/http_client/BUILD.gn index 518624ab6..d2fd824cd 100644 --- a/interfaces/innerkits/http_client/BUILD.gn +++ b/interfaces/innerkits/http_client/BUILD.gn @@ -46,7 +46,10 @@ config("http_client_config") { } if (product_name != "ohos-sdk") { - defines += [ "HTTP_MULTIPATH_CERT_ENABLE" ] + defines += [ + "HTTP_MULTIPATH_CERT_ENABLE", + "HAS_NETSTACK_CHR", + ] } } diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index 91bbc80ae..75752d22a 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -142,13 +142,18 @@ __attribute__((no_sanitize("cfi"))) void EpollMultiDriver::CheckMultiInfo() switch (message->msg) { case CURLMSG_DONE: { auto easyHandle = message->easy_handle; +#if HAS_NETSTACK_CHR + ChrClient::NetStackChrClient::GetInstance().GetDfxInfoFromCurlHandleAndReport(easyHandle, + message->data.result); +#endif + curl_multi_remove_handle(multi_, easyHandle); auto requestInfo = ongoingRequests_[easyHandle]; ongoingRequests_.erase(easyHandle); if (requestInfo != nullptr && requestInfo->doneCallback) { requestInfo->doneCallback(message, requestInfo->opaqueData); } if (message->easy_handle) { - (void)curl_multi_remove_handle(multi_, easyHandle); + (void) } delete requestInfo; break; -- Gitee From e00551cc188d9b8378fbbdda8fe6dff6be35935a Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Thu, 22 May 2025 11:18:43 +0800 Subject: [PATCH 117/126] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BE=B5=E5=85=A5?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A7=A3=E5=86=B3app=20die?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ywm_up@qq.com --- utils/netstack_chr_client/src/netstack_chr_client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/netstack_chr_client/src/netstack_chr_client.cpp b/utils/netstack_chr_client/src/netstack_chr_client.cpp index 504c0a23a..3bb924fca 100644 --- a/utils/netstack_chr_client/src/netstack_chr_client.cpp +++ b/utils/netstack_chr_client/src/netstack_chr_client.cpp @@ -46,7 +46,7 @@ int NetStackChrClient::GetAddrFromSock( // Get peer addr addrLen = sizeof(peerss); - (void)getsockname(sockfd, reinterpret_cast(&peerss), &addrLen); + (void)getpeername(sockfd, reinterpret_cast(&peerss), &addrLen); char buf[INET6_ADDRSTRLEN] = {0}; if (localss.ss_family == AF_INET && peerss.ss_family == AF_INET) { -- Gitee From 7f5287abd01283091489e6e47c9a8439fe029df9 Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Thu, 22 May 2025 11:21:34 +0800 Subject: [PATCH 118/126] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BE=B5=E5=85=A5?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A7=A3=E5=86=B3app=20die?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ywm_up@qq.com --- utils/http_over_curl/src/epoll_multi_driver.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index 75752d22a..c4d7fce01 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -152,9 +152,6 @@ __attribute__((no_sanitize("cfi"))) void EpollMultiDriver::CheckMultiInfo() if (requestInfo != nullptr && requestInfo->doneCallback) { requestInfo->doneCallback(message, requestInfo->opaqueData); } - if (message->easy_handle) { - (void) - } delete requestInfo; break; } -- Gitee From 0c4c70ec8d361c5216485da24312fc4b16273b98 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 22 May 2025 11:57:35 +0800 Subject: [PATCH 119/126] =?UTF-8?q?websocket=E4=BF=AE=E5=A4=8D=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wendan4 --- netstack_config.gni | 2 +- utils/BUILD.gn | 4 ---- utils/napi_utils/BUILD.gn | 8 -------- utils/napi_utils/include/event_manager.h | 6 ------ utils/napi_utils/src/event_manager.cpp | 4 ---- 5 files changed, 1 insertion(+), 23 deletions(-) diff --git a/netstack_config.gni b/netstack_config.gni index 93866d8fe..52dd3ffe7 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,5 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false - netstack_websocket_server_enable = true + netstack_websocket_server_enable = false } diff --git a/utils/BUILD.gn b/utils/BUILD.gn index c4c8ea856..9ca616c7d 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -85,10 +85,6 @@ ohos_shared_library("stack_utils_common") { defines = [ "HAS_NETMANAGER_BASE=0" ] } - if (netstack_websocket_server_enable) { - defines += [ "NETSTACK_WEBSOCKETSERVER" ] - } - innerapi_tags = [ "platformsdk" ] part_name = "netstack" subsystem_name = "communication" diff --git a/utils/napi_utils/BUILD.gn b/utils/napi_utils/BUILD.gn index 70e391923..4d916b8c6 100644 --- a/utils/napi_utils/BUILD.gn +++ b/utils/napi_utils/BUILD.gn @@ -64,10 +64,6 @@ ohos_static_library("napi_utils") { } else { defines = [ "HAS_NETMANAGER_BASE=0" ] } - - if (netstack_websocket_server_enable) { - defines += [ "NETSTACK_WEBSOCKETSERVER" ] - } } ohos_static_library("napi_utils_static") { @@ -103,10 +99,6 @@ ohos_static_library("napi_utils_static") { defines = [ "HAS_NETMANAGER_BASE=0" ] } - if (netstack_websocket_server_enable) { - defines += [ "NETSTACK_WEBSOCKETSERVER" ] - } - if (current_os == "ohos") { public_deps = [ "$NETSTACK_DIR/utils:stack_utils_common" ] external_deps += [ diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index e4bd55529..da50e2998 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -79,11 +79,9 @@ public: void *GetQueueData(); -#ifdef NETSTACK_WEBSOCKETSERVER void SetServerQueueData(void *wsi, void *data); void *GetServerQueueData(void *wsi); -#endif void CreateEventReference(napi_env env, napi_value value); @@ -123,7 +121,6 @@ public: void SetProxyData(std::shared_ptr data); -#ifdef NETSTACK_WEBSOCKETSERVER const std::string &GetWsServerBinaryData(void *wsi); const std::string &GetWsServerTextData(void *wsi); @@ -147,7 +144,6 @@ public: [[nodiscard]] uint32_t GetMaxConcurrentClientCnt()const; [[nodiscard]] uint32_t GetMaxConnForOneClient() const; -#endif private: std::shared_mutex mutexForListenersAndEmitByUv_; std::shared_mutex dataMutex_; @@ -167,7 +163,6 @@ private: std::atomic_bool isReuseAddr_ = false; std::shared_ptr webSocketUserData_; std::shared_ptr proxyData_; -#ifdef NETSTACK_WEBSOCKETSERVER std::shared_mutex dataServerQueueMutex_; std::mutex mapMutex_; std::unordered_map> serverDataQueue_; @@ -176,7 +171,6 @@ private: std::unordered_map> userDataMap_; uint32_t maxConnClientCnt_; uint32_t maxConnForOneClient_; -#endif public: struct { diff --git a/utils/napi_utils/src/event_manager.cpp b/utils/napi_utils/src/event_manager.cpp index cd9cfeee3..4def9ad33 100644 --- a/utils/napi_utils/src/event_manager.cpp +++ b/utils/napi_utils/src/event_manager.cpp @@ -144,7 +144,6 @@ void *EventManager::GetQueueData() return nullptr; } -#ifdef NETSTACK_WEBSOCKETSERVER void EventManager::SetServerQueueData(void *wsi, void *data) { std::unique_lock lock(dataServerQueueMutex_); @@ -168,7 +167,6 @@ void *EventManager::GetServerQueueData(void *wsi) return data; } } -#endif bool EventManager::HasEventListener(const std::string &type) { @@ -233,7 +231,6 @@ void EventManager::AppendWebSocketBinaryData(void *data, size_t length) webSocketBinaryData_.append(reinterpret_cast(data), length); } -#ifdef NETSTACK_WEBSOCKETSERVER const std::string &EventManager::GetWsServerBinaryData(void *wsi) { return wsServerBinaryData_[wsi]; @@ -298,7 +295,6 @@ void EventManager::RemoveClientUserData(void *wsi) userDataMap_.erase(it); } } -#endif void EventManager::ClearWebSocketTextData() { -- Gitee From 7bde904cd854fcb82eb588c946072f7f96cb089d Mon Sep 17 00:00:00 2001 From: "ywm_up@qq.com" Date: Thu, 22 May 2025 14:07:18 +0800 Subject: [PATCH 120/126] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BE=B5=E5=85=A5?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A7=A3=E5=86=B3app=20die?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ywm_up@qq.com --- utils/http_over_curl/src/epoll_multi_driver.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/http_over_curl/src/epoll_multi_driver.cpp b/utils/http_over_curl/src/epoll_multi_driver.cpp index c4d7fce01..adc521e2b 100644 --- a/utils/http_over_curl/src/epoll_multi_driver.cpp +++ b/utils/http_over_curl/src/epoll_multi_driver.cpp @@ -17,6 +17,9 @@ #include "netstack_log.h" #include "request_info.h" +#if HAS_NETSTACK_CHR +#include "netstack_chr_client.h" +#endif namespace OHOS::NetStack::HttpOverCurl { -- Gitee From cd5f0ce27ca8395ce9eb16c351be95975ae1f468 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 22 May 2025 14:12:01 +0800 Subject: [PATCH 121/126] =?UTF-8?q?websocket=E4=BF=AE=E5=A4=8D=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wendan4 --- netstack_config.gni | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netstack_config.gni b/netstack_config.gni index 52dd3ffe7..93866d8fe 100644 --- a/netstack_config.gni +++ b/netstack_config.gni @@ -30,5 +30,5 @@ fuzz_test_path = "netstack/netstack" declare_args() { netstack_http_boringssl = false - netstack_websocket_server_enable = false + netstack_websocket_server_enable = true } -- Gitee From 66bac885659249713c660b696914e265c1f199ff Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Thu, 22 May 2025 06:48:13 +0000 Subject: [PATCH 122/126] add fd mutex Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 042fecfff..ff0614f66 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -1186,7 +1186,7 @@ bool ExecTcpSend(TcpSendContext *context) context->SetPermissionDenied(true); return false; } - + std::shared_lock lock(g_fdMutex); if (context->GetSocketFd() <= 0) { context->SetError(ERRNO_BAD_FD, strerror(ERRNO_BAD_FD)); NapiUtils::CreateUvQueueWorkEnhanced(context->GetEnv(), context, SocketAsyncWork::TcpSendCallback); -- Gitee From 26d03fd391f69641c02330f8c0d05e790422c965 Mon Sep 17 00:00:00 2001 From: wendan4 Date: Thu, 22 May 2025 19:28:50 +0800 Subject: [PATCH 123/126] =?UTF-8?q?=E8=B7=A8=E5=B9=B3=E5=8F=B0=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=8A=A5=E9=94=99=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wendan4 --- utils/napi_utils/include/event_manager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index da50e2998..a4f56cd45 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -27,7 +27,7 @@ #include #include #include - +#include #include "event_listener.h" #include "napi/native_api.h" #include "uv.h" -- Gitee From f2441470f035b7455a1ae980f23c0d4f8df9d98a Mon Sep 17 00:00:00 2001 From: l00635678 Date: Fri, 23 May 2025 14:49:20 +0800 Subject: [PATCH 124/126] fix:napi_unwrap crash Signed-off-by: l00635678 --- utils/napi_utils/include/event_manager.h | 5 +++- utils/napi_utils/include/module_template.h | 3 +- utils/napi_utils/src/module_template.cpp | 33 ++++++++++++++++++++-- utils/napi_utils/src/napi_utils.cpp | 3 -- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/utils/napi_utils/include/event_manager.h b/utils/napi_utils/include/event_manager.h index a4f56cd45..de9560b4f 100644 --- a/utils/napi_utils/include/event_manager.h +++ b/utils/napi_utils/include/event_manager.h @@ -49,7 +49,7 @@ class UserData; namespace Socks5 { class Socks5Instance; } - +using Finalizer = void (*)(napi_env, void *data, void *); class EventManager : public std::enable_shared_from_this { public: EventManager(); @@ -176,6 +176,9 @@ public: struct { uint32_t magicNumber = EVENT_MANAGER_MAGIC_NUMBER; } innerMagic_; + napi_env env_ = nullptr; + std::string className_; + Finalizer finalizer_ = nullptr; }; class EventManagerForHttp { diff --git a/utils/napi_utils/include/module_template.h b/utils/napi_utils/include/module_template.h index 3f8a39a1f..ef57c1826 100644 --- a/utils/napi_utils/include/module_template.h +++ b/utils/napi_utils/include/module_template.h @@ -37,7 +37,6 @@ struct EventManagerWrapper; #define MAX_PARAM_NUM 64 namespace OHOS::NetStack::ModuleTemplate { -typedef void (*Finalizer)(napi_env, void *data, void *); template napi_value InterfaceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &asyncWorkName, @@ -278,6 +277,8 @@ static void CallbackTemplateWithSharedManager(uv_work_t *work, int status) delete work; } +void CleanUpWithSharedManager(void* data); + void DefineClass(napi_env env, napi_value exports, const std::initializer_list &properties, const std::string &className); diff --git a/utils/napi_utils/src/module_template.cpp b/utils/napi_utils/src/module_template.cpp index 41b665e72..1898ba323 100644 --- a/utils/napi_utils/src/module_template.cpp +++ b/utils/napi_utils/src/module_template.cpp @@ -32,6 +32,7 @@ static constexpr const char *INTERFACE_TLS_SOCKET = "TLSSocket"; static constexpr const char *INTERFACE_WEB_SOCKET = "WebSocket"; static constexpr const char *INTERFACE_HTTP_REQUEST = "OHOS_NET_HTTP_HttpRequest"; static constexpr const char *INTERFACE_WEB_SOCKET_SERVER = "WebSocketServer"; +static constexpr const char *EVENT_MANAGER = "EVENT_MANAGER"; napi_value OnManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list &events, bool asyncCallback) @@ -293,6 +294,20 @@ napi_value OffSharedManager(napi_env env, napi_callback_info info, const std::in return NapiUtils::GetUndefined(env); } +void CleanUpWithSharedManager(void* data) +{ + auto sharedManager = reinterpret_cast *>(data); + if (sharedManager == nullptr || *sharedManager == nullptr) { + return; + } + auto manager = *sharedManager; + auto env = manager->env_; + napi_value obj = nullptr; + void* result = nullptr; + napi_get_named_property(env, NapiUtils::GetGlobal(env), manager->className_.c_str(), &obj); + napi_remove_wrap(env, obj, &result); +} + void DefineClass(napi_env env, napi_value exports, const std::initializer_list &properties, const std::string &className) { @@ -366,6 +381,9 @@ napi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, c return result; } auto manager = std::make_shared(); + manager->env_ = env; + manager->className_ = className + EVENT_MANAGER; + manager->finalizer_ = finalizer; *sharedManager = manager; if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET || @@ -373,8 +391,19 @@ napi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, c NETSTACK_LOGD("create reference for %{public}s", className.c_str()); manager->CreateEventReference(env, thisVal); } - napi_wrap(env, result, reinterpret_cast(sharedManager), finalizer, nullptr, nullptr); - + napi_wrap(env, result, reinterpret_cast(sharedManager), + [](napi_env env, void *data, void *hint) { + napi_remove_env_cleanup_hook(env, CleanUpWithSharedManager, data); + auto sharedManager = reinterpret_cast *>(data); + if (sharedManager == nullptr || *sharedManager == nullptr || (*sharedManager)->finalizer_ == nullptr) { + return; + } + auto manager = *sharedManager; + manager->finalizer_(env, data, hint); + }, + nullptr, nullptr); + napi_set_named_property(env, global, manager->className_.c_str(), result); + napi_add_env_cleanup_hook(env, CleanUpWithSharedManager, reinterpret_cast(sharedManager)); return result; } diff --git a/utils/napi_utils/src/napi_utils.cpp b/utils/napi_utils/src/napi_utils.cpp index ce551dd7c..47afe60d7 100644 --- a/utils/napi_utils/src/napi_utils.cpp +++ b/utils/napi_utils/src/napi_utils.cpp @@ -803,9 +803,6 @@ uint64_t CreateUvHandlerQueue(napi_env env) } void *result = nullptr; napi_remove_wrap(env, queueWrapper, &result); - auto id = reinterpret_cast(result); - std::lock_guard lock(g_mutex); - g_handlerQueueMap.erase(id); }, envWrapper); return newId; -- Gitee From 27b62597a51ec7ca5a0b5673795deee99b7eedfd Mon Sep 17 00:00:00 2001 From: fanqibing Date: Sat, 24 May 2025 15:09:33 +0800 Subject: [PATCH 125/126] fix TlsSocketFuzzTest timeout Signed-off-by: fanqibing --- .../socket/fuzztest/tlssocket_fuzzer/tls_socket_fuzzer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/tls_socket_fuzzer.cpp b/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/tls_socket_fuzzer.cpp index 5093ec3fe..7d050adad 100644 --- a/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/tls_socket_fuzzer.cpp +++ b/test/fuzztest/socket/fuzztest/tlssocket_fuzzer/tls_socket_fuzzer.cpp @@ -67,7 +67,7 @@ void BindFuzzTest(const uint8_t *data, size_t size) auto tlsSocket = std::make_shared(); Socket::NetAddress netAddress; - std::string str = GetStringFromData(STR_LEN); + std::string str = "www.baidu.com"; netAddress.SetAddress(str); netAddress.SetFamilyByJsValue(GetData()); netAddress.SetFamilyBySaFamily(GetData()); @@ -102,7 +102,7 @@ void ConnectFuzzTest(const uint8_t *data, size_t size) auto tlsSocket = std::make_shared(); Socket::NetAddress netAddress; - std::string str = GetStringFromData(STR_LEN); + std::string str = "www.baidu.com"; netAddress.SetAddress(str); netAddress.SetFamilyByJsValue(GetData()); netAddress.SetFamilyBySaFamily(GetData()); @@ -312,7 +312,7 @@ void SetNetAddressFuzzTest(const uint8_t *data, size_t size) g_baseFuzzSize = size; g_baseFuzzPos = 0; Socket::NetAddress address; - std::string str = GetStringFromData(STR_LEN); + std::string str = "www.baidu.com"; uint16_t port = GetData(); address.SetAddress(str); address.SetFamilyByJsValue(GetData()); -- Gitee From c76033b67dfef8830c337d6f2c7c4ce6e2385d07 Mon Sep 17 00:00:00 2001 From: lizefan Date: Mon, 26 May 2025 16:28:02 +0800 Subject: [PATCH 126/126] inner api add func Signed-off-by: lizefan --- .../include/websocket_client_error.h | 3 + .../websocket_client/websocket_client.cpp | 119 +++++++++++++++++- .../websocket_client/include/client_context.h | 45 +++++++ interfaces/kits/c/net_websocket/BUILD.gn | 6 +- 4 files changed, 169 insertions(+), 4 deletions(-) diff --git a/frameworks/native/websocket_client/include/websocket_client_error.h b/frameworks/native/websocket_client/include/websocket_client_error.h index f38a8eb29..cd8b48691 100755 --- a/frameworks/native/websocket_client/include/websocket_client_error.h +++ b/frameworks/native/websocket_client/include/websocket_client_error.h @@ -45,6 +45,9 @@ enum WebSocketErrorCode { WEBSOCKET_ERROR_NO_HEADR_EXCEEDS = 1016, WEBSOCKET_ERROR_HAVE_NO_CONNECT = 1017, WEBSOCKET_ERROR_HAVE_NO_CONNECT_CONTEXT = 1018, + WEBSOCKET_ERROR_FILE_NOT_EXIST = 1019, + WEBSOCKET_ERROR_PERMISSION_DENIED = 1020, + WEBSOCKET_ERROR_DISALLOW_HOST = 1021, WEBSOCKET_UNKNOWN_OTHER_ERROR = 9999 }; diff --git a/frameworks/native/websocket_client/websocket_client.cpp b/frameworks/native/websocket_client/websocket_client.cpp index 2e00c44c1..5ac513708 100644 --- a/frameworks/native/websocket_client/websocket_client.cpp +++ b/frameworks/native/websocket_client/websocket_client.cpp @@ -20,6 +20,12 @@ #include "netstack_log.h" #include "websocket_client_innerapi.h" +#include "netstack_common_utils.h" + +#ifdef HAS_NETMANAGER_BASE +#include "http_proxy.h" +#include "net_conn_client.h" +#endif static constexpr const char *PATH_START = "/"; static constexpr const char *NAME_END = ":"; @@ -28,6 +34,7 @@ static constexpr const size_t STATUS_LINE_ELEM_NUM = 2; static constexpr const char *PREFIX_HTTPS = "https"; static constexpr const char *PREFIX_WSS = "wss"; static constexpr const int MAX_URI_LENGTH = 1024; +static constexpr const int MAX_ADDRESS_LENGTH = 1024; static constexpr const int MAX_HDR_LENGTH = 1024; static constexpr const int MAX_HEADER_LENGTH = 8192; static constexpr const size_t MAX_DATA_LENGTH = 4 * 1024 * 1024; @@ -38,6 +45,11 @@ static constexpr const char *LINK_DOWN = "The link is down"; static constexpr const char *CLOSE_REASON_FORM_SERVER = "websocket close from server"; static constexpr const int FUNCTION_PARAM_TWO = 2; static constexpr const char *WEBSOCKET_CLIENT_THREAD_RUN = "OS_NET_WSCli"; +static constexpr const char *WEBSOCKET_SYSTEM_PREPARE_CA_PATH = "/etc/security/certificates"; +#ifdef HAS_NETMANAGER_BASE +static constexpr const int32_t UID_TRANSFORM_DIVISOR = 200000; +static constexpr const char *BASE_PATH = "/data/certificates/user_cacerts/"; +#endif static std::atomic g_clientID(0); namespace OHOS::NetStack::WebSocketClient { static const lws_retry_bo_t RETRY = { @@ -328,12 +340,105 @@ int LwsCallback(lws *wsi, lws_callback_reasons reason, void *user, void *in, siz static struct lws_protocols protocols[] = {{"lws-minimal-client1", LwsCallback, 0, 0, 0, NULL, 0}, LWS_PROTOCOL_LIST_TERM}; -static void FillContextInfo(lws_context_creation_info &info) +static void GetWebsocketProxyInfo(ClientContext *context, std::string &host, uint32_t &port, + std::string &exclusions) +{ + if (context->usingWebsocketProxyType == WebsocketProxyType::USE_SYSTEM) { +#ifdef HAS_NETMANAGER_BASE + using namespace NetManagerStandard; + HttpProxy websocketProxy; + NetConnClient::GetInstance().GetDefaultHttpProxy(websocketProxy); + host = websocketProxy.GetHost(); + port = websocketProxy.GetPort(); + exclusions = CommonUtils::ToString(websocketProxy.GetExclusionList()); +#endif + } else if (context->usingWebsocketProxyType == WebsocketProxyType::USE_SPECIFIED) { + host = context->websocketProxyHost; + port = context->websocketProxyPort; + exclusions = context->websocketProxyExclusions; + } +} + +static void FillContextInfo(ClientContext *context, lws_context_creation_info &info) { info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.port = CONTEXT_PORT_NO_LISTEN; info.protocols = protocols; info.fd_limit_per_thread = FD_LIMIT_PER_THREAD; + + char tempUri[MAX_URI_LENGTH] = {0}; + char proxyAds[MAX_ADDRESS_LENGTH] = {0}; + const char *tempProtocol = nullptr; + const char *tempAddress = nullptr; + const char *tempPath = nullptr; + int32_t tempPort = 0; + + std::string host; + uint32_t port = 0; + std::string exclusions; + + if (strcpy_s(tempUri, MAX_URI_LENGTH, context->url.c_str()) < 0) { + NETSTACK_LOGE("strcpy_s failed"); + return; + } + if (lws_parse_uri(tempUri, &tempProtocol, &tempAddress, &tempPort, &tempPath) != 0) { + NETSTACK_LOGE("get websocket hostname failed"); + return; + } + GetWebsocketProxyInfo(context, host, port, exclusions); + if (!host.empty() && !CommonUtils::IsHostNameExcluded(tempAddress, exclusions, ",")) { + if (strcpy_s(proxyAds, host.length() + 1, host.c_str()) != EOK) { + NETSTACK_LOGE("memory copy failed"); + } + info.http_proxy_address = proxyAds; + info.http_proxy_port = port; + } +} + +static bool CheckFilePath(std::string &path) +{ + char tmpPath[PATH_MAX] = {0}; + if (!realpath(static_cast(path.c_str()), tmpPath)) { + NETSTACK_LOGE("path is error"); + return false; + } + path = tmpPath; + return true; +} + +static bool FillCaPath(ClientContext *context, lws_context_creation_info &info) +{ + if (!context->caPath.empty()) { + if (!CheckFilePath(context->caPath)) { + NETSTACK_LOGE("ca not exist"); + context->errorCode = WebSocketErrorCode::WEBSOCKET_ERROR_FILE_NOT_EXIST; + return false; + } + info.client_ssl_ca_filepath = context->caPath.c_str(); + NETSTACK_LOGD("load customize CA: %{public}s", info.client_ssl_ca_filepath); + } else { + info.client_ssl_ca_dirs[0] = WEBSOCKET_SYSTEM_PREPARE_CA_PATH; +#ifdef HAS_NETMANAGER_BASE + if (NetManagerStandard::NetConnClient::GetInstance().TrustUserCa()) { + context->SetUserCertPath(BASE_PATH + std::to_string(getuid() / UID_TRANSFORM_DIVISOR)); + info.client_ssl_ca_dirs[1] = context->GetUserCertPath().c_str(); + } +#endif + NETSTACK_LOGD("load system CA"); + } + if (!context->clientCert.empty()) { + char realKeyPath[PATH_MAX] = {0}; + if (!CheckFilePath(context->clientCert) || !realpath(context->clientKey.Data(), realKeyPath)) { + NETSTACK_LOGE("client cert not exist"); + context->errorCode = WebSocketErrorCode::WEBSOCKET_ERROR_FILE_NOT_EXIST; + return false; + } + context->clientKey = Secure::SecureChar(realKeyPath); + info.client_ssl_cert_filepath = context->clientCert.c_str(); + info.client_ssl_private_key_filepath = context->clientKey.Data(); + info.client_ssl_private_key_password = context->keyPassword.Data(); + } + return true; } bool ParseUrl(const std::string url, char *prefix, char *address, char *path, int *port) @@ -400,6 +505,15 @@ int CreatConnectInfo(const std::string url, lws_context *lwsContext, WebSocketCl int WebSocketClient::Connect(std::string url, struct OpenOptions options) { NETSTACK_LOGI("ClientId:%{public}d, Connect start", this->GetClientContext()->GetClientId()); + if (!CommonUtils::HasInternetPermission()) { + this->GetClientContext()->permissionDenied = true; + return WebSocketErrorCode::WEBSOCKET_ERROR_PERMISSION_DENIED; + } + if (this->GetClientContext()->isAtomicService && !CommonUtils::IsAllowedHostname(this->GetClientContext()-> + bundleName, CommonUtils::DOMAIN_TYPE_WEBSOCKET_REQUEST, this->GetClientContext()->url)) { + this->GetClientContext()->noAllowedHost = true; + return WebSocketErrorCode::WEBSOCKET_ERROR_DISALLOW_HOST; + } if (!options.headers.empty()) { if (options.headers.size() > MAX_HEADER_LENGTH) { return WebSocketErrorCode::WEBSOCKET_ERROR_NO_HEADR_EXCEEDS; @@ -411,7 +525,8 @@ int WebSocketClient::Connect(std::string url, struct OpenOptions options) } } lws_context_creation_info info = {}; - FillContextInfo(info); + FillContextInfo(this->GetClientContext(), info); + FillCaPath(this->GetClientContext(), info); lws_context *lwsContext = lws_create_context(&info); if (lwsContext == nullptr) { return WebSocketErrorCode::WEBSOCKET_CONNECTION_NO_MEMOERY; diff --git a/interfaces/innerkits/websocket_client/include/client_context.h b/interfaces/innerkits/websocket_client/include/client_context.h index 40e3c0d2e..3283ac30c 100755 --- a/interfaces/innerkits/websocket_client/include/client_context.h +++ b/interfaces/innerkits/websocket_client/include/client_context.h @@ -27,6 +27,7 @@ #include #include #include "netstack_log.h" +#include "secure_char.h" namespace OHOS { namespace NetStack { @@ -47,6 +48,12 @@ struct SendData { lws_write_protocol protocol; }; +enum class WebsocketProxyType { + NOT_USE, + USE_SYSTEM, + USE_SPECIFIED, +}; + class ClientContext { public: ClientContext() : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), errorCode(0), closed_(false), @@ -143,8 +150,44 @@ public: return clientId; } + void SetUserCertPath(std::string path) + { + userCertPath_ = path; + } + + std::string GetUserCertPath() + { + return userCertPath_; + } + std::map header; + std::string caPath; + + std::string clientCert; + + Secure::SecureChar clientKey; + + Secure::SecureChar keyPassword; + + bool permissionDenied; + + bool isAtomicService = false; + + bool noAllowedHost; + + std::string bundleName; + + std::string url; + + WebsocketProxyType usingWebsocketProxyType = WebsocketProxyType::USE_SYSTEM; + + std::string websocketProxyHost; + + int32_t websocketProxyPort = 0; + + std::string websocketProxyExclusions; + lws_close_status closeStatus; std::string closeReason; @@ -158,6 +201,8 @@ public: private: bool closed_; + std::string userCertPath_; + std::atomic_bool threadStop_; std::mutex mutex_; diff --git a/interfaces/kits/c/net_websocket/BUILD.gn b/interfaces/kits/c/net_websocket/BUILD.gn index a4fe93ff0..1b880a83d 100755 --- a/interfaces/kits/c/net_websocket/BUILD.gn +++ b/interfaces/kits/c/net_websocket/BUILD.gn @@ -36,8 +36,10 @@ ohos_shared_library("net_websocket") { "src/net_websocket_adapter.cpp", ] - deps = - [ "$NETSTACK_DIR/interfaces/innerkits/websocket_client:websocket_client" ] + deps = [ + "$NETSTACK_DIR/interfaces/innerkits/websocket_client:websocket_client", + "$NETSTACK_DIR/utils/napi_utils:napi_utils", + ] external_deps = [ "c_utils:utils", -- Gitee