|
17 | 17 |
|
18 | 18 | package org.apache.spark.ui
|
19 | 19 |
|
20 |
| -import java.net.{URI, URL} |
| 20 | +import java.net.{URI, URL, URLDecoder} |
21 | 21 | import java.util.EnumSet
|
22 | 22 | import javax.servlet.DispatcherType
|
23 | 23 | import javax.servlet.http._
|
@@ -377,8 +377,7 @@ private[spark] object JettyUtils extends Logging {
|
377 | 377 | if (baseRequest.isSecure) {
|
378 | 378 | return
|
379 | 379 | }
|
380 |
| - val httpsURI = createRedirectURI(scheme, baseRequest.getServerName, securePort, |
381 |
| - baseRequest.getRequestURI, baseRequest.getQueryString) |
| 380 | + val httpsURI = createRedirectURI(scheme, securePort, baseRequest) |
382 | 381 | response.setContentLength(0)
|
383 | 382 | response.sendRedirect(response.encodeRedirectURL(httpsURI))
|
384 | 383 | baseRequest.setHandled(true)
|
@@ -440,16 +439,34 @@ private[spark] object JettyUtils extends Logging {
|
440 | 439 | handler.addFilter(holder, "/*", EnumSet.allOf(classOf[DispatcherType]))
|
441 | 440 | }
|
442 | 441 |
|
| 442 | + private def decodeURL(url: String, encoding: String): String = { |
| 443 | + if (url == null) { |
| 444 | + null |
| 445 | + } else { |
| 446 | + URLDecoder.decode(url, encoding) |
| 447 | + } |
| 448 | + } |
| 449 | + |
443 | 450 | // Create a new URI from the arguments, handling IPv6 host encoding and default ports.
|
444 |
| - private def createRedirectURI( |
445 |
| - scheme: String, server: String, port: Int, path: String, query: String) = { |
| 451 | + private def createRedirectURI(scheme: String, port: Int, request: Request): String = { |
| 452 | + val server = request.getServerName |
446 | 453 | val redirectServer = if (server.contains(":") && !server.startsWith("[")) {
|
447 | 454 | s"[${server}]"
|
448 | 455 | } else {
|
449 | 456 | server
|
450 | 457 | }
|
451 | 458 | val authority = s"$redirectServer:$port"
|
452 |
| - new URI(scheme, authority, path, query, null).toString |
| 459 | + val queryEncoding = if (request.getQueryEncoding != null) { |
| 460 | + request.getQueryEncoding |
| 461 | + } else { |
| 462 | + // By default decoding the URI as "UTF-8" should be enough for SparkUI |
| 463 | + "UTF-8" |
| 464 | + } |
| 465 | + // The request URL can be raw or encoded here. To avoid the request URL being |
| 466 | + // encoded twice, let's decode it here. |
| 467 | + val requestURI = decodeURL(request.getRequestURI, queryEncoding) |
| 468 | + val queryString = decodeURL(request.getQueryString, queryEncoding) |
| 469 | + new URI(scheme, authority, requestURI, queryString, null).toString |
453 | 470 | }
|
454 | 471 |
|
455 | 472 | def toVirtualHosts(connectors: String*): Array[String] = connectors.map("@" + _).toArray
|
|
0 commit comments