From 8f559cfb99e64859ecbc42ba0171de503d992f40 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Wed, 18 Mar 2015 14:30:05 -0500 Subject: [PATCH] SWS-888 - Handle configuring max connections for secured routes When configuring max connections for a secured route, the HttpRoute is actually not secured. This causes an improper lookup. This change updates the test case to ensure several things are verified including the fix provided. --- .../http/HttpComponentsMessageSender.java | 9 +++- ...omponentsMessageSenderIntegrationTest.java | 42 +++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/spring-ws-core/src/main/java/org/springframework/ws/transport/http/HttpComponentsMessageSender.java b/spring-ws-core/src/main/java/org/springframework/ws/transport/http/HttpComponentsMessageSender.java index 1e3075ba..01436ea4 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/transport/http/HttpComponentsMessageSender.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/transport/http/HttpComponentsMessageSender.java @@ -51,6 +51,7 @@ import org.springframework.ws.transport.WebServiceConnection; * @author Alan Stewart * @author Barry Pitman * @author Arjen Poutsma + * @author Greg Turnquist * @see HttpClient * @since 2.1.0 */ @@ -195,7 +196,13 @@ public class HttpComponentsMessageSender extends AbstractHttpWebServiceMessageSe for (Map.Entry entry : maxConnectionsPerHost.entrySet()) { URI uri = new URI(entry.getKey()); HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme()); - HttpRoute route = new HttpRoute(host); + final HttpRoute route; + + if (uri.getScheme().equals("https")) { + route = new HttpRoute(host, null, true); + } else { + route = new HttpRoute(host); + } int max = Integer.parseInt(entry.getValue()); diff --git a/spring-ws-core/src/test/java/org/springframework/ws/transport/http/HttpComponentsMessageSenderIntegrationTest.java b/spring-ws-core/src/test/java/org/springframework/ws/transport/http/HttpComponentsMessageSenderIntegrationTest.java index fac7acb9..2a409712 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/transport/http/HttpComponentsMessageSenderIntegrationTest.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/transport/http/HttpComponentsMessageSenderIntegrationTest.java @@ -16,6 +16,9 @@ package org.springframework.ws.transport.http; +import static org.hamcrest.core.IsEqual.*; +import static org.springframework.test.util.MatcherAssertionErrors.*; + import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -28,6 +31,9 @@ import javax.servlet.http.HttpServletResponse; import javax.xml.soap.MessageFactory; import org.apache.commons.httpclient.URIException; +import org.apache.http.HttpHost; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.impl.conn.PoolingClientConnectionManager; import org.junit.Test; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; @@ -49,13 +55,43 @@ public class HttpComponentsMessageSenderIntegrationTest extends AbstractHttpWebS @Test public void testMaxConnections() throws URISyntaxException, URIException { + final String url1 = "https://www.example.com"; + URI uri1 = new URI(url1); + HttpHost host1 = new HttpHost(uri1.getHost(), uri1.getPort(), uri1.getScheme()); + HttpRoute route1 = new HttpRoute(host1, null, true); + assertThat(route1.isSecure(), equalTo(true)); + assertThat(route1.getTargetHost().getHostName(), equalTo("www.example.com")); + assertThat(route1.getTargetHost().getPort(), equalTo(-1)); + + final String url2 = "http://www.example.com:8080"; + URI uri2 = new URI(url2); + HttpHost host2 = new HttpHost(uri2.getHost(), uri2.getPort(), uri2.getScheme()); + HttpRoute route2 = new HttpRoute(host2); + assertThat(route2.isSecure(), equalTo(false)); + assertThat(route2.getTargetHost().getHostName(), equalTo("www.example.com")); + assertThat(route2.getTargetHost().getPort(), equalTo(8080)); + + final String url3 = "http://www.springframework.org"; + URI uri3 = new URI(url3); + HttpHost host3 = new HttpHost(uri3.getHost(), uri3.getPort(), uri3.getScheme()); + HttpRoute route3 = new HttpRoute(host3); + assertThat(route3.isSecure(), equalTo(false)); + assertThat(route3.getTargetHost().getHostName(), equalTo("www.springframework.org")); + assertThat(route3.getTargetHost().getPort(), equalTo(-1)); + HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); messageSender.setMaxTotalConnections(2); Map maxConnectionsPerHost = new HashMap(); - maxConnectionsPerHost.put("https://www.example.com", "1"); - maxConnectionsPerHost.put("http://www.example.com:8080", "7"); - maxConnectionsPerHost.put("http://www.springframework.org", "10"); + maxConnectionsPerHost.put(url1, "1"); + maxConnectionsPerHost.put(url2, "7"); + maxConnectionsPerHost.put(url3, "10"); messageSender.setMaxConnectionsPerHost(maxConnectionsPerHost); + + PoolingClientConnectionManager poolingClientConnectionManager = + (PoolingClientConnectionManager) messageSender.getHttpClient().getConnectionManager(); + assertThat(poolingClientConnectionManager.getMaxPerRoute(route1), equalTo(1)); + assertThat(poolingClientConnectionManager.getMaxPerRoute(route2), equalTo(7)); + assertThat(poolingClientConnectionManager.getMaxPerRoute(route3), equalTo(10)); } @Test