You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2022/06/26 18:35:27 UTC

[cxf] 01/04: CXF-8725: Optionally don't set (#964)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.5.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git

commit b54905c40ba39269dd3c4f03454645ccf8264572
Author: Konrad Windszus <ko...@gmx.de>
AuthorDate: Sun Jun 26 19:55:58 2022 +0200

    CXF-8725: Optionally don't set (#964)
    
    "org.apache.cxf.transport.service_not_available" for specific HTTP
    response codes
---
 .../java/org/apache/cxf/message/MessageUtils.java    | 20 ++++++++++++++++++++
 .../org/apache/cxf/message/MessageUtilsTest.java     | 12 +++++++++++-
 .../org/apache/cxf/transport/http/HTTPConduit.java   | 13 ++++++++++++-
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/cxf/message/MessageUtils.java b/core/src/main/java/org/apache/cxf/message/MessageUtils.java
index e7f75233c5..38d29b5708 100644
--- a/core/src/main/java/org/apache/cxf/message/MessageUtils.java
+++ b/core/src/main/java/org/apache/cxf/message/MessageUtils.java
@@ -21,6 +21,8 @@ package org.apache.cxf.message;
 
 import java.lang.reflect.Method;
 import java.net.HttpURLConnection;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Optional;
 import java.util.logging.Logger;
 
@@ -153,6 +155,24 @@ public final class MessageUtils {
         return defaultValue;
     }
 
+    public static Collection<Integer> getContextualIntegers(Message m, String key, Collection<Integer> defaultValue) {
+        if (m != null) {
+            Object o = m.getContextualProperty(key);
+            if (o instanceof String) {
+                Collection<Integer> intValues = new ArrayList<>();
+                for (String value : ((String) o).split(",")) {
+                    try {
+                        intValues.add(Integer.parseInt(value));
+                    } catch (NumberFormatException ex) {
+                        LOG.warning("Incorrect integer value of " + value + " specified for: " + key);
+                    }
+                }
+                return intValues;
+            }
+        }
+        return defaultValue;
+    }
+
     public static int getContextualInteger(Message m, String key, int defaultValue) {
         if (m != null) {
             Object o = m.getContextualProperty(key);
diff --git a/core/src/test/java/org/apache/cxf/message/MessageUtilsTest.java b/core/src/test/java/org/apache/cxf/message/MessageUtilsTest.java
index 298aaa54ab..65a09d8935 100644
--- a/core/src/test/java/org/apache/cxf/message/MessageUtilsTest.java
+++ b/core/src/test/java/org/apache/cxf/message/MessageUtilsTest.java
@@ -19,6 +19,7 @@
 package org.apache.cxf.message;
 
 import java.lang.reflect.Method;
+import java.util.List;
 import java.util.Optional;
 
 import javax.xml.namespace.QName;
@@ -29,7 +30,8 @@ import org.apache.cxf.service.factory.SimpleMethodDispatcher;
 import org.apache.cxf.service.invoker.MethodDispatcher;
 import org.apache.cxf.service.model.BindingOperationInfo;
 import org.apache.cxf.service.model.OperationInfo;
-
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -80,4 +82,12 @@ public class MessageUtilsTest {
 
         assertFalse(MessageUtils.getTargetMethod(message).isPresent());
     }
+
+    @Test
+    public void getContextualIntegers() {
+        Message message = new MessageImpl();
+        message.put("key1", "1,2,invalid,3");
+        MatcherAssert.assertThat(MessageUtils.getContextualIntegers(message, "key1", List.of(0)), Matchers.contains(1,2,3));
+        MatcherAssert.assertThat(MessageUtils.getContextualIntegers(message, "invalid-key", List.of(0, 1)), Matchers.contains(0,1));
+    }
 }
diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
index 8db3a3a2e3..cf2517f6a6 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/HTTPConduit.java
@@ -32,6 +32,7 @@ import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -164,6 +165,15 @@ public abstract class HTTPConduit
 
     public static final String PROCESS_FAULT_ON_HTTP_400 = "org.apache.cxf.transport.process_fault_on_http_400";
     public static final String NO_IO_EXCEPTIONS = "org.apache.cxf.transport.no_io_exceptions";
+
+    /** 
+     * The HTTP status codes as contextual property (comma-separated integers as String) on the outgoing {@link Message} which lead to 
+     * setting {@code org.apache.cxf.transport.service_not_available} for all responses with those status codes.
+     * This is used e.g. by the {@code org.apache.cxf.clustering.FailoverTargetSelector} to determine if it should do the fail-over.
+     * Default: {@code 404,429,503} 
+     */
+    public static final String SERVICE_NOT_AVAILABLE_ON_HTTP_STATUS_CODES = "org.apache.cxf.transport.service_not_available_on_http_status_codes";
+
     /**
      * The Logger for this class.
      */
@@ -1600,7 +1610,8 @@ public abstract class HTTPConduit
             }
             if (exchange != null) {
                 exchange.put(Message.RESPONSE_CODE, rc);
-                if (rc == 404 || rc == 503 || rc == 429) {
+                Collection<Integer> serviceNotAvailableOnHttpStatusCodes = MessageUtils.getContextualIntegers(outMessage, SERVICE_NOT_AVAILABLE_ON_HTTP_STATUS_CODES, List.of(404, 429, 503));
+                if (serviceNotAvailableOnHttpStatusCodes.contains(rc)) {
                     exchange.put("org.apache.cxf.transport.service_not_available", true);
                 }
             }