pan3793 commented on code in PR #53116:
URL: https://github.com/apache/spark/pull/53116#discussion_r2540712636
##########
core/src/main/scala/org/apache/spark/ui/JettyUtils.scala:
##########
@@ -597,36 +561,85 @@ private[spark] case class ServerInfo(
* a servlet context without the trailing slash (e.g. "/jobs") - Jetty will
send a redirect to the
* same URL, but with a trailing slash.
*/
-private class ProxyRedirectHandler(_proxyUri: String) extends HandlerWrapper {
+private class ProxyRedirectHandler(_proxyUri: String) extends Handler.Wrapper {
private val proxyUri = _proxyUri.stripSuffix("/")
- override def handle(
- target: String,
- baseRequest: Request,
- request: HttpServletRequest,
- response: HttpServletResponse): Unit = {
- super.handle(target, baseRequest, request, new ResponseWrapper(request,
response))
+ override def handle(request: Request, response: Response, callback:
Callback): Boolean = {
+ super.handle(request, new ResponseWrapper(request, response), callback)
}
- private class ResponseWrapper(
- req: HttpServletRequest,
- res: HttpServletResponse)
- extends HttpServletResponseWrapper(res) {
+ private class ResponseWrapper(req: Request, res: Response) extends
Response.Wrapper(req, res) {
+ override def getHeaders(): HttpFields.Mutable = {
+ new MutableFieldsWrapper(req, super.getHeaders())
+ }
+ }
- override def sendRedirect(location: String): Unit = {
- val newTarget = if (location != null) {
+ private class MutableFieldsWrapper(
+ req: Request,
+ wrapped: HttpFields.Mutable) extends HttpFields.Mutable.Wrapper(wrapped)
{
+ override def onAddField(field: HttpField): HttpField = {
+ if (field.is(HttpHeader.LOCATION.asString())) {
+ val location = field.getValue
+ // null check should be done by Jetty before adding Location header.
+ assert(location != null)
val target = new URI(location)
// The target path should already be encoded, so don't re-encode it,
just the
// proxy address part.
val proxyBase = UIUtils.uiRoot(req)
val proxyPrefix = if (proxyBase.nonEmpty) s"$proxyUri$proxyBase" else
proxyUri
- s"${res.encodeURL(proxyPrefix)}${target.getPath()}"
+ val newTarget = URIUtil.encodePath(proxyPrefix) + target.getPath()
+ new HttpField(field.getName(), newTarget)
} else {
- null
+ field
}
- super.sendRedirect(newTarget)
}
}
+}
+
+private class HttpsRedirectFilter(scheme: String, securePort: Int) extends
Filter {
+
+ override def doFilter(
+ request: ServletRequest,
+ response: ServletResponse,
+ chain: FilterChain): Unit = {
+ if (request.isSecure) {
+ return
+ }
+ val httpRequest = request.asInstanceOf[HttpServletRequest]
+ val httpResponse = response.asInstanceOf[HttpServletResponse]
+ val httpsURI = createRedirectURI(scheme, securePort, httpRequest)
+ httpResponse.setContentLength(0)
+ httpResponse.sendRedirect(httpResponse.encodeRedirectURL(httpsURI))
+ }
+ // Create a new URI from the arguments, handling IPv6 host encoding and
default ports.
+ private def createRedirectURI(scheme: String, port: Int, request:
HttpServletRequest): String = {
+ val server = request.getServerName
+ val redirectServer = if (server.contains(":") && !server.startsWith("[")) {
+ s"[$server]"
+ } else {
+ server
+ }
Review Comment:
was not aware of that, it's fine then.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]