Repository: tomee Updated Branches: refs/heads/master 52067addf -> 61c6522b3
TOMEE-1980 supporting basic.username and basic.password in the http url (provider url) Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/61c6522b Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/61c6522b Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/61c6522b Branch: refs/heads/master Commit: 61c6522b32b7b77ba0ec42b8155bc6863d826121 Parents: 52067ad Author: rmannibucau <[email protected]> Authored: Mon Dec 5 11:48:38 2016 +0100 Committer: rmannibucau <[email protected]> Committed: Mon Dec 5 11:48:38 2016 +0100 ---------------------------------------------------------------------- .../openejb/client/HttpConnectionFactory.java | 37 +++++++++++++++---- .../openejb/client/HttpConnectionTest.java | 38 +++++++++++++++++++- 2 files changed, 67 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/61c6522b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java ---------------------------------------------------------------------- diff --git a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java index a623a22..2abca67 100644 --- a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java +++ b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java @@ -26,6 +26,7 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Map; @@ -34,6 +35,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; +import static javax.xml.bind.DatatypeConverter.printBase64Binary; + /** * @version $Revision$ $Date$ */ @@ -75,10 +78,26 @@ public class HttpConnectionFactory implements ConnectionFactory { throw new IllegalArgumentException("Invalid uri " + uri.toString(), e); } - final String authorization = params.get("authorization"); + final String basicUsername = params.get("basic.username"); + final String basicPassword = params.get("basic.password"); + final String authorizationHeader = params.get("authorizationHeader"); + String authorization = params.get("authorization"); + if (authorization != null && basicUsername != null) { + throw new IllegalArgumentException("You can't set basic.* properties AND authorization on the provider url"); + } + if (authorization == null && basicUsername != null) { + authorization = "Basic " + printBase64Binary((basicUsername + (basicPassword != null ? ":" + basicPassword : "")).getBytes(StandardCharsets.UTF_8)); + } - httpURLConnection = (HttpURLConnection) (authorization == null ? - url : new URL(stripQuery(url.toExternalForm(), "authorization"))).openConnection(); + final String newUrl = + stripQuery( + stripQuery( + stripQuery( + stripQuery(url.toExternalForm(), "authorization"), + "basic.username"), + "basic.password"), + "authorizationHeader"); + httpURLConnection = (HttpURLConnection) (authorization == null ? url : new URL(newUrl)).openConnection(); httpURLConnection.setDoOutput(true); final int timeout; @@ -94,7 +113,7 @@ public class HttpConnectionFactory implements ConnectionFactory { httpURLConnection.setReadTimeout(Integer.parseInt(params.get("readTimeout"))); } if (authorization != null) { - httpURLConnection.setRequestProperty("Authorization", authorization); + httpURLConnection.setRequestProperty(authorizationHeader == null ? "Authorization" : authorizationHeader, authorization); } if (params.containsKey("sslKeyStore") || params.containsKey("sslTrustStore")) { @@ -125,11 +144,15 @@ public class HttpConnectionFactory implements ConnectionFactory { String result = url; do { final int h = result.indexOf(param + '='); - final int end = result.indexOf('&', h); + int end = result.indexOf('&', h); + if (end < 0) { + end = result.length(); + } if (h <= 0) { - return result; + return result.endsWith("?") ? result.substring(0, result.length() - 1) : result; } - result = result.substring(0, h - 1) + (end < 0 ? "" : result.substring(end + 1, result.length())); + result = result.substring(0, h) + + (end < 0 || end == result.length() ? "" : result.substring(end + 1, result.length())); } while (true); } http://git-wip-us.apache.org/repos/asf/tomee/blob/61c6522b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java ---------------------------------------------------------------------- diff --git a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java index 1f6717e..4df016a 100644 --- a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java +++ b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpConnectionTest.java @@ -56,6 +56,10 @@ public class HttpConnectionTest { if (authorization != null) { responseBody.write(authorization.getBytes("UTF-8")); } + final String authorization2 = exchange.getRequestHeaders().getFirst("AltAuthorization"); + if (authorization2 != null) { + responseBody.write(("alt" + authorization2).getBytes("UTF-8")); + } responseBody.close(); } }); @@ -132,6 +136,38 @@ public class HttpConnectionTest { } @Test + public void httpBasicSpecificConfig() throws URISyntaxException, IOException { + final HttpConnectionFactory factory = new HttpConnectionFactory(); + final String url = "http://localhost:" + server.getAddress().getPort() + "/e?basic.password=pwd&basic.username=test&authorizationHeader=AltAuthorization"; + for (int i = 0; i < 3; i++) { + final Connection connection = factory.getConnection(new URI(url)); + + BufferedReader br = null; + final StringBuilder sb = new StringBuilder(); + String line; + try { + br = new BufferedReader(new InputStreamReader(connection.getInputStream())); + while ((line = br.readLine()) != null) { + sb.append(line); + } + } catch (final IOException e) { + e.printStackTrace(); + } finally { + if (br != null) { + try { + br.close(); + } catch (final IOException e) { + e.printStackTrace(); + } + } + connection.close(); + } + + Assert.assertTrue("should contain", sb.toString().contains("secure pagealtBasic dGVzdDpwd2Q=")); + } + } + + @Test public void complexURIAuthorization() throws IOException, URISyntaxException { final String baseHttp = "http://localhost:" + server.getAddress().getPort() + "/e?authorization="; final String uri = "failover:sticky+random:" + baseHttp + "Basic%20ABCD&" + baseHttp + "Basic%20EFG"; @@ -157,6 +193,6 @@ public class HttpConnectionTest { connection.close(); } final String out = sb.toString(); - Assert.assertTrue(out, out.contains("secure pageBasic ABCD")); + Assert.assertTrue(out, out.contains("secure pagehttp://localhost:" + server.getAddress().getPort() + "/eBasic ABCD")); } }
