You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by an...@apache.org on 2015/02/17 03:08:03 UTC
spark git commit: [SPARK-5849] Handle more types of invalid JSON
requests in SubmitRestProtocolMessage.parseAction
Repository: spark
Updated Branches:
refs/heads/master 16687651f -> 58a82a788
[SPARK-5849] Handle more types of invalid JSON requests in SubmitRestProtocolMessage.parseAction
This patch improves SubmitRestProtocol's handling of invalid JSON requests in cases where those requests were parsable as JSON but not as JSON objects (e.g. they could be parsed as ararys or strings). I replaced an unchecked cast with pattern-matching and added a new test case.
Author: Josh Rosen <jo...@databricks.com>
Closes #4637 from JoshRosen/rest-protocol-cast and squashes the following commits:
b3f282b [Josh Rosen] [SPARK-5849] Handle more types of invalid JSON in SubmitRestProtocolMessage.parseAction
Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/58a82a78
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/58a82a78
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/58a82a78
Branch: refs/heads/master
Commit: 58a82a7882d7a8a7e4064278c4bf28607d9a42ba
Parents: 1668765
Author: Josh Rosen <jo...@databricks.com>
Authored: Mon Feb 16 18:08:02 2015 -0800
Committer: Andrew Or <an...@databricks.com>
Committed: Mon Feb 16 18:08:02 2015 -0800
----------------------------------------------------------------------
.../deploy/rest/SubmitRestProtocolMessage.scala | 16 ++++++++--------
.../deploy/rest/StandaloneRestSubmitSuite.scala | 4 ++++
2 files changed, 12 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/spark/blob/58a82a78/core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala
----------------------------------------------------------------------
diff --git a/core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala b/core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala
index b877898..8f36635 100644
--- a/core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/rest/SubmitRestProtocolMessage.scala
@@ -17,8 +17,6 @@
package org.apache.spark.deploy.rest
-import scala.util.Try
-
import com.fasterxml.jackson.annotation._
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility
import com.fasterxml.jackson.annotation.JsonInclude.Include
@@ -111,12 +109,14 @@ private[spark] object SubmitRestProtocolMessage {
* If the action field is not found, throw a [[SubmitRestMissingFieldException]].
*/
def parseAction(json: String): String = {
- parse(json).asInstanceOf[JObject].obj
- .find { case (f, _) => f == "action" }
- .map { case (_, v) => v.asInstanceOf[JString].s }
- .getOrElse {
- throw new SubmitRestMissingFieldException(s"Action field not found in JSON:\n$json")
- }
+ val value: Option[String] = parse(json) match {
+ case JObject(fields) =>
+ fields.collectFirst { case ("action", v) => v }.collect { case JString(s) => s }
+ case _ => None
+ }
+ value.getOrElse {
+ throw new SubmitRestMissingFieldException(s"Action field not found in JSON:\n$json")
+ }
}
/**
http://git-wip-us.apache.org/repos/asf/spark/blob/58a82a78/core/src/test/scala/org/apache/spark/deploy/rest/StandaloneRestSubmitSuite.scala
----------------------------------------------------------------------
diff --git a/core/src/test/scala/org/apache/spark/deploy/rest/StandaloneRestSubmitSuite.scala b/core/src/test/scala/org/apache/spark/deploy/rest/StandaloneRestSubmitSuite.scala
index a345e06..2fa90e3 100644
--- a/core/src/test/scala/org/apache/spark/deploy/rest/StandaloneRestSubmitSuite.scala
+++ b/core/src/test/scala/org/apache/spark/deploy/rest/StandaloneRestSubmitSuite.scala
@@ -245,6 +245,7 @@ class StandaloneRestSubmitSuite extends FunSuite with BeforeAndAfterEach {
val goodJson = constructSubmitRequest(masterUrl).toJson
val badJson1 = goodJson.replaceAll("action", "fraction") // invalid JSON
val badJson2 = goodJson.substring(goodJson.size / 2) // malformed JSON
+ val notJson = "\"hello, world\""
val (response1, code1) = sendHttpRequestWithResponse(submitRequestPath, "POST") // missing JSON
val (response2, code2) = sendHttpRequestWithResponse(submitRequestPath, "POST", badJson1)
val (response3, code3) = sendHttpRequestWithResponse(submitRequestPath, "POST", badJson2)
@@ -252,6 +253,7 @@ class StandaloneRestSubmitSuite extends FunSuite with BeforeAndAfterEach {
val (response5, code5) = sendHttpRequestWithResponse(s"$killRequestPath/", "POST")
val (response6, code6) = sendHttpRequestWithResponse(statusRequestPath, "GET") // missing ID
val (response7, code7) = sendHttpRequestWithResponse(s"$statusRequestPath/", "GET")
+ val (response8, code8) = sendHttpRequestWithResponse(submitRequestPath, "POST", notJson)
// these should all fail as error responses
getErrorResponse(response1)
getErrorResponse(response2)
@@ -260,6 +262,7 @@ class StandaloneRestSubmitSuite extends FunSuite with BeforeAndAfterEach {
getErrorResponse(response5)
getErrorResponse(response6)
getErrorResponse(response7)
+ getErrorResponse(response8)
assert(code1 === HttpServletResponse.SC_BAD_REQUEST)
assert(code2 === HttpServletResponse.SC_BAD_REQUEST)
assert(code3 === HttpServletResponse.SC_BAD_REQUEST)
@@ -267,6 +270,7 @@ class StandaloneRestSubmitSuite extends FunSuite with BeforeAndAfterEach {
assert(code5 === HttpServletResponse.SC_BAD_REQUEST)
assert(code6 === HttpServletResponse.SC_BAD_REQUEST)
assert(code7 === HttpServletResponse.SC_BAD_REQUEST)
+ assert(code8 === HttpServletResponse.SC_BAD_REQUEST)
}
test("bad request paths") {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org