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/26 09:00:07 UTC
[camel] 02/02: camel-http - Optimize to reuse HttpHost when using
default uri
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 265d61fa502a83141fd7e669afc8813606cc9661
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Feb 26 09:59:15 2021 +0100
camel-http - Optimize to reuse HttpHost when using default uri
---
.../apache/camel/component/http/HttpProducer.java | 43 ++++++++++++++++------
1 file changed, 31 insertions(+), 12 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 728943d..d20df05 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
@@ -59,12 +59,14 @@ import org.apache.camel.util.UnsafeUriCharactersEncoder;
import org.apache.http.Header;
import org.apache.http.HeaderIterator;
import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.client.utils.URIUtils;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
@@ -95,6 +97,8 @@ public class HttpProducer extends DefaultProducer {
private int maxOkRange;
private String defaultUrl;
private URI defaultUri;
+ private URI defaultRelativeUri;
+ private HttpHost defaultHttpHost;
public HttpProducer(HttpEndpoint endpoint) {
super(endpoint);
@@ -129,6 +133,7 @@ public class HttpProducer extends DefaultProducer {
}
defaultUri = uri;
defaultUrl = uri.toASCIIString();
+ defaultHttpHost = URIUtils.extractHost(uri);
}
@Override
@@ -152,6 +157,8 @@ public class HttpProducer extends DefaultProducer {
}
HttpRequestBase httpRequest = createMethod(exchange);
+ HttpHost httpHost = createHost(httpRequest, exchange);
+
Message in = exchange.getIn();
String httpProtocolVersion = in.getHeader(Exchange.HTTP_PROTOCOL_VERSION, String.class);
if (httpProtocolVersion != null) {
@@ -260,7 +267,7 @@ public class HttpProducer extends DefaultProducer {
if (LOG.isDebugEnabled()) {
LOG.debug("Executing http {} method: {}", httpRequest.getMethod(), httpRequest.getURI());
}
- httpResponse = executeMethod(httpRequest);
+ httpResponse = executeMethod(httpHost, httpRequest);
int responseCode = httpResponse.getStatusLine().getStatusCode();
if (LOG.isDebugEnabled()) {
LOG.debug("Http responseCode: {}", responseCode);
@@ -418,11 +425,12 @@ public class HttpProducer extends DefaultProducer {
/**
* Strategy when executing the method (calling the remote server).
*
- * @param httpRequest the http Request to execute
+ * @param httpHost the http host to call
+ * @param httpRequest the http request to execute
* @return the response
* @throws IOException can be thrown
*/
- protected HttpResponse executeMethod(HttpUriRequest httpRequest) throws IOException {
+ protected HttpResponse executeMethod(HttpHost httpHost, HttpUriRequest httpRequest) throws IOException {
HttpContext localContext = new BasicHttpContext();
if (getEndpoint().isAuthenticationPreemptive()) {
BasicScheme basicAuth = new BasicScheme();
@@ -431,7 +439,7 @@ public class HttpProducer extends DefaultProducer {
if (httpContext != null) {
localContext = new BasicHttpContext(httpContext);
}
- return httpClient.execute(httpRequest, localContext);
+ return httpClient.execute(httpHost, httpRequest, localContext);
}
/**
@@ -543,6 +551,17 @@ public class HttpProducer extends DefaultProducer {
}
/**
+ * Creates the HttpHost to use to call the remote server
+ */
+ protected HttpHost createHost(HttpRequestBase httpRequest, Exchange exchange) throws Exception {
+ if (httpRequest.getURI() == defaultUri) {
+ return defaultHttpHost;
+ } else {
+ return URIUtils.extractHost(httpRequest.getURI());
+ }
+ }
+
+ /**
* Creates the HttpMethod to use to call the remote server, either its GET or POST.
*
* @param exchange the exchange
@@ -561,17 +580,18 @@ public class HttpProducer extends DefaultProducer {
// a new url that is dynamic based on header values
// these checks are checks that is done in HttpHelper.createURL and HttpHelper.createURI methods
boolean create = false;
- if (exchange.getIn().getHeader("CamelRestHttpUri") != null) {
+ Message in = exchange.getIn();
+ if (in.getHeader("CamelRestHttpUri") != null) {
create = true;
- } else if (exchange.getIn().getHeader("CamelHttpUri") != null && !getEndpoint().isBridgeEndpoint()) {
+ } else if (in.getHeader("CamelHttpUri") != null && !getEndpoint().isBridgeEndpoint()) {
create = true;
- } else if (exchange.getIn().getHeader("CamelHttpPath") != null) {
+ } else if (in.getHeader("CamelHttpPath") != null) {
create = true;
- } else if (exchange.getIn().getHeader("CamelRestHttpQuery") != null) {
+ } else if (in.getHeader("CamelRestHttpQuery") != null) {
create = true;
- } else if (exchange.getIn().getHeader("CamelHttpRawQuery") != null) {
+ } else if (in.getHeader("CamelHttpRawQuery") != null) {
create = true;
- } else if (exchange.getIn().getHeader("CamelHttpQuery") != null) {
+ } else if (in.getHeader("CamelHttpQuery") != null) {
create = true;
}
@@ -610,8 +630,7 @@ public class HttpProducer extends DefaultProducer {
// there must be a host on the method
if (method.getURI().getScheme() == null || method.getURI().getHost() == null) {
throw new IllegalArgumentException(
- "Invalid url: " + url
- + ". If you are forwarding/bridging http endpoints, then enable the bridgeEndpoint option on the endpoint: "
+ "Invalid url: " + url + ". If you are forwarding/bridging http endpoints, then enable the bridgeEndpoint option on the endpoint: "
+ getEndpoint());
}