You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2020/05/13 08:49:25 UTC

[spark] branch branch-3.0 updated: [SPARK-31697][WEBUI] HistoryServer should set Content-Type

This is an automated email from the ASF dual-hosted git repository.

dongjoon pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new da71e30  [SPARK-31697][WEBUI] HistoryServer should set Content-Type
da71e30 is described below

commit da71e303b904e76cd68a5ed57111828acb7353f6
Author: Kousuke Saruta <sa...@oss.nttdata.com>
AuthorDate: Wed May 13 01:46:40 2020 -0700

    [SPARK-31697][WEBUI] HistoryServer should set Content-Type
    
    ### What changes were proposed in this pull request?
    
    This PR changes HistoryServer to set Content-Type.
    
    I noticed that we will get html as plain text when we access to wrong URLs which represent non-existence appId on HistoryServer.
    
    ```
    <html>
          <head>
            <meta http-equiv="Content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/static/bootstrap.min.css" type="text/css"/><link rel="stylesheet" href="/static/vis-timeline-graph2d.min.css" type="text/css"/><link rel="stylesheet" href="/static/webui.css" type="text/css"/><link rel="stylesheet" href="/static/timeline-view.css" type="text/css"/><script src="/static/sorttable.js"></script><scri [...]
    
            <link rel="shortcut icon" href="/static/spark-logo-77x50px-hd.png"></link>
            <title>Not Found</title>
          </head>
          <body>
            <div class="container-fluid">
              <div class="row">
                <div class="col-12">
                  <h3 style="vertical-align: middle; display: inline-block;">
                    <a style="text-decoration: none" href="/">
                      <img src="/static/spark-logo-77x50px-hd.png"/>
                      <span class="version" style="margin-right: 15px;">3.1.0-SNAPSHOT</span>
                    </a>
                    Not Found
                  </h3>
                </div>
              </div>
              <div class="row">
                <div class="col-12">
                  <div class="row">Application local-1589239 not found.</div>
                </div>
              </div>
            </div>
          </body>
        </html>
    ```
    The reason is Content-Type not set. I confirmed it with `curl -I http://localhost:18080/history/<wrong-appId>`
    ```
    HTTP/1.1 404 Not Found
    Date: Wed, 13 May 2020 06:59:29 GMT
    Cache-Control: no-cache, no-store, must-revalidate
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    Content-Length: 1778
    Server: Jetty(9.4.18.v20190429)
    ```
    
    ### Why are the changes needed?
    
    This is a bug.
    
    ### Does this PR introduce _any_ user-facing change?
    
    No.
    
    ### How was this patch tested?
    
    I added a test case for this issue.
    
    Closes #28519 from sarutak/fix-content-type.
    
    Authored-by: Kousuke Saruta <sa...@oss.nttdata.com>
    Signed-off-by: Dongjoon Hyun <do...@apache.org>
    (cherry picked from commit 7952f44dacd18891e4f78c91146c1cf37dda6a46)
    Signed-off-by: Dongjoon Hyun <do...@apache.org>
---
 .../scala/org/apache/spark/deploy/history/HistoryServer.scala |  3 +++
 .../org/apache/spark/deploy/history/HistoryServerSuite.scala  | 11 +++++++++++
 2 files changed, 14 insertions(+)

diff --git a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
index 62cac26..7e0d311 100644
--- a/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
+++ b/core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala
@@ -69,6 +69,9 @@ class HistoryServer(
 
   private val loaderServlet = new HttpServlet {
     protected override def doGet(req: HttpServletRequest, res: HttpServletResponse): Unit = {
+
+      res.setContentType("text/html;charset=utf-8")
+
       // Parse the URI created by getAttemptURI(). It contains an app ID and an optional
       // attempt ID (separated by a slash).
       val parts = Option(req.getPathInfo()).getOrElse("").split("/")
diff --git a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
index 206db0f..56cc3da 100644
--- a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
+++ b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
@@ -693,6 +693,17 @@ class HistoryServerSuite extends SparkFunSuite with BeforeAndAfter with Matchers
     out.close()
   }
 
+  test("SPARK-31697: HistoryServer should set Content-Type") {
+    val port = server.boundPort
+    val nonExistenceAppId = "local-non-existence"
+    val url = new URL(s"http://localhost:$port/history/$nonExistenceAppId")
+    val conn = url.openConnection().asInstanceOf[HttpURLConnection]
+    conn.setRequestMethod("GET")
+    conn.connect()
+    val expectedContentType = "text/html;charset=utf-8"
+    val actualContentType = conn.getContentType
+    assert(actualContentType === expectedContentType)
+  }
 }
 
 object HistoryServerSuite {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org