//
// ========================================================================
// Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.http;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import org.eclipse.jetty.util.MultiMap;
import org.junit.Test;
public class HttpURITest
{
@Test
public void testExample() throws Exception
{
HttpURI uri = new HttpURI("http://user:password@host:8888/ignored/../p%61th;ignored/info;param?query=value#fragment");
assertThat(uri.getScheme(),is("http"));
assertThat(uri.getUser(),is("user:password"));
assertThat(uri.getHost(),is("host"));
assertThat(uri.getPort(),is(8888));
assertThat(uri.getPath(),is("/ignored/../p%61th;ignored/info;param"));
assertThat(uri.getDecodedPath(),is("/path/info"));
assertThat(uri.getParam(),is("param"));
assertThat(uri.getQuery(),is("query=value"));
assertThat(uri.getFragment(),is("fragment"));
assertThat(uri.getAuthority(),is("host:8888"));
}
@Test
public void testInvalidAddress() throws Exception
{
assertInvalidURI("http://[ffff::1:8080/", "Invalid URL; no closing ']' -- should throw exception");
assertInvalidURI("**", "only '*', not '**'");
assertInvalidURI("*/", "only '*', not '*/'");
}
private void assertInvalidURI(String invalidURI, String message)
{
HttpURI uri = new HttpURI();
try
{
uri.parse(invalidURI);
fail(message);
}
catch (IllegalArgumentException e)
{
assertTrue(true);
}
}
@Test
public void testParse()
{
HttpURI uri = new HttpURI();
uri.parse("*");
assertThat(uri.getHost(),nullValue());
assertThat(uri.getPath(),is("*"));
uri.parse("/foo/bar");
assertThat(uri.getHost(),nullValue());
assertThat(uri.getPath(),is("/foo/bar"));
uri.parse("//foo/bar");
assertThat(uri.getHost(),is("foo"));
assertThat(uri.getPath(),is("/bar"));
uri.parse("http://foo/bar");
assertThat(uri.getHost(),is("foo"));
assertThat(uri.getPath(),is("/bar"));
}
@Test
public void testParseRequestTarget()
{
HttpURI uri = new HttpURI();
uri.parseRequestTarget("GET","*");
assertThat(uri.getHost(),nullValue());
assertThat(uri.getPath(),is("*"));
uri.parseRequestTarget("GET","/foo/bar");
assertThat(uri.getHost(),nullValue());
assertThat(uri.getPath(),is("/foo/bar"));
uri.parseRequestTarget("GET","//foo/bar");
assertThat(uri.getHost(),nullValue());
assertThat(uri.getPath(),is("//foo/bar"));
uri.parseRequestTarget("GET","http://foo/bar");
assertThat(uri.getHost(),is("foo"));
assertThat(uri.getPath(),is("/bar"));
}
@Test
public void testExtB() throws Exception
{
for (String value: new String[]{"a","abcdABCD","\u00C0","\u697C","\uD869\uDED5","\uD840\uDC08"} )
{
HttpURI uri = new HttpURI("/path?value="+URLEncoder.encode(value,"UTF-8"));
MultiMap<String> parameters = new MultiMap<>();
uri.decodeQueryTo(parameters,StandardCharsets.UTF_8);
assertEquals(value,parameters.getString("value"));
}
}
@Test
public void testAt() throws Exception
{
HttpURI uri = new HttpURI("/@foo/bar");
assertEquals("/@foo/bar",uri.getPath());
}
@Test
public void testParams() throws Exception
{
HttpURI uri = new HttpURI("/foo/bar");
assertEquals("/foo/bar",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
assertEquals(null,uri.getParam());
uri = new HttpURI("/foo/bar;jsessionid=12345");
assertEquals("/foo/bar;jsessionid=12345",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
assertEquals("jsessionid=12345",uri.getParam());
uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345");
assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
assertEquals("jsessionid=12345",uri.getParam());
uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345?name=value");
assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
assertEquals("jsessionid=12345",uri.getParam());
uri = new HttpURI("/foo;abc=123/bar;jsessionid=12345#target");
assertEquals("/foo;abc=123/bar;jsessionid=12345",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
assertEquals("jsessionid=12345",uri.getParam());
}
@Test
public void testMutableURI()
{
HttpURI uri = new HttpURI("/foo/bar");
assertEquals("/foo/bar",uri.toString());
assertEquals("/foo/bar",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
uri.setScheme("http");
assertEquals("http:/foo/bar",uri.toString());
assertEquals("/foo/bar",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
uri.setAuthority("host",0);
assertEquals("http://host/foo/bar",uri.toString());
assertEquals("/foo/bar",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
uri.setAuthority("host",8888);
assertEquals("http://host:8888/foo/bar",uri.toString());
assertEquals("/foo/bar",uri.getPath());
assertEquals("/foo/bar",uri.getDecodedPath());
uri.setPathQuery("/f%30%30;p0/bar;p1;p2");
assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2",uri.toString());
assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
assertEquals("/f00/bar",uri.getDecodedPath());
assertEquals("p2",uri.getParam());
assertEquals(null,uri.getQuery());
uri.setPathQuery("/f%30%30;p0/bar;p1;p2?name=value");
assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2?name=value",uri.toString());
assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
assertEquals("/f00/bar",uri.getDecodedPath());
assertEquals("p2",uri.getParam());
assertEquals("name=value",uri.getQuery());
uri.setQuery("other=123456");
assertEquals("http://host:8888/f%30%30;p0/bar;p1;p2?other=123456",uri.toString());
assertEquals("/f%30%30;p0/bar;p1;p2",uri.getPath());
assertEquals("/f00/bar",uri.getDecodedPath());
assertEquals("p2",uri.getParam());
assertEquals("other=123456",uri.getQuery());
}
@Test
public void testSchemeAndOrAuthority() throws Exception
{
HttpURI uri = new HttpURI("/path/info");
assertEquals("/path/info",uri.toString());
uri.setAuthority("host",0);
assertEquals("//host/path/info",uri.toString());
uri.setAuthority("host",8888);
assertEquals("//host:8888/path/info",uri.toString());
uri.setScheme("http");
assertEquals("http://host:8888/path/info",uri.toString());
uri.setAuthority(null,0);
assertEquals("http:/path/info",uri.toString());
}
@Test
public void testBasicAuthCredentials() throws Exception
{
HttpURI uri = new HttpURI("http://user:password@example.com:8888/blah");
assertEquals("http://user:password@example.com:8888/blah", uri.toString());
assertEquals(uri.getAuthority(), "example.com:8888");
assertEquals(uri.getUser(), "user:password");
}
@Test
public void testCanonicalDecoded() throws Exception
{
HttpURI uri = new HttpURI("/path/.info");
assertEquals("/path/.info",uri.getDecodedPath());
uri = new HttpURI("/path/./info");
assertEquals("/path/info",uri.getDecodedPath());
uri = new HttpURI("/path/../info");
assertEquals("/info",uri.getDecodedPath());
uri = new HttpURI("/./path/info.");
assertEquals("/path/info.",uri.getDecodedPath());
uri = new HttpURI("./path/info/.");
assertEquals("path/info/",uri.getDecodedPath());
uri = new HttpURI("http://host/path/.info");
assertEquals("/path/.info",uri.getDecodedPath());
uri = new HttpURI("http://host/path/./info");
assertEquals("/path/info",uri.getDecodedPath());
uri = new HttpURI("http://host/path/../info");
assertEquals("/info",uri.getDecodedPath());
uri = new HttpURI("http://host/./path/info.");
assertEquals("/path/info.",uri.getDecodedPath());
uri = new HttpURI("http:./path/info/.");
assertEquals("path/info/",uri.getDecodedPath());
}
}