Skip to content

Commit 520e180

Browse files
committed
[SPARK-5672][Web UI] Return HTTP ERROR 400 when have missing args
Spark web UI return `HTTP ERROR 500` when GET arguments is missing. Changed it to return a `HTTP ERROR 400`
1 parent dd4cb33 commit 520e180

File tree

6 files changed

+35
-16
lines changed

6 files changed

+35
-16
lines changed

core/src/main/scala/org/apache/spark/ui/JettyUtils.scala

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,22 @@ private[spark] object JettyUtils extends Logging {
6262
securityMgr: SecurityManager): HttpServlet = {
6363
new HttpServlet {
6464
override def doGet(request: HttpServletRequest, response: HttpServletResponse) {
65-
if (securityMgr.checkUIViewPermissions(request.getRemoteUser)) {
66-
response.setContentType("%s;charset=utf-8".format(servletParams.contentType))
67-
response.setStatus(HttpServletResponse.SC_OK)
68-
val result = servletParams.responder(request)
69-
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
70-
response.getWriter.println(servletParams.extractFn(result))
71-
} else {
72-
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
73-
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
74-
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
75-
"User is not authorized to access this page.")
65+
try {
66+
if (securityMgr.checkUIViewPermissions(request.getRemoteUser)) {
67+
response.setContentType("%s;charset=utf-8".format(servletParams.contentType))
68+
response.setStatus(HttpServletResponse.SC_OK)
69+
val result = servletParams.responder(request)
70+
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
71+
response.getWriter.println(servletParams.extractFn(result))
72+
} else {
73+
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED)
74+
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate")
75+
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
76+
"User is not authorized to access this page.")
77+
}
78+
} catch {
79+
case e: IllegalArgumentException =>
80+
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage)
7681
}
7782
}
7883
}

core/src/main/scala/org/apache/spark/ui/exec/ExecutorThreadDumpPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ private[ui] class ExecutorThreadDumpPage(parent: ExecutorsTab) extends WebUIPage
4343
}
4444
id
4545
}.getOrElse {
46-
return Text(s"Missing executorId parameter")
46+
throw new IllegalArgumentException(s"Missing executorId parameter")
4747
}
4848
val time = System.currentTimeMillis()
4949
val maybeThreadDump = sc.get.getExecutorThreadDump(executorId)

core/src/main/scala/org/apache/spark/ui/jobs/JobPage.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ private[ui] class JobPage(parent: JobsTab) extends WebUIPage("job") {
3232

3333
def render(request: HttpServletRequest): Seq[Node] = {
3434
listener.synchronized {
35-
val jobId = request.getParameter("id").toInt
35+
val parameterId = request.getParameter("id")
36+
require(parameterId != null && parameterId.nonEmpty, "Missing id parameter")
37+
38+
val jobId = parameterId.toInt
3639
val jobDataOption = listener.jobIdToData.get(jobId)
3740
if (jobDataOption.isEmpty) {
3841
val content =

core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ private[ui] class PoolPage(parent: StagesTab) extends WebUIPage("pool") {
3232
def render(request: HttpServletRequest): Seq[Node] = {
3333
listener.synchronized {
3434
val poolName = request.getParameter("poolname")
35+
require(poolName != null && poolName.nonEmpty, "Missing poolname parameter")
36+
3537
val poolToActiveStages = listener.poolToActiveStages
3638
val activeStages = poolToActiveStages.get(poolName) match {
3739
case Some(s) => s.values.toSeq

core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,14 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
3636

3737
def render(request: HttpServletRequest): Seq[Node] = {
3838
listener.synchronized {
39-
val stageId = request.getParameter("id").toInt
40-
val stageAttemptId = request.getParameter("attempt").toInt
39+
val parameterId = request.getParameter("id")
40+
require(parameterId != null && parameterId.nonEmpty, "Missing id parameter")
41+
42+
val parameterAttempt = request.getParameter("attempt")
43+
require(parameterAttempt != null && parameterAttempt.nonEmpty, "Missing attempt parameter")
44+
45+
val stageId = parameterId.toInt
46+
val stageAttemptId = parameterAttempt.toInt
4147
val stageDataOption = listener.stageIdToData.get((stageId, stageAttemptId))
4248

4349
if (stageDataOption.isEmpty || stageDataOption.get.taskData.isEmpty) {

core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ private[ui] class RDDPage(parent: StorageTab) extends WebUIPage("rdd") {
3030
private val listener = parent.listener
3131

3232
def render(request: HttpServletRequest): Seq[Node] = {
33-
val rddId = request.getParameter("id").toInt
33+
val parameterId = request.getParameter("id")
34+
require(parameterId != null && parameterId.nonEmpty, "Missing id parameter")
35+
36+
val rddId = parameterId.toInt
3437
val storageStatusList = listener.storageStatusList
3538
val rddInfo = listener.rddInfoList.find(_.id == rddId).getOrElse {
3639
// Rather than crashing, render an "RDD Not Found" page

0 commit comments

Comments
 (0)