HDFS-3006. In WebHDFS, when the return body is empty, set the Content-Type to application/octet-stream instead of application/json.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1293487 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5293e5d1c5
commit
dacbeb5f67
|
@ -285,6 +285,9 @@ Release 0.23.2 - UNRELEASED
|
||||||
|
|
||||||
HDFS-3008. Negative caching of local addrs doesn't work. (eli)
|
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
|
Release 0.23.1 - 2012-02-17
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -117,7 +117,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
@PUT
|
@PUT
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response putRoot(
|
public Response putRoot(
|
||||||
final InputStream in,
|
final InputStream in,
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
|
@ -147,7 +147,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
@PUT
|
@PUT
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response put(
|
public Response put(
|
||||||
final InputStream in,
|
final InputStream in,
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
|
@ -209,7 +209,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
final InetSocketAddress nnHttpAddr = NameNode.getHttpAddress(conf);
|
final InetSocketAddress nnHttpAddr = NameNode.getHttpAddress(conf);
|
||||||
final URI uri = new URI(WebHdfsFileSystem.SCHEME, null,
|
final URI uri = new URI(WebHdfsFileSystem.SCHEME, null,
|
||||||
nnHttpAddr.getHostName(), nnHttpAddr.getPort(), fullpath, null, 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:
|
default:
|
||||||
throw new UnsupportedOperationException(op + " is not supported");
|
throw new UnsupportedOperationException(op + " is not supported");
|
||||||
|
@ -222,7 +222,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
@POST
|
@POST
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response postRoot(
|
public Response postRoot(
|
||||||
final InputStream in,
|
final InputStream in,
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
|
@ -243,7 +243,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
@POST
|
@POST
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response post(
|
public Response post(
|
||||||
final InputStream in,
|
final InputStream in,
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
|
@ -287,7 +287,7 @@ public class DatanodeWebHdfsMethods {
|
||||||
IOUtils.cleanup(LOG, out);
|
IOUtils.cleanup(LOG, out);
|
||||||
IOUtils.cleanup(LOG, dfsclient);
|
IOUtils.cleanup(LOG, dfsclient);
|
||||||
}
|
}
|
||||||
return Response.ok().type(MediaType.APPLICATION_JSON).build();
|
return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException(op + " is not supported");
|
throw new UnsupportedOperationException(op + " is not supported");
|
||||||
|
|
|
@ -215,7 +215,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
@PUT
|
@PUT
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response putRoot(
|
public Response putRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
|
@ -263,7 +263,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
@PUT
|
@PUT
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response put(
|
public Response put(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
|
@ -324,7 +324,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
||||||
fullpath, op.getValue(), -1L,
|
fullpath, op.getValue(), -1L,
|
||||||
permission, overwrite, bufferSize, replication, blockSize);
|
permission, overwrite, bufferSize, replication, blockSize);
|
||||||
return Response.temporaryRedirect(uri).build();
|
return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
case MKDIRS:
|
case MKDIRS:
|
||||||
{
|
{
|
||||||
|
@ -336,7 +336,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
{
|
{
|
||||||
np.createSymlink(destination.getValue(), fullpath,
|
np.createSymlink(destination.getValue(), fullpath,
|
||||||
PermissionParam.getDefaultFsPermission(), createParent.getValue());
|
PermissionParam.getDefaultFsPermission(), createParent.getValue());
|
||||||
return Response.ok().type(MediaType.APPLICATION_JSON).build();
|
return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
case RENAME:
|
case RENAME:
|
||||||
{
|
{
|
||||||
|
@ -348,7 +348,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
} else {
|
} else {
|
||||||
np.rename2(fullpath, destination.getValue(),
|
np.rename2(fullpath, destination.getValue(),
|
||||||
s.toArray(new Options.Rename[s.size()]));
|
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:
|
case SETREPLICATION:
|
||||||
|
@ -364,17 +364,17 @@ public class NamenodeWebHdfsMethods {
|
||||||
}
|
}
|
||||||
|
|
||||||
np.setOwner(fullpath, owner.getValue(), group.getValue());
|
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:
|
case SETPERMISSION:
|
||||||
{
|
{
|
||||||
np.setPermission(fullpath, permission.getFsPermission());
|
np.setPermission(fullpath, permission.getFsPermission());
|
||||||
return Response.ok().type(MediaType.APPLICATION_JSON).build();
|
return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
case SETTIMES:
|
case SETTIMES:
|
||||||
{
|
{
|
||||||
np.setTimes(fullpath, modificationTime.getValue(), accessTime.getValue());
|
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:
|
case RENEWDELEGATIONTOKEN:
|
||||||
{
|
{
|
||||||
|
@ -389,7 +389,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
final Token<DelegationTokenIdentifier> token = new Token<DelegationTokenIdentifier>();
|
final Token<DelegationTokenIdentifier> token = new Token<DelegationTokenIdentifier>();
|
||||||
token.decodeFromUrlString(delegationTokenArgument.getValue());
|
token.decodeFromUrlString(delegationTokenArgument.getValue());
|
||||||
np.cancelDelegationToken(token);
|
np.cancelDelegationToken(token);
|
||||||
return Response.ok().type(MediaType.APPLICATION_JSON).build();
|
return Response.ok().type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException(op + " is not supported");
|
throw new UnsupportedOperationException(op + " is not supported");
|
||||||
|
@ -406,7 +406,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
@POST
|
@POST
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response postRoot(
|
public Response postRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
|
@ -427,7 +427,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
@POST
|
@POST
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
||||||
public Response post(
|
public Response post(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
|
@ -459,7 +459,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
{
|
{
|
||||||
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
||||||
fullpath, op.getValue(), -1L, bufferSize);
|
fullpath, op.getValue(), -1L, bufferSize);
|
||||||
return Response.temporaryRedirect(uri).build();
|
return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw new UnsupportedOperationException(op + " is not supported");
|
throw new UnsupportedOperationException(op + " is not supported");
|
||||||
|
@ -542,7 +542,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
{
|
{
|
||||||
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
||||||
fullpath, op.getValue(), offset.getValue(), offset, length, bufferSize);
|
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:
|
case GET_BLOCK_LOCATIONS:
|
||||||
{
|
{
|
||||||
|
@ -578,7 +578,7 @@ public class NamenodeWebHdfsMethods {
|
||||||
{
|
{
|
||||||
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
final URI uri = redirectURI(namenode, ugi, delegation, username, doAsUser,
|
||||||
fullpath, op.getValue(), -1L);
|
fullpath, op.getValue(), -1L);
|
||||||
return Response.temporaryRedirect(uri).build();
|
return Response.temporaryRedirect(uri).type(MediaType.APPLICATION_OCTET_STREAM).build();
|
||||||
}
|
}
|
||||||
case GETDELEGATIONTOKEN:
|
case GETDELEGATIONTOKEN:
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.net.URL;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.BlockLocation;
|
import org.apache.hadoop.fs.BlockLocation;
|
||||||
|
@ -314,6 +315,8 @@ public class TestWebHdfsFileSystemContract extends FileSystemContractBaseTest {
|
||||||
conn.setRequestMethod(op.getType().toString());
|
conn.setRequestMethod(op.getType().toString());
|
||||||
conn.connect();
|
conn.connect();
|
||||||
assertEquals(HttpServletResponse.SC_OK, conn.getResponseCode());
|
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());
|
assertEquals((short)0755, webhdfs.getFileStatus(dir).getPermission().toShort());
|
||||||
conn.disconnect();
|
conn.disconnect();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue