You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/02/14 15:18:01 UTC

[camel] 02/03: CAMEL-16199: camel-http - Optimize headers added as request headers in producer

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

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a42ba335d0f041c54eb3a0889503f79260a5b47a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Feb 14 15:38:09 2021 +0100

    CAMEL-16199: camel-http - Optimize headers added as request headers in producer
---
 .../apache/camel/component/http/HttpProducer.java  | 102 +++++++++++----------
 1 file changed, 56 insertions(+), 46 deletions(-)

diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
index df4ba01..660fcb0 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
@@ -130,61 +130,71 @@ public class HttpProducer extends DefaultProducer {
         }
 
         // propagate headers as HTTP headers
-        final TypeConverter tc = exchange.getContext().getTypeConverter();
-        for (Map.Entry<String, Object> entry : in.getHeaders().entrySet()) {
-            String key = entry.getKey();
-            Object headerValue = entry.getValue();
-
-            if (headerValue != null) {
-
-                if (headerValue instanceof String) {
-                    // optimise for string values
-                    String value = (String) headerValue;
-                    if (strategy == null || !strategy.applyFilterToCamelHeaders(key, value, exchange)) {
-                        httpRequest.addHeader(key, value);
+        if (strategy != null) {
+            final TypeConverter tc = exchange.getContext().getTypeConverter();
+            for (Map.Entry<String, Object> entry : in.getHeaders().entrySet()) {
+                String key = entry.getKey();
+                Object headerValue = entry.getValue();
+
+                if (headerValue != null) {
+
+                    if (headerValue instanceof String) {
+                        // optimise for string values
+                        String value = (String) headerValue;
+                        if (!strategy.applyFilterToCamelHeaders(key, value, exchange)) {
+                            httpRequest.addHeader(key, value);
+                        }
+                        continue;
+                    } else if (headerValue instanceof Long || headerValue instanceof Integer
+                            || headerValue instanceof Boolean) {
+                        // optimise for other common types
+                        String value = tc.convertTo(String.class, exchange, headerValue);
+                        if (!strategy.applyFilterToCamelHeaders(key, value, exchange)) {
+                            httpRequest.addHeader(key, value);
+                        }
+                        continue;
                     }
-                    continue;
-                }
 
-                // use an iterator as there can be multiple values. (must not use a delimiter, and allow empty values)
-                final Iterator<?> it = ObjectHelper.createIterator(headerValue, null, true);
+                    // use an iterator as there can be multiple values. (must not use a delimiter, and allow empty values)
+                    final Iterator<?> it = ObjectHelper.createIterator(headerValue, null, true);
 
-                // the value to add as request header
-                List<String> multiValues = null;
-                String prev = null;
+                    // the value to add as request header
+                    List<String> multiValues = null;
+                    String prev = null;
 
-                // if its a multi value then check each value if we can add it and for multi values they
-                // should be combined into a single value
-                while (it.hasNext()) {
-                    String value = tc.convertTo(String.class, it.next());
+                    // if its a multi value then check each value if we can add it and for multi values they
+                    // should be combined into a single value
+                    while (it.hasNext()) {
+                        String value = tc.convertTo(String.class, it.next());
 
-                    // we should not add headers for the parameters in the uri if we bridge the endpoint
-                    // as then we would duplicate headers on both the endpoint uri, and in HTTP headers as well
-                    if (skipRequestHeaders != null && skipRequestHeaders.containsKey(key)) {
-                        continue;
-                    }
-                    if (value != null && strategy != null && !strategy.applyFilterToCamelHeaders(key, value, exchange)) {
-                        if (prev == null) {
-                            prev = value;
-                        } else {
-                            // only create array for multi values when really needed
-                            if (multiValues == null) {
-                                multiValues = new ArrayList<>();
-                                multiValues.add(prev);
+                        // we should not add headers for the parameters in the uri if we bridge the endpoint
+                        // as then we would duplicate headers on both the endpoint uri, and in HTTP headers as well
+                        if (skipRequestHeaders != null && skipRequestHeaders.containsKey(key)) {
+                            continue;
+                        }
+                        if (value != null && !strategy.applyFilterToCamelHeaders(key, value, exchange)) {
+                            if (prev == null) {
+                                prev = value;
+                            } else {
+                                // only create array for multi values when really needed
+                                if (multiValues == null) {
+                                    multiValues = new ArrayList<>();
+                                    multiValues.add(prev);
+                                }
+                                multiValues.add(value);
                             }
-                            multiValues.add(value);
                         }
                     }
-                }
 
-                // add the value(s) as a http request header
-                if (multiValues != null) {
-                    // use the default toString of a ArrayList to create in the form [xxx, yyy]
-                    // if multi valued, for a single value, then just output the value as is
-                    String s = multiValues.size() > 1 ? multiValues.toString() : multiValues.get(0);
-                    httpRequest.addHeader(key, s);
-                } else if (prev != null) {
-                    httpRequest.addHeader(key, prev);
+                    // add the value(s) as a http request header
+                    if (multiValues != null) {
+                        // use the default toString of a ArrayList to create in the form [xxx, yyy]
+                        // if multi valued, for a single value, then just output the value as is
+                        String s = multiValues.size() > 1 ? multiValues.toString() : multiValues.get(0);
+                        httpRequest.addHeader(key, s);
+                    } else if (prev != null) {
+                        httpRequest.addHeader(key, prev);
+                    }
                 }
             }
         }