HDFS-16503. Should verify whether the path name is valid in the WebHDFS (#4067). Contributed by tomscut.
Signed-off-by: Ayush Saxena <ayushsaxena@apache.org>
This commit is contained in:
parent
62d59e516e
commit
e5549a2a68
|
@ -478,7 +478,8 @@ public class WebHdfsFileSystem extends FileSystem
|
|||
return f.isAbsolute()? f: new Path(workingDir, f);
|
||||
}
|
||||
|
||||
static Map<?, ?> jsonParse(final HttpURLConnection c,
|
||||
@VisibleForTesting
|
||||
public static Map<?, ?> jsonParse(final HttpURLConnection c,
|
||||
final boolean useErrorStream) throws IOException {
|
||||
if (c.getContentLength() == 0) {
|
||||
return null;
|
||||
|
|
|
@ -19,6 +19,8 @@ package org.apache.hadoop.hdfs.server.federation.router;
|
|||
|
||||
import static org.apache.hadoop.util.StringUtils.getTrimmedStringCollection;
|
||||
|
||||
import org.apache.hadoop.fs.InvalidPathException;
|
||||
import org.apache.hadoop.hdfs.DFSUtil;
|
||||
import org.apache.hadoop.hdfs.protocol.ClientProtocol;
|
||||
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
|
||||
import org.apache.hadoop.hdfs.protocol.HdfsFileStatus;
|
||||
|
@ -419,6 +421,9 @@ public class RouterWebHdfsMethods extends NamenodeWebHdfsMethods {
|
|||
final DoAsParam doAsUser, final String path, final HttpOpParam.Op op,
|
||||
final long openOffset, final String excludeDatanodes,
|
||||
final Param<?, ?>... parameters) throws URISyntaxException, IOException {
|
||||
if (!DFSUtil.isValidName(path)) {
|
||||
throw new InvalidPathException(path);
|
||||
}
|
||||
final DatanodeInfo dn =
|
||||
chooseDatanode(router, path, op, openOffset, excludeDatanodes);
|
||||
|
||||
|
|
|
@ -23,9 +23,12 @@ import static org.junit.Assert.assertEquals;
|
|||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.fs.FileSystem;
|
||||
|
@ -34,6 +37,7 @@ import org.apache.hadoop.hdfs.server.federation.MiniRouterDFSCluster.RouterConte
|
|||
import org.apache.hadoop.hdfs.server.federation.RouterConfigBuilder;
|
||||
import org.apache.hadoop.hdfs.server.federation.StateStoreDFSCluster;
|
||||
import org.apache.hadoop.hdfs.server.federation.resolver.order.DestinationOrder;
|
||||
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
@ -145,4 +149,24 @@ public class TestRouterWebHdfsMethods {
|
|||
assertEquals("", RouterWebHdfsMethods
|
||||
.getNsFromDataNodeNetworkLocation("whatever-rack-info1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWebHdfsCreateWithInvalidPath() throws Exception {
|
||||
// A path name include duplicated slashes.
|
||||
String path = "//tmp//file";
|
||||
assertResponse(path);
|
||||
}
|
||||
|
||||
private void assertResponse(String path) throws IOException {
|
||||
URL url = new URL(getUri(path));
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("PUT");
|
||||
// Assert response code.
|
||||
assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, conn.getResponseCode());
|
||||
// Assert exception.
|
||||
Map<?, ?> response = WebHdfsFileSystem.jsonParse(conn, true);
|
||||
assertEquals("InvalidPathException",
|
||||
((LinkedHashMap) response.get("RemoteException")).get("exception"));
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,6 +55,7 @@ import javax.ws.rs.core.StreamingOutput;
|
|||
import javax.ws.rs.core.Response.ResponseBuilder;
|
||||
import javax.ws.rs.core.Response.Status;
|
||||
|
||||
import org.apache.hadoop.fs.InvalidPathException;
|
||||
import org.apache.hadoop.fs.QuotaUsage;
|
||||
import org.apache.hadoop.fs.StorageType;
|
||||
import org.apache.hadoop.hdfs.protocol.HdfsConstants;
|
||||
|
@ -401,6 +402,9 @@ public class NamenodeWebHdfsMethods {
|
|||
final String path, final HttpOpParam.Op op, final long openOffset,
|
||||
final long blocksize, final String excludeDatanodes,
|
||||
final Param<?, ?>... parameters) throws URISyntaxException, IOException {
|
||||
if (!DFSUtil.isValidName(path)) {
|
||||
throw new InvalidPathException(path);
|
||||
}
|
||||
final DatanodeInfo dn;
|
||||
final NamenodeProtocols np = getRPCServer(namenode);
|
||||
HdfsFileStatus status = null;
|
||||
|
|
|
@ -55,6 +55,7 @@ import java.util.Arrays;
|
|||
import java.util.Collection;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Random;
|
||||
|
@ -522,6 +523,38 @@ public class TestWebHDFS {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWebHdfsCreateWithInvalidPath() throws Exception {
|
||||
final Configuration conf = WebHdfsTestUtil.createConf();
|
||||
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).build();
|
||||
// A path name include duplicated slashes.
|
||||
String path = "//tmp//file";
|
||||
assertResponse(path);
|
||||
}
|
||||
|
||||
private String getUri(String path) {
|
||||
final String user = System.getProperty("user.name");
|
||||
final StringBuilder uri = new StringBuilder(cluster.getHttpUri(0));
|
||||
uri.append("/webhdfs/v1").
|
||||
append(path).
|
||||
append("?op=CREATE").
|
||||
append("&user.name=" + user);
|
||||
return uri.toString();
|
||||
}
|
||||
|
||||
private void assertResponse(String path) throws IOException {
|
||||
URL url = new URL(getUri(path));
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("PUT");
|
||||
// Assert response code.
|
||||
assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, conn.getResponseCode());
|
||||
// Assert exception.
|
||||
Map<?, ?> response = WebHdfsFileSystem.jsonParse(conn, true);
|
||||
assertEquals("InvalidPathException",
|
||||
((LinkedHashMap) response.get("RemoteException")).get("exception"));
|
||||
conn.disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test allow and disallow snapshot through WebHdfs. Verifying webhdfs with
|
||||
* Distributed filesystem methods.
|
||||
|
|
Loading…
Reference in New Issue