diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 62f6b9b56df..ac7e337ce59 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -67,6 +67,9 @@ Release 0.23.2 - UNRELEASED HDFS-3008. Negative caching of local addrs doesn't work. (eli) + HDFS-3006. In WebHDFS, when the return body is empty, set the Content-Type + to application/octet-stream instead of application/json. (szetszwo) + Release 0.23.1 - 2012-02-17 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/web/resources/DatanodeWebHdfsMethods.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/web/resources/DatanodeWebHdfsMethods.java index 093cd9c863e..44ef5273386 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/web/resources/DatanodeWebHdfsMethods.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/web/resources/DatanodeWebHdfsMethods.java @@ -117,7 +117,7 @@ public class DatanodeWebHdfsMethods { @PUT @Path("/") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response putRoot( final InputStream in, @Context final UserGroupInformation ugi, @@ -147,7 +147,7 @@ public class DatanodeWebHdfsMethods { @PUT @Path("{" + UriFsPathParam.NAME + ":.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response put( final InputStream in, @Context final UserGroupInformation ugi, @@ -209,7 +209,7 @@ public class DatanodeWebHdfsMethods { final InetSocketAddress nnHttpAddr = NameNode.getHttpAddress(conf); final URI uri = new URI(WebHdfsFileSystem.SCHEME, null, nnHttpAddr.getHostName(), nnHttpAddr.getPort(), fullpath, null, null); - return Response.created(uri).type(MediaType.APPLICATION_JSON).build(); + return Response.created(uri).type(MediaType.APPLICATION_OCTET_STREAM).build(); } default: throw new UnsupportedOperationException(op + " is not supported"); @@ -222,7 +222,7 @@ public class DatanodeWebHdfsMethods { @POST @Path("/") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response postRoot( final InputStream in, @Context final UserGroupInformation ugi, @@ -243,7 +243,7 @@ public class DatanodeWebHdfsMethods { @POST @Path("{" + UriFsPathParam.NAME + ":.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response post( final InputStream in, @Context final UserGroupInformation ugi, @@ -287,7 +287,7 @@ public class DatanodeWebHdfsMethods { IOUtils.cleanup(LOG, out); IOUtils.cleanup(LOG, dfsclient); } - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } default: throw new UnsupportedOperationException(op + " is not supported"); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java index 44e5e13bc8a..e041b034082 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java @@ -215,7 +215,7 @@ public class NamenodeWebHdfsMethods { @PUT @Path("/") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response putRoot( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -263,7 +263,7 @@ public class NamenodeWebHdfsMethods { @PUT @Path("{" + UriFsPathParam.NAME + ":.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response put( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -324,7 +324,7 @@ public class NamenodeWebHdfsMethods { final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser, fullpath, op.getValue(), -1L, permission, overwrite, bufferSize, replication, blockSize); - return Response.temporaryRedirect(uri).build(); + return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build(); } case MKDIRS: { @@ -336,7 +336,7 @@ public class NamenodeWebHdfsMethods { { np.createSymlink(destination.getValue(), fullpath, PermissionParam.getDefaultFsPermission(), createParent.getValue()); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } case RENAME: { @@ -348,7 +348,7 @@ public class NamenodeWebHdfsMethods { } else { np.rename2(fullpath, destination.getValue(), s.toArray(new Options.Rename[s.size()])); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } } case SETREPLICATION: @@ -364,17 +364,17 @@ public class NamenodeWebHdfsMethods { } np.setOwner(fullpath, owner.getValue(), group.getValue()); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } case SETPERMISSION: { np.setPermission(fullpath, permission.getFsPermission()); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } case SETTIMES: { np.setTimes(fullpath, modificationTime.getValue(), accessTime.getValue()); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } case RENEWDELEGATIONTOKEN: { @@ -389,7 +389,7 @@ public class NamenodeWebHdfsMethods { final Token token = new Token(); token.decodeFromUrlString(delegationTokenArgument.getValue()); np.cancelDelegationToken(token); - return Response.ok().type(MediaType.APPLICATION_JSON).build(); + return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build(); } default: throw new UnsupportedOperationException(op + " is not supported"); @@ -406,7 +406,7 @@ public class NamenodeWebHdfsMethods { @POST @Path("/") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response postRoot( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -427,7 +427,7 @@ public class NamenodeWebHdfsMethods { @POST @Path("{" + UriFsPathParam.NAME + ":.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON}) public Response post( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -459,7 +459,7 @@ public class NamenodeWebHdfsMethods { { final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser, fullpath, op.getValue(), -1L, bufferSize); - return Response.temporaryRedirect(uri).build(); + return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build(); } default: throw new UnsupportedOperationException(op + " is not supported"); @@ -542,7 +542,7 @@ public class NamenodeWebHdfsMethods { { final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser, fullpath, op.getValue(), offset.getValue(), offset, length, bufferSize); - return Response.temporaryRedirect(uri).build(); + return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build(); } case GET_BLOCK_LOCATIONS: { @@ -578,7 +578,7 @@ public class NamenodeWebHdfsMethods { { final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser, fullpath, op.getValue(), -1L); - return Response.temporaryRedirect(uri).build(); + return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build(); } case GETDELEGATIONTOKEN: { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java index 0c2372c4ed5..b551dd1927e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHdfsFileSystemContract.java @@ -27,6 +27,7 @@ import java.net.URL; import java.util.Map; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.MediaType; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; @@ -314,6 +315,8 @@ public class TestWebHdfsFileSystemContract extends FileSystemContractBaseTest { conn.setRequestMethod(op.getType().toString()); conn.connect(); assertEquals(HttpServletResponse.SC_OK, conn.getResponseCode()); + assertEquals(0, conn.getContentLength()); + assertEquals(MediaType.APPLICATION_OCTET_STREAM, conn.getContentType()); assertEquals((short)0755, webhdfs.getFileStatus(dir).getPermission().toShort()); conn.disconnect(); }