From 26f63687e5fdae90b75bbbdc8e9eb84bded71e4d Mon Sep 17 00:00:00 2001 From: Jacob Su Date: Tue, 13 Aug 2024 16:08:13 +0800 Subject: [PATCH] refine ENV config SRS_OVERWRITE_BY_ENV_DIRECTIVE 1. don't use static variable to store the result; 2. add more UT to handle the multi value and values with whitespaces; --- trunk/src/app/srs_app_config.cpp | 11 ++- trunk/src/app/srs_app_config.hpp | 3 + trunk/src/utest/srs_utest_config.cpp | 139 +++++++++++++++++++++++++-- 3 files changed, 145 insertions(+), 8 deletions(-) diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 06174bddbb..38d4072a4a 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -69,14 +69,17 @@ const char* _srs_version = "XCORE-" RTMP_SIG_SRS_SERVER; #define SRS_OVERWRITE_BY_ENV_FLOAT_SECONDS(key) if (!srs_getenv(key).empty()) return srs_utime_t(::atof(srs_getenv(key).c_str()) * SRS_UTIME_SECONDS) #define SRS_OVERWRITE_BY_ENV_FLOAT_MILLISECONDS(key) if (!srs_getenv(key).empty()) return srs_utime_t(::atof(srs_getenv(key).c_str()) * SRS_UTIME_MILLISECONDS) #define SRS_OVERWRITE_BY_ENV_DIRECTIVE(key) { \ - static SrsConfDirective* dir = NULL; \ + SrsConfDirective* dir = env_dirs->get(key); \ if (!dir && !srs_getenv(key).empty()) { \ std::vector vec = srs_string_split(srs_getenv(key), " "); \ dir = new SrsConfDirective(); \ dir->name = key; \ for (size_t i = 0; i < vec.size(); ++i) { \ - dir->args.push_back(vec[i]); \ + if (!vec[i].empty()) { \ + dir->args.push_back(vec[i]); \ + } \ } \ + env_dirs->directives.push_back(dir); \ } \ if (dir) return dir; \ } @@ -1345,11 +1348,15 @@ SrsConfig::SrsConfig() root = new SrsConfDirective(); root->conf_line = 0; root->name = "root"; + + env_dirs = new SrsConfDirective(); + env_dirs->name = "env"; } SrsConfig::~SrsConfig() { srs_freep(root); + srs_freep(env_dirs); } void SrsConfig::subscribe(ISrsReloadHandler* handler) diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index afa700a0c8..b106597395 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -305,6 +305,9 @@ class SrsConfig protected: // The directive root. SrsConfDirective* root; + + // The Env directives. + SrsConfDirective* env_dirs; // Reload section private: // The reload subscribers, when reload, callback all handlers. diff --git a/trunk/src/utest/srs_utest_config.cpp b/trunk/src/utest/srs_utest_config.cpp index c56e42efeb..8999dabfeb 100644 --- a/trunk/src/utest/srs_utest_config.cpp +++ b/trunk/src/utest/srs_utest_config.cpp @@ -5059,12 +5059,11 @@ VOID TEST(ConfigEnvTest, CheckEnvValuesHooks) } if (true) { - SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_CONNECT", "http://server/api/connect https://server2/api/connect2"); + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_CONNECT", "http://server/api/connect"); SrsConfDirective* dir = conf.get_vhost_on_connect("__defaultVhost__"); ASSERT_TRUE(dir != NULL); - ASSERT_EQ((int)dir->args.size(), 2); + ASSERT_EQ((int)dir->args.size(), 1); ASSERT_STREQ("http://server/api/connect", dir->arg0().c_str()); - ASSERT_STREQ("https://server2/api/connect2", dir->arg1().c_str()); } if (true) { @@ -5076,12 +5075,11 @@ VOID TEST(ConfigEnvTest, CheckEnvValuesHooks) } if (true) { - SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PUBLISH", "http://server/api/publish http://server/api/publish2"); + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PUBLISH", "http://server/api/publish"); SrsConfDirective* dir = conf.get_vhost_on_publish("__defaultVhost__"); ASSERT_TRUE(dir != NULL); - ASSERT_EQ((int)dir->args.size(), 2); + ASSERT_EQ((int)dir->args.size(), 1); ASSERT_STREQ("http://server/api/publish", dir->arg0().c_str()); - ASSERT_STREQ("http://server/api/publish2", dir->arg1().c_str()); } if (true) { @@ -5132,3 +5130,132 @@ VOID TEST(ConfigEnvTest, CheckEnvValuesHooks) ASSERT_STREQ("http://server/api/hls_notify", dir->arg0().c_str()); } } + +VOID TEST(ConfigEnvTest, CheckEnvValuesHooksMultiValues) +{ + MockSrsConfig conf; + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_CONNECT", "http://server/api/connect https://server2/api/connect2"); + + SrsConfDirective* dir = conf.get_vhost_on_connect("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_EQ((int)dir->args.size(), 2); + ASSERT_STREQ("http://server/api/connect", dir->arg0().c_str()); + ASSERT_STREQ("https://server2/api/connect2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_CLOSE", "http://server/api/close close2 close3"); + SrsConfDirective* dir = conf.get_vhost_on_close("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 3); + ASSERT_STREQ("http://server/api/close", dir->arg0().c_str()); + ASSERT_STREQ("close2", dir->arg1().c_str()); + ASSERT_STREQ("close3", dir->arg2().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PUBLISH", "http://server/api/publish http://server/api/publish2"); + SrsConfDirective* dir = conf.get_vhost_on_publish("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_EQ((int)dir->args.size(), 2); + ASSERT_STREQ("http://server/api/publish", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/publish2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_UNPUBLISH", "http://server/api/unpublish 2"); + SrsConfDirective* dir = conf.get_vhost_on_unpublish("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/unpublish", dir->arg0().c_str()); + ASSERT_STREQ("2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PLAY", "http://server/api/play http://server/api/play2"); + SrsConfDirective* dir = conf.get_vhost_on_play("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/play", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/play2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_STOP", "http://server/api/stop http://server/api/stop2"); + SrsConfDirective* dir = conf.get_vhost_on_stop("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/stop", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/stop2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_DVR", "http://server/api/dvr http://server/api/dvr2"); + SrsConfDirective* dir = conf.get_vhost_on_dvr("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/dvr", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/dvr2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_HLS", "http://server/api/hls http://server/api/hls2"); + SrsConfDirective* dir = conf.get_vhost_on_hls("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/hls", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/hls2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_HLS_NOTIFY", "http://server/api/hls_notify http://server/api/hls_notify2"); + SrsConfDirective* dir = conf.get_vhost_on_hls_notify("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 2); + ASSERT_STREQ("http://server/api/hls_notify", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/hls_notify2", dir->arg1().c_str()); + } +} + +VOID TEST(ConfigEnvTest, CheckEnvValuesHooksWithWhitespaces) +{ + MockSrsConfig conf; + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PUBLISH", "http://server/api/publish http://server/api/publish2"); + SrsConfDirective* dir = conf.get_vhost_on_publish("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_EQ((int)dir->args.size(), 2); + ASSERT_STREQ("http://server/api/publish", dir->arg0().c_str()); + ASSERT_STREQ("http://server/api/publish2", dir->arg1().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_UNPUBLISH", "http://server/api/unpublish "); + SrsConfDirective* dir = conf.get_vhost_on_unpublish("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 1); + ASSERT_STREQ("http://server/api/unpublish", dir->arg0().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_PLAY", " http://server/api/play play2 play3 "); + SrsConfDirective* dir = conf.get_vhost_on_play("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 3); + ASSERT_STREQ("http://server/api/play", dir->arg0().c_str()); + ASSERT_STREQ("play2", dir->arg1().c_str()); + ASSERT_STREQ("play3", dir->arg2().c_str()); + } + + if (true) { + SrsSetEnvConfig(hooks, "SRS_VHOST_HTTP_HOOKS_ON_DVR", " dvr"); + SrsConfDirective* dir = conf.get_vhost_on_dvr("__defaultVhost__"); + ASSERT_TRUE(dir != NULL); + ASSERT_TRUE((int)dir->args.size() == 1); + ASSERT_STREQ("dvr", dir->arg0().c_str()); + } + +}