blob: 93e408c19b23adc678b7ef77fad98265baa51c31 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.util;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.camel.ContextTestSupport;
/**
* @version
*/
public class URISupportTest extends ContextTestSupport {
public void testNormalizeEndpointUri() throws Exception {
String out1 = URISupport.normalizeUri("smtp://localhost?username=davsclaus&password=secret");
String out2 = URISupport.normalizeUri("smtp://localhost?password=secret&username=davsclaus");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("smtp://localhost?username=davsclaus&password=secret");
out2 = URISupport.normalizeUri("smtp:localhost?password=secret&username=davsclaus");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("smtp:localhost?password=secret&username=davsclaus");
out2 = URISupport.normalizeUri("smtp://localhost?username=davsclaus&password=secret");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("seda:foo?concurrentConsumer=2");
out2 = URISupport.normalizeUri("seda:foo?concurrentConsumer=2");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("seda:foo?concurrentConsumer=2");
out2 = URISupport.normalizeUri("seda:foo");
assertNotSame(out1, out2);
out1 = URISupport.normalizeUri("foo:?test=1");
out2 = URISupport.normalizeUri("foo://?test=1");
assertEquals("foo://?test=1", out2);
assertEquals(out1, out2);
}
public void testNormalizeEndpointUriNoParam() throws Exception {
String out1 = URISupport.normalizeUri("direct:foo");
String out2 = URISupport.normalizeUri("direct:foo");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("direct://foo");
out2 = URISupport.normalizeUri("direct://foo");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("direct:foo");
out2 = URISupport.normalizeUri("direct://foo");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("direct://foo");
out2 = URISupport.normalizeUri("direct:foo");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("direct://foo");
out2 = URISupport.normalizeUri("direct:bar");
assertNotSame(out1, out2);
}
public void testNormalizeEndpointUriWithFragments() throws Exception {
String out1 = URISupport.normalizeUri("irc://someserver/#camel?user=davsclaus");
String out2 = URISupport.normalizeUri("irc:someserver/#camel?user=davsclaus");
assertEquals(out1, out2);
out1 = URISupport.normalizeUri("irc://someserver/#camel?user=davsclaus");
out2 = URISupport.normalizeUri("irc:someserver/#camel?user=hadrian");
assertNotSame(out1, out2);
}
public void testNormalizeHttpEndpoint() throws Exception {
String out1 = URISupport.normalizeUri("http://www.google.com?q=Camel");
String out2 = URISupport.normalizeUri("http:www.google.com?q=Camel");
assertEquals(out1, out2);
assertTrue("Should have //", out1.startsWith("http://"));
assertTrue("Should have //", out2.startsWith("http://"));
}
public void testNormalizeIPv6HttpEndpoint() throws Exception {
String result = URISupport.normalizeUri("http://[2a00:8a00:6000:40::1413]:30300/test");
assertEquals("http://[2a00:8a00:6000:40::1413]:30300/test", result);
}
public void testNormalizeHttpEndpointUnicodedParameter() throws Exception {
String out = URISupport.normalizeUri("http://www.google.com?q=S\u00F8ren");
assertEquals("http://www.google.com?q=S%C3%B8ren", out);
}
public void testParseParametersUnicodedValue() throws Exception {
String out = URISupport.normalizeUri("http://www.google.com?q=S\u00F8ren");
URI uri = new URI(out);
Map<String, Object> parameters = URISupport.parseParameters(uri);
assertEquals(1, parameters.size());
assertEquals("S\u00F8ren", parameters.get("q"));
}
public void testNormalizeHttpEndpointURLEncodedParameter() throws Exception {
String out = URISupport.normalizeUri("http://www.google.com?q=S%C3%B8ren%20Hansen");
assertEquals("http://www.google.com?q=S%C3%B8ren+Hansen", out);
}
public void testParseParametersURLEncodeddValue() throws Exception {
String out = URISupport.normalizeUri("http://www.google.com?q=S%C3%B8ren+Hansen");
URI uri = new URI(out);
Map<String, Object> parameters = URISupport.parseParameters(uri);
assertEquals(1, parameters.size());
assertEquals("S\u00F8ren Hansen", parameters.get("q"));
}
public void testNormalizeUriWhereParamererIsFaulty() throws Exception {
String out = URISupport.normalizeUri("stream:uri?file:///d:/temp/data/log/quickfix.log&scanStream=true");
assertNotNull(out);
}
public void testCreateRemaingURI() throws Exception {
URI original = new URI("http://camel.apache.org");
Map<String, Object> param = new HashMap<String, Object>();
param.put("foo", "123");
URI newUri = URISupport.createRemainingURI(original, param);
assertNotNull(newUri);
String s = newUri.toString();
assertEquals("http://camel.apache.org?foo=123", s);
}
public void testCreateURIWithQueryHasOneFragment() throws Exception {
URI uri = new URI("smtp://localhost#fragmentOne");
URI resultUri = URISupport.createURIWithQuery(uri, null);
assertNotNull(resultUri);
assertEquals("smtp://localhost#fragmentOne", resultUri.toString());
}
public void testCreateURIWithQueryHasOneFragmentAndQueryParameter() throws Exception {
URI uri = new URI("smtp://localhost#fragmentOne");
URI resultUri = URISupport.createURIWithQuery(uri, "utm_campaign=launch");
assertNotNull(resultUri);
assertEquals("smtp://localhost?utm_campaign=launch#fragmentOne", resultUri.toString());
}
public void testNormalizeEndpointWithEqualSignInParameter() throws Exception {
String out = URISupport.normalizeUri("jms:queue:foo?selector=somekey='somevalue'&foo=bar");
assertNotNull(out);
// Camel will safe encode the URI
assertEquals("jms://queue:foo?foo=bar&selector=somekey%3D%27somevalue%27", out);
}
public void testNormalizeEndpointWithPercentSignInParameter() throws Exception {
String out = URISupport.normalizeUri("http://someendpoint?username=james&password=%25test");
assertNotNull(out);
// Camel will safe encode the URI
assertEquals("http://someendpoint?password=%25test&username=james", out);
}
public void testParseParameters() throws Exception {
URI u = new URI("quartz:myGroup/myTimerName?cron=0+0+*+*+*+?");
Map<String, Object> params = URISupport.parseParameters(u);
assertEquals(1, params.size());
assertEquals("0 0 * * * ?", params.get("cron"));
u = new URI("quartz:myGroup/myTimerName?cron=0+0+*+*+*+?&bar=123");
params = URISupport.parseParameters(u);
assertEquals(2, params.size());
assertEquals("0 0 * * * ?", params.get("cron"));
assertEquals("123", params.get("bar"));
}
public void testCreateRemainingURIEncoding() throws Exception {
// the uri is already encoded, but we create a new one with new query parameters
String uri = "http://localhost:23271/myapp/mytest?columns=name%2Ctotalsens%2Cupsens&username=apiuser";
// these are the parameters which is tricky to encode
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("foo", "abc def");
map.put("bar", "123,456");
map.put("name", "S\u00F8ren"); // danish letter
// create new uri with the parameters
URI out = URISupport.createRemainingURI(new URI(uri), map);
assertNotNull(out);
assertEquals("http://localhost:23271/myapp/mytest?foo=abc+def&bar=123%2C456&name=S%C3%B8ren", out.toString());
assertEquals("http://localhost:23271/myapp/mytest?foo=abc+def&bar=123%2C456&name=S%C3%B8ren", out.toASCIIString());
}
public void testNormalizeEndpointUriWithDualParameters() throws Exception {
String out1 = URISupport.normalizeUri("smtp://localhost?to=foo&to=bar&from=me");
assertEquals("smtp://localhost?from=me&to=foo&to=bar", out1);
String out2 = URISupport.normalizeUri("smtp://localhost?to=foo&to=bar&from=me&from=you");
assertEquals("smtp://localhost?from=me&from=you&to=foo&to=bar", out2);
}
public void testSanitizeUriWithUserInfo() {
String uri = "jt400://GEORGE:HARRISON@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.DTAQ";
String expected = "jt400://GEORGE:xxxxxx@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.DTAQ";
assertEquals(expected, URISupport.sanitizeUri(uri));
}
public void testSanitizePathWithUserInfo() {
String path = "GEORGE:HARRISON@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.PGM";
String expected = "GEORGE:xxxxxx@LIVERPOOL/QSYS.LIB/BEATLES.LIB/PENNYLANE.PGM";
assertEquals(expected, URISupport.sanitizePath(path));
}
public void testSanitizePathWithoutSensitiveInfoIsUnchanged() {
String path = "myhost:8080/mypath";
assertEquals(path, URISupport.sanitizePath(path));
}
public void testSanitizeUriWithRawPassword() {
String uri = "http://foo?username=me&password=RAW(me#@123)&foo=bar";
String expected = "http://foo?username=me&password=xxxxxx&foo=bar";
assertEquals(expected, URISupport.sanitizeUri(uri));
}
public void testSanitizeUriRawUnsafePassword() {
String uri = "sftp://localhost/target?password=RAW(beforeAmp&afterAmp)&username=jrandom";
String expected = "sftp://localhost/target?password=xxxxxx&username=jrandom";
assertEquals(expected, URISupport.sanitizeUri(uri));
}
public void testNormalizeEndpointUriWithUserInfoSpecialSign() throws Exception {
String out1 = URISupport.normalizeUri("ftp://us%40r:t%st@localhost:21000/tmp3/camel?foo=us@r");
assertEquals("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us%40r", out1);
String out2 = URISupport.normalizeUri("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us@r");
assertEquals("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us%40r", out2);
String out3 = URISupport.normalizeUri("ftp://us@r:t%st@localhost:21000/tmp3/camel?foo=us@r");
assertEquals("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us%40r", out3);
String out4 = URISupport.normalizeUri("ftp://us@r:t%25st@localhost:21000/tmp3/camel?foo=us@r");
assertEquals("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us%40r", out4);
}
public void testSpecialUriFromXmppComponent() throws Exception {
String out1 = URISupport.normalizeUri("xmpp://camel-user@localhost:123/test-user@localhost?password=secret&serviceName=someCoolChat");
assertEquals("xmpp://camel-user@localhost:123/test-user@localhost?password=secret&serviceName=someCoolChat", out1);
}
public void testRawParameter() throws Exception {
String out = URISupport.normalizeUri("xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(++?w0rd)&serviceName=some chat");
assertEquals("xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(++?w0rd)&serviceName=some+chat", out);
String out2 = URISupport.normalizeUri("xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(foo %% bar)&serviceName=some chat");
// Just make sure the RAW parameter can be resolved rightly, we need to replace the % into %25
assertEquals("xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(foo %25%25 bar)&serviceName=some+chat", out2);
}
public void testParseQuery() throws Exception {
Map<String, Object> map = URISupport.parseQuery("password=secret&serviceName=somechat");
assertEquals(2, map.size());
assertEquals("secret", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
map = URISupport.parseQuery("password=RAW(++?w0rd)&serviceName=somechat");
assertEquals(2, map.size());
assertEquals("RAW(++?w0rd)", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
map = URISupport.parseQuery("password=RAW(++?)w&rd)&serviceName=somechat");
assertEquals(2, map.size());
assertEquals("RAW(++?)w&rd)", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
map = URISupport.parseQuery("password=RAW(%2520w&rd)&serviceName=somechat");
assertEquals(2, map.size());
assertEquals("RAW(%2520w&rd)", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
}
public void testParseQueryLenient() throws Exception {
try {
URISupport.parseQuery("password=secret&serviceName=somechat&", false, false);
fail("Should have thrown exception");
} catch (URISyntaxException e) {
// expected
}
Map<String, Object> map = URISupport.parseQuery("password=secret&serviceName=somechat&", false, true);
assertEquals(2, map.size());
assertEquals("secret", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
}
public void testResolveRawParameterValues() throws Exception {
Map<String, Object> map = URISupport.parseQuery("password=secret&serviceName=somechat");
URISupport.resolveRawParameterValues(map);
assertEquals(2, map.size());
assertEquals("secret", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
map = URISupport.parseQuery("password=RAW(++?w0rd)&serviceName=somechat");
URISupport.resolveRawParameterValues(map);
assertEquals(2, map.size());
assertEquals("++?w0rd", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
map = URISupport.parseQuery("password=RAW(++?)w&rd)&serviceName=somechat");
URISupport.resolveRawParameterValues(map);
assertEquals(2, map.size());
assertEquals("++?)w&rd", map.get("password"));
assertEquals("somechat", map.get("serviceName"));
}
public void testAppendParameterToUriAndReplaceExistingOne() throws Exception {
Map<String, Object> newParameters = new HashMap<String, Object>();
newParameters.put("foo", "456");
newParameters.put("bar", "yes");
String newUri = URISupport.appendParametersToURI("stub:foo?foo=123", newParameters);
assertEquals("stub://foo?foo=456&bar=yes", newUri);
}
}