diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 6167a223778..a103a453282 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -798,6 +798,9 @@ Release 2.1.0-beta - 2013-07-02 HADOOP-9665. Fixed BlockDecompressorStream#decompress to return -1 rather than throw EOF at end of file. (Zhijie Shen via acmurthy) + HADOOP-8440. HarFileSystem.decodeHarURI fails for URIs whose host contains + numbers. (Ivan Mitic via cnauroth) + Release 2.0.5-alpha - 06/06/2013 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/HarFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/HarFileSystem.java index a82fba7068f..9f67a137ae5 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/HarFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/HarFileSystem.java @@ -204,35 +204,36 @@ public class HarFileSystem extends FilterFileSystem { //create a path return FileSystem.getDefaultUri(conf); } - String host = rawURI.getHost(); - if (host == null) { + String authority = rawURI.getAuthority(); + if (authority == null) { throw new IOException("URI: " + rawURI - + " is an invalid Har URI since host==null." + + " is an invalid Har URI since authority==null." + " Expecting har://-/."); } - int i = host.indexOf('-'); + + int i = authority.indexOf('-'); if (i < 0) { throw new IOException("URI: " + rawURI + " is an invalid Har URI since '-' not found." + " Expecting har://-/."); } - final String underLyingScheme = host.substring(0, i); - i++; - final String underLyingHost = i == host.length()? null: host.substring(i); - int underLyingPort = rawURI.getPort(); - String auth = (underLyingHost == null && underLyingPort == -1)? - null:(underLyingHost+ - (underLyingPort == -1 ? "" : ":"+underLyingPort)); - URI tmp = null; + if (rawURI.getQuery() != null) { // query component not allowed throw new IOException("query component in Path not supported " + rawURI); } + + URI tmp = null; + try { - tmp = new URI(underLyingScheme, auth, rawURI.getPath(), - rawURI.getQuery(), rawURI.getFragment()); + // convert - to :// + URI baseUri = new URI(authority.replaceFirst("-", "://")); + + tmp = new URI(baseUri.getScheme(), baseUri.getAuthority(), + rawURI.getPath(), rawURI.getQuery(), rawURI.getFragment()); } catch (URISyntaxException e) { - // do nothing should not happen + throw new IOException("URI: " + rawURI + + " is an invalid Har URI. Expecting har://-/."); } return tmp; } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestHarFileSystem.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestHarFileSystem.java index 92c6c0556bc..753e9cf0c10 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestHarFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestHarFileSystem.java @@ -33,6 +33,8 @@ public class TestHarFileSystem { checkInvalidPath("har://hdfs/foo.har", conf); checkInvalidPath("har://-hdfs/foo.har", conf); checkInvalidPath("har://-/foo.har", conf); + checkInvalidPath("har://127.0.0.1-/foo.har", conf); + checkInvalidPath("har://127.0.0.1/foo.har", conf); } static void checkInvalidPath(String s, Configuration conf) {