You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by we...@apache.org on 2021/03/24 09:45:09 UTC
[hadoop] 05/05: HDFS-15275. HttpFS: Response of Create was not
correct with noredirect and data are true. Contributed by hemanthboyina.
This is an automated email from the ASF dual-hosted git repository.
weichiu pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git
commit 9a0c5d0ca2d206a9d233b08f04c70cab1b3c9612
Author: Takanobu Asanuma <ta...@apache.org>
AuthorDate: Mon Apr 20 23:09:33 2020 +0900
HDFS-15275. HttpFS: Response of Create was not correct with noredirect and data are true. Contributed by hemanthboyina.
(cherry picked from commit 1fdfaebd98d9b8f40f616d03fa2f3b6b5c71b11b)
---
.../apache/hadoop/fs/http/server/HttpFSServer.java | 39 ++++++++----------
.../hadoop/fs/http/server/TestHttpFSServer.java | 48 +++++++++++++++++++++-
2 files changed, 65 insertions(+), 22 deletions(-)
diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java
index 7cdbde5..5965f70 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java
@@ -629,23 +629,21 @@ public class HttpFSServer {
switch (op.value()) {
case APPEND: {
Boolean hasData = params.get(DataParam.NAME, DataParam.class);
- if (!hasData) {
- URI redirectURL = createUploadRedirectionURL(
- uriInfo, HttpFSFileSystem.Operation.APPEND);
- Boolean noRedirect = params.get(
- NoRedirectParam.NAME, NoRedirectParam.class);
- if (noRedirect) {
+ URI redirectURL = createUploadRedirectionURL(uriInfo,
+ HttpFSFileSystem.Operation.APPEND);
+ Boolean noRedirect =
+ params.get(NoRedirectParam.NAME, NoRedirectParam.class);
+ if (noRedirect) {
final String js = JsonUtil.toJsonString("Location", redirectURL);
response = Response.ok(js).type(MediaType.APPLICATION_JSON).build();
- } else {
- response = Response.temporaryRedirect(redirectURL).build();
- }
- } else {
+ } else if (hasData) {
FSOperations.FSAppend command =
new FSOperations.FSAppend(is, path);
fsExecute(user, command);
AUDIT_LOG.info("[{}]", path);
response = Response.ok().type(MediaType.APPLICATION_JSON).build();
+ } else {
+ response = Response.temporaryRedirect(redirectURL).build();
}
break;
}
@@ -703,7 +701,8 @@ public class HttpFSServer {
protected URI createUploadRedirectionURL(UriInfo uriInfo, Enum<?> uploadOperation) {
UriBuilder uriBuilder = uriInfo.getRequestUriBuilder();
uriBuilder = uriBuilder.replaceQueryParam(OperationParam.NAME, uploadOperation).
- queryParam(DataParam.NAME, Boolean.TRUE);
+ queryParam(DataParam.NAME, Boolean.TRUE)
+ .replaceQueryParam(NoRedirectParam.NAME, (Object[]) null);
return uriBuilder.build(null);
}
@@ -771,18 +770,14 @@ public class HttpFSServer {
switch (op.value()) {
case CREATE: {
Boolean hasData = params.get(DataParam.NAME, DataParam.class);
- if (!hasData) {
- URI redirectURL = createUploadRedirectionURL(
- uriInfo, HttpFSFileSystem.Operation.CREATE);
- Boolean noRedirect = params.get(
- NoRedirectParam.NAME, NoRedirectParam.class);
- if (noRedirect) {
+ URI redirectURL = createUploadRedirectionURL(uriInfo,
+ HttpFSFileSystem.Operation.CREATE);
+ Boolean noRedirect =
+ params.get(NoRedirectParam.NAME, NoRedirectParam.class);
+ if (noRedirect) {
final String js = JsonUtil.toJsonString("Location", redirectURL);
response = Response.ok(js).type(MediaType.APPLICATION_JSON).build();
- } else {
- response = Response.temporaryRedirect(redirectURL).build();
- }
- } else {
+ } else if (hasData) {
Short permission = params.get(PermissionParam.NAME,
PermissionParam.class);
Short unmaskedPermission = params.get(UnmaskedPermissionParam.NAME,
@@ -806,6 +801,8 @@ public class HttpFSServer {
"Location", uriInfo.getAbsolutePath());
response = Response.created(uriInfo.getAbsolutePath())
.type(MediaType.APPLICATION_JSON).entity(js).build();
+ } else {
+ response = Response.temporaryRedirect(redirectURL).build();
}
break;
}
diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java
index e5883a6..ebb118e 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java
@@ -1602,7 +1602,7 @@ public class TestHttpFSServer extends HFSTestCase {
new InputStreamReader(conn.getInputStream()));
String location = (String)json.get("Location");
Assert.assertTrue(location.contains(DataParam.NAME));
- Assert.assertTrue(location.contains(NoRedirectParam.NAME));
+ Assert.assertFalse(location.contains(NoRedirectParam.NAME));
Assert.assertTrue(location.contains("CREATE"));
Assert.assertTrue("Wrong location: " + location,
location.startsWith(TestJettyHelper.getJettyURL().toString()));
@@ -1871,4 +1871,50 @@ public class TestHttpFSServer extends HFSTestCase {
assertTrue(
xAttrs.containsKey(HdfsServerConstants.XATTR_SATISFY_STORAGE_POLICY));
}
+
+ @Test
+ @TestDir
+ @TestJetty
+ @TestHdfs
+ public void testNoRedirectWithData() throws Exception {
+ createHttpFSServer(false, false);
+
+ final String path = "/file";
+ final String username = HadoopUsersConfTestHelper.getHadoopUsers()[0];
+ // file creation which should not redirect
+ URL url = new URL(TestJettyHelper.getJettyURL(),
+ MessageFormat.format(
+ "/webhdfs/v1{0}?user.name={1}&op=CREATE&data=true&noredirect=true",
+ path, username));
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod(HttpMethod.PUT);
+ conn.setRequestProperty("Content-Type", MediaType.APPLICATION_OCTET_STREAM);
+ conn.setDoOutput(true);
+ conn.connect();
+ Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
+ JSONObject json = (JSONObject) new JSONParser()
+ .parse(new InputStreamReader(conn.getInputStream()));
+
+ // get the location to write
+ String location = (String) json.get("Location");
+ Assert.assertTrue(location.contains(DataParam.NAME));
+ Assert.assertTrue(location.contains("CREATE"));
+ url = new URL(location);
+ conn = (HttpURLConnection) url.openConnection();
+ conn.setRequestMethod(HttpMethod.PUT);
+ conn.setRequestProperty("Content-Type", MediaType.APPLICATION_OCTET_STREAM);
+ conn.setDoOutput(true);
+ conn.connect();
+ final String writeStr = "write some content";
+ OutputStream os = conn.getOutputStream();
+ os.write(writeStr.getBytes());
+ os.close();
+ // Verify that file got created
+ Assert.assertEquals(HttpURLConnection.HTTP_CREATED, conn.getResponseCode());
+ json = (JSONObject) new JSONParser()
+ .parse(new InputStreamReader(conn.getInputStream()));
+ location = (String) json.get("Location");
+ Assert.assertEquals(TestJettyHelper.getJettyURL() + "/webhdfs/v1" + path,
+ location);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org