Author: szetszwo Date: Tue Jun 26 10:49:22 2012 New Revision: 1353928 URL: http://svn.apache.org/viewvc?rev=1353928&view=rev Log: HDFS-3516. Check content-type in WebHdfsFileSystem.
Modified: hadoop/common/branches/branch-1/CHANGES.txt hadoop/common/branches/branch-1/src/hdfs/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java Modified: hadoop/common/branches/branch-1/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1/CHANGES.txt?rev=1353928&r1=1353927&r2=1353928&view=diff ============================================================================== --- hadoop/common/branches/branch-1/CHANGES.txt (original) +++ hadoop/common/branches/branch-1/CHANGES.txt Tue Jun 26 10:49:22 2012 @@ -149,6 +149,8 @@ Release 1.1.0 - unreleased connections and RPC calls, and add MultipleLinearRandomRetry, a new retry policy. (szetszwo) + HDFS-3516. Check content-type in WebHdfsFileSystem. (szetszwo) + BUG FIXES MAPREDUCE-4087. [Gridmix] GenerateDistCacheData job of Gridmix can Modified: hadoop/common/branches/branch-1/src/hdfs/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1/src/hdfs/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java?rev=1353928&r1=1353927&r2=1353928&view=diff ============================================================================== --- hadoop/common/branches/branch-1/src/hdfs/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java (original) +++ hadoop/common/branches/branch-1/src/hdfs/org/apache/hadoop/hdfs/web/WebHdfsFileSystem.java Tue Jun 26 10:49:22 2012 @@ -32,6 +32,8 @@ import java.net.URL; import java.util.Map; import java.util.StringTokenizer; +import javax.ws.rs.core.MediaType; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -234,9 +236,23 @@ public class WebHdfsFileSystem extends F return f.isAbsolute()? f: new Path(workingDir, f); } - static Map<?, ?> jsonParse(final InputStream in) throws IOException { + static Map<?, ?> jsonParse(final HttpURLConnection c, final boolean useErrorStream + ) throws IOException { + if (c.getContentLength() == 0) { + return null; + } + final InputStream in = useErrorStream? c.getErrorStream(): c.getInputStream(); if (in == null) { - throw new IOException("The input stream is null."); + throw new IOException("The " + (useErrorStream? "error": "input") + " stream is null."); + } + final String contentType = c.getContentType(); + if (contentType != null) { + final MediaType parsed = MediaType.valueOf(contentType); + if (!MediaType.APPLICATION_JSON_TYPE.isCompatible(parsed)) { + throw new IOException("Content-Type \"" + contentType + + "\" is incompatible with \"" + MediaType.APPLICATION_JSON + + "\" (parsed=\"" + parsed + "\")"); + } } return (Map<?, ?>)JSON.parse(new InputStreamReader(in)); } @@ -247,7 +263,7 @@ public class WebHdfsFileSystem extends F if (code != op.getExpectedHttpResponseCode()) { final Map<?, ?> m; try { - m = jsonParse(conn.getErrorStream()); + m = jsonParse(conn, true); } catch(IOException e) { throw new IOException("Unexpected HTTP response: code=" + code + " != " + op.getExpectedHttpResponseCode() + ", " + op.toQueryString() @@ -403,7 +419,7 @@ public class WebHdfsFileSystem extends F final HttpURLConnection conn = httpConnect(op, fspath, parameters); try { final Map<?, ?> m = validateResponse(op, conn); - return m != null? m: jsonParse(conn.getInputStream()); + return m != null? m: jsonParse(conn, false); } finally { conn.disconnect(); } Modified: hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java?rev=1353928&r1=1353927&r2=1353928&view=diff ============================================================================== --- hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java (original) +++ hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java Tue Jun 26 10:49:22 2012 @@ -293,6 +293,10 @@ public class TestWebHdfsFileSystemContra final Path root = new Path("/"); final Path dir = new Path("/test/testUrl"); assertTrue(webhdfs.mkdirs(dir)); + final Path file = new Path("/test/file"); + final FSDataOutputStream out = webhdfs.create(file); + out.write(1); + out.close(); {//test GETHOMEDIRECTORY final URL url = webhdfs.toUrl(GetOpParam.Op.GETHOMEDIRECTORY, root); @@ -354,5 +358,21 @@ public class TestWebHdfsFileSystemContra assertEquals((short)0755, webhdfs.getFileStatus(dir).getPermission().toShort()); conn.disconnect(); } + + {//test jsonParse with non-json type. + final HttpOpParam.Op op = GetOpParam.Op.OPEN; + final URL url = webhdfs.toUrl(op, file); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod(op.getType().toString()); + conn.connect(); + + try { + WebHdfsFileSystem.jsonParse(conn, false); + fail(); + } catch(IOException ioe) { + WebHdfsFileSystem.LOG.info("GOOD", ioe); + } + conn.disconnect(); + } } } Modified: hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java?rev=1353928&r1=1353927&r2=1353928&view=diff ============================================================================== --- hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java (original) +++ hadoop/common/branches/branch-1/src/test/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java Tue Jun 26 10:49:22 2012 @@ -48,7 +48,7 @@ public class WebHdfsTestUtil { public static WebHdfsFileSystem getWebHdfsFileSystemAs( final UserGroupInformation ugi, final Configuration conf - ) throws IOException, URISyntaxException, InterruptedException { + ) throws IOException, InterruptedException { return ugi.doAs(new PrivilegedExceptionAction<WebHdfsFileSystem>() { @Override public WebHdfsFileSystem run() throws Exception { @@ -69,7 +69,7 @@ public class WebHdfsTestUtil { final int expectedResponseCode) throws IOException { conn.connect(); Assert.assertEquals(expectedResponseCode, conn.getResponseCode()); - return WebHdfsFileSystem.jsonParse(conn.getInputStream()); + return WebHdfsFileSystem.jsonParse(conn, false); } public static HttpURLConnection twoStepWrite(HttpURLConnection conn,