HTTPCLIENT-1440: 'file' scheme in redirect location URI causes NPE.

Contributed by James Leigh <james at 3roundstones dot com>

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1546315 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2013-11-28 08:57:04 +00:00
parent 037b915bd0
commit 9cc7c1acec
3 changed files with 19 additions and 1 deletions

View File

@ -1,6 +1,9 @@
Changes since 4.3.1 Changes since 4.3.1
------------------- -------------------
* [HTTPCLIENT-1440] 'file' scheme in redirect location URI causes NPE.
Contributed by James Leigh <james at 3roundstones dot com>
* [HTTPCLIENT-1437] Made Executor#execute thread safe. * [HTTPCLIENT-1437] Made Executor#execute thread safe.
Contributed by Oleg Kalnichevski <olegk at apache.org> Contributed by Oleg Kalnichevski <olegk at apache.org>

View File

@ -259,7 +259,8 @@ public class URIUtils {
* @return the URI without dot segments * @return the URI without dot segments
*/ */
private static URI normalizeSyntax(final URI uri) { private static URI normalizeSyntax(final URI uri) {
if (uri.isOpaque()) { if (uri.isOpaque() || uri.getAuthority() == null) {
// opaque and file: URIs
return uri; return uri;
} }
Args.check(uri.isAbsolute(), "Base URI must be absolute"); Args.check(uri.isAbsolute(), "Base URI must be absolute");

View File

@ -173,6 +173,20 @@ public class TestURIUtils {
"http://s/mid/content=5/../6").toString()); "http://s/mid/content=5/../6").toString());
} }
@Test
public void testResolveOpaque() {
Assert.assertEquals("example://a/b/c/%7Bfoo%7D", URIUtils.resolve(this.baseURI, "eXAMPLE://a/./b/../b/%63/%7bfoo%7d").toString());
Assert.assertEquals("file://localhost/etc/fstab", URIUtils.resolve(this.baseURI, "file://localhost/etc/fstab").toString());
Assert.assertEquals("file:///etc/fstab", URIUtils.resolve(this.baseURI, "file:///etc/fstab").toString());
Assert.assertEquals("file://localhost/c:/WINDOWS/clock.avi", URIUtils.resolve(this.baseURI, "file://localhost/c:/WINDOWS/clock.avi").toString());
Assert.assertEquals("file:///c:/WINDOWS/clock.avi", URIUtils.resolve(this.baseURI, "file:///c:/WINDOWS/clock.avi").toString());
Assert.assertEquals("file://hostname/path/to/the%20file.txt", URIUtils.resolve(this.baseURI, "file://hostname/path/to/the%20file.txt").toString());
Assert.assertEquals("file:///c:/path/to/the%20file.txt", URIUtils.resolve(this.baseURI, "file:///c:/path/to/the%20file.txt").toString());
Assert.assertEquals("urn:issn:1535-3613", URIUtils.resolve(this.baseURI, "urn:issn:1535-3613").toString());
Assert.assertEquals("mailto:user@example.com", URIUtils.resolve(this.baseURI, "mailto:user@example.com").toString());
Assert.assertEquals("ftp://example.org/resource.txt", URIUtils.resolve(this.baseURI, "ftp://example.org/resource.txt").toString());
}
@Test @Test
public void testExtractHost() throws Exception { public void testExtractHost() throws Exception {
Assert.assertEquals(new HttpHost("localhost"), Assert.assertEquals(new HttpHost("localhost"),