/* * 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.jmeter.protocol.http.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.net.URI; import java.net.URL; import org.junit.Test; public class TestHTTPUtils { @Test public void testgetEncoding() throws Exception { assertNull(ConversionUtils.getEncodingFromContentType("xyx")); assertEquals("utf8",ConversionUtils.getEncodingFromContentType("charset=utf8")); assertEquals("utf8",ConversionUtils.getEncodingFromContentType("charset=\"utf8\"")); assertEquals("utf8",ConversionUtils.getEncodingFromContentType("text/plain ;charset=utf8")); assertEquals("utf8",ConversionUtils.getEncodingFromContentType("text/html ;charset=utf8;charset=def")); assertNull(ConversionUtils.getEncodingFromContentType("charset=")); assertNull(ConversionUtils.getEncodingFromContentType(";charset=;")); assertNull(ConversionUtils.getEncodingFromContentType(";charset=no-such-charset;")); } @Test public void testMakeRelativeURL() throws Exception { URL base = new URL("http://192.168.0.1/a/b/c"); // Trailing file assertEquals(new URL("http://192.168.0.1/a/b/d"),ConversionUtils.makeRelativeURL(base,"d")); assertEquals(new URL("http://192.168.0.1/a/d"),ConversionUtils.makeRelativeURL(base,"../d")); assertEquals(new URL("http://192.168.0.1/d"),ConversionUtils.makeRelativeURL(base,"../../d")); assertEquals(new URL("http://192.168.0.1/d"),ConversionUtils.makeRelativeURL(base,"../../../d")); assertEquals(new URL("http://192.168.0.1/d"),ConversionUtils.makeRelativeURL(base,"../../../../d")); assertEquals(new URL("http://192.168.0.1/../d"),ConversionUtils.makeRelativeURL(base,"/../d")); assertEquals(new URL("http://192.168.0.1/a/b/d"),ConversionUtils.makeRelativeURL(base,"./d")); } @Test public void testMakeRelativeURL2() throws Exception { URL base = new URL("http://192.168.0.1/a/b/c/"); // Trailing directory assertEquals(new URL("http://192.168.0.1/a/b/c/d"),ConversionUtils.makeRelativeURL(base,"d")); assertEquals(new URL("http://192.168.0.1/a/b/d"),ConversionUtils.makeRelativeURL(base,"../d")); assertEquals(new URL("http://192.168.0.1/a/d"),ConversionUtils.makeRelativeURL(base,"../../d")); assertEquals(new URL("http://192.168.0.1/d"),ConversionUtils.makeRelativeURL(base,"../../../d")); assertEquals(new URL("http://192.168.0.1/d"),ConversionUtils.makeRelativeURL(base,"../../../../d")); assertEquals(new URL("http://192.168.0.1/../d"),ConversionUtils.makeRelativeURL(base,"/../d")); assertEquals(new URL("http://192.168.0.1/a/b/c/d"),ConversionUtils.makeRelativeURL(base,"./d")); } // Test that location urls with a protocol are passed unchanged @Test public void testMakeRelativeURL3() throws Exception { URL base = new URL("http://ahost.invalid/a/b/c"); assertEquals(new URL("http://host.invalid/e"),ConversionUtils.makeRelativeURL(base ,"http://host.invalid/e")); assertEquals(new URL("https://host.invalid/e"),ConversionUtils.makeRelativeURL(base ,"https://host.invalid/e")); assertEquals(new URL("http://host.invalid:8081/e"),ConversionUtils.makeRelativeURL(base ,"http://host.invalid:8081/e")); assertEquals(new URL("https://host.invalid:8081/e"),ConversionUtils.makeRelativeURL(base ,"https://host.invalid:8081/e")); } @Test public void testRemoveSlashDotDot() { assertEquals("/path/", ConversionUtils.removeSlashDotDot("/path/")); assertEquals("http://host/", ConversionUtils.removeSlashDotDot("http://host/")); assertEquals("http://host/one", ConversionUtils.removeSlashDotDot("http://host/one")); assertEquals("/two", ConversionUtils.removeSlashDotDot("/one/../two")); assertEquals("http://host:8080/two", ConversionUtils.removeSlashDotDot("http://host:8080/one/../two")); assertEquals("http://host:8080/two/", ConversionUtils.removeSlashDotDot("http://host:8080/one/../two/")); assertEquals("http://usr@host:8080/two/", ConversionUtils.removeSlashDotDot("http://usr@host:8080/one/../two/")); assertEquals("http://host:8080/two/?query#anchor", ConversionUtils.removeSlashDotDot("http://host:8080/one/../two/?query#anchor")); assertEquals("one", ConversionUtils.removeSlashDotDot("one/two/..")); assertEquals("../../path", ConversionUtils.removeSlashDotDot("../../path")); assertEquals("/", ConversionUtils.removeSlashDotDot("/one/..")); assertEquals("/", ConversionUtils.removeSlashDotDot("/one/../")); assertEquals("/?a", ConversionUtils.removeSlashDotDot("/one/..?a")); assertEquals("http://host/one", ConversionUtils.removeSlashDotDot("http://host/one/../one")); assertEquals("http://host/one/two", ConversionUtils.removeSlashDotDot("http://host/one/two/../../one/two")); assertEquals("http://host/..", ConversionUtils.removeSlashDotDot("http://host/..")); assertEquals("http://host/../abc", ConversionUtils.removeSlashDotDot("http://host/../abc")); } @Test public void testsanitizeUrl() throws Exception { testSanitizeUrl("http://localhost/", "http://localhost/"); // normal, no encoding needed testSanitizeUrl("http://localhost/a/b/c%7Cd", "http://localhost/a/b/c|d"); // pipe needs encoding testSanitizeUrl("http://localhost:8080/%5B%5D", "http://localhost:8080/%5B%5D"); // already encoded testSanitizeUrl("http://localhost:8080/?%5B%5D", "http://localhost:8080/?%5B%5D"); //already encoded testSanitizeUrl("http://localhost:8080/?!£$*():@~;'%22%25%5E%7B%7D[]%3C%3E%7C%5C#", "http://localhost:8080/?!£$*():@~;'\"%^{}[]<>|\\#"); // unencoded query testSanitizeUrl("http://localhost:8080/?!£$*():@~;'%22%25%5E%7B%7D[]%3C%3E%7C%5C#", "http://localhost:8080/?!£$*():@~;'%22%25%5E%7B%7D[]%3C%3E%7C%5C#"); // encoded testSanitizeUrl("http://localhost:8080/!£$*():@~;'%22%25%5E%7B%7D%5B%5D%3C%3E%7C%5C#", "http://localhost:8080/!£$*():@~;'\"%^{}[]<>|\\#"); // unencoded path testSanitizeUrl("http://localhost:8080/!£$*():@~;'%22%25%5E%7B%7D%5B%5D%3C%3E%7C%5C#", "http://localhost:8080/!£$*():@~;'%22%25%5E%7B%7D%5B%5D%3C%3E%7C%5C#"); // encoded testSanitizeUrl("http://localhost/?%2525%255B%255D!@$%25%5E*()#", "http://localhost/?%25%5B%5D!@$%^*()#"); testSanitizeUrl("http://localhost/?%2525%255B%255D!@$%25%5E*()#", "http://localhost/?%2525%255B%255D!@$%25%5E*()#"); testSanitizeUrl("http://localhost/%255B%255D?[]!@$%25%5E*()#", "http://localhost/%5B%5D?[]!@$%^*()#"); testSanitizeUrl("http://localhost/%255B%255D?[]!@$%25%5E*()#", "http://localhost/%255B%255D?[]!@$%25%5E*()#"); testSanitizeUrl("http://localhost/IqGo6EM1JEVZ+MSRJqUSo@qhjVMSFBTs/37/0/1", "http://localhost/IqGo6EM1JEVZ+MSRJqUSo@qhjVMSFBTs/37/0/1"); testSanitizeUrl("http://localhost/test?getItem=%7BsomeID%7D", "http://localhost/test?getItem={someID}"); } private void testSanitizeUrl(String expected, String input) throws Exception { final URL url = new URL(input); final URI uri = new URI(expected); assertEquals(uri, ConversionUtils.sanitizeUrl(url)); } }