This is an automated email from the ASF dual-hosted git repository. szaszm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 32043f51faeedbae9ab4a64eca52907f696529a9 Author: Martin Zink <[email protected]> AuthorDate: Fri Mar 3 14:18:38 2023 +0100 MINIFICPP-2061 reverseDnsLookup shouldn't throw on timeout Closes #1520 Signed-off-by: Marton Szasz <[email protected]> --- extensions/expression-language/Expression.cpp | 10 +++++++++- .../tests/ExpressionLanguageTests.cpp | 19 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/extensions/expression-language/Expression.cpp b/extensions/expression-language/Expression.cpp index f1570775c..5bb59506d 100644 --- a/extensions/expression-language/Expression.cpp +++ b/extensions/expression-language/Expression.cpp @@ -63,6 +63,8 @@ #include "Driver.h" +#include "core/logging/LoggerFactory.h" + #include "date/tz.h" #include "utils/net/DNS.h" #include "utils/expected.h" @@ -198,7 +200,13 @@ Value expr_reverseDnsLookup(const std::vector<Value>& args) { return utils::net::addressFromString(ip_address_str) | utils::flatMap([timeout_duration](const auto& ip_address) { return utils::net::reverseDnsLookup(ip_address, timeout_duration);}) | utils::map([](const auto& hostname)-> Value { return Value(hostname); }) - | utils::valueOrElse([&](std::error_code error_code) { throw std::system_error(error_code);}); + | utils::valueOrElse([&](std::error_code error_code) { + if (error_code.value() == asio::error::timed_out) { + core::logging::LoggerFactory<Expression>::getLogger()->log_warn("reverseDnsLookup timed out"); + return Value(ip_address_str); + } + throw std::system_error(error_code); + }); } Value expr_uuid(const std::vector<Value>& /*args*/) { diff --git a/extensions/expression-language/tests/ExpressionLanguageTests.cpp b/extensions/expression-language/tests/ExpressionLanguageTests.cpp index 477000981..a1be75a49 100644 --- a/extensions/expression-language/tests/ExpressionLanguageTests.cpp +++ b/extensions/expression-language/tests/ExpressionLanguageTests.cpp @@ -1333,15 +1333,24 @@ TEST_CASE("Reverse DNS lookup with invalid timeout parameter", "[ExpressionLangu } TEST_CASE("Reverse DNS lookup with valid timeout parameter", "[ExpressionLanguage][reverseDnsLookup]") { - auto reverse_lookup_expr_500ms = expression::compile("${reverseDnsLookup(${ip_addr}, 500)}"); - auto reverse_lookup_expr_0ms = expression::compile("${reverseDnsLookup(${ip_addr}, 0)}"); // 0ms to make sure it times out + LogTestController::getInstance().setWarn<expression::Expression>(); + LogTestController::getInstance().clear(); auto flow_file_a = std::make_shared<core::FlowFile>(); std::string expected_hostname; - flow_file_a->addAttribute("ip_addr", "192.0.2.1"); + flow_file_a->addAttribute("ip_addr", "8.8.8.8"); + + SECTION("Should timeout") { + auto reverse_lookup_expr_0ms = expression::compile("${reverseDnsLookup(${ip_addr}, 0)}"); + REQUIRE_NOTHROW(reverse_lookup_expr_0ms(expression::Parameters{flow_file_a}).asString() == "8.8.8.8"); + CHECK(LogTestController::getInstance().contains("reverseDnsLookup timed out", 0ms)); + } - REQUIRE_THROWS_AS(reverse_lookup_expr_0ms(expression::Parameters{flow_file_a}), std::runtime_error); - REQUIRE_NOTHROW(reverse_lookup_expr_500ms(expression::Parameters{ flow_file_a })); + SECTION("Shouldn't timeout") { + auto reverse_lookup_expr_500ms = expression::compile("${reverseDnsLookup(${ip_addr}, 500)}"); + REQUIRE_NOTHROW(reverse_lookup_expr_500ms(expression::Parameters{flow_file_a}).asString() == "dns.google"); + CHECK_FALSE(LogTestController::getInstance().contains("reverseDnsLookup timed out", 0ms)); + } } TEST_CASE("UUID", "[expressionUuid]") {
