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]") {

Reply via email to