lila/app/http/ErrorHandler.scala

58 lines
2.2 KiB
Scala
Raw Normal View History

2019-12-06 09:39:42 -07:00
package lila.app
package http
import play.api.http.DefaultHttpErrorHandler
import play.api.mvc._
import play.api.mvc.Results._
import play.api.routing._
import play.api.{ Configuration, Environment, UsefulException }
import scala.concurrent.Future
import lila.common.HTTPRequest
final class ErrorHandler(
environment: Environment,
config: Configuration,
2020-07-31 02:51:01 -06:00
router: => Router,
2019-12-06 10:17:46 -07:00
mainC: => controllers.Main,
lobbyC: => controllers.Lobby
2019-12-13 22:14:46 -07:00
)(implicit ec: scala.concurrent.ExecutionContext)
2020-08-07 08:22:26 -06:00
extends DefaultHttpErrorHandler(environment, config, router.some) {
2019-12-06 09:39:42 -07:00
2019-12-13 07:30:20 -07:00
override def onProdServerError(req: RequestHeader, exception: UsefulException) =
Future {
val actionName = HTTPRequest actionName req
2019-12-13 07:30:20 -07:00
val client = HTTPRequest clientName req
2019-12-22 06:20:15 -07:00
lila.mon.http.error(actionName, client, req.method, 500).increment()
2019-12-13 07:30:20 -07:00
lila.log("http").error(s"ERROR 500 $actionName", exception)
if (canShowErrorPage(req))
2020-03-08 11:13:55 -06:00
InternalServerError(views.html.site.bits.errorPage {
2019-12-13 07:30:20 -07:00
lila.api.Context.error(
req,
lila.i18n.defaultLang,
HTTPRequest.isSynchronousHttp(req) option lila.common.Nonce.random
)
})
2020-03-08 08:16:47 -06:00
else InternalServerError("Sorry, something went wrong.")
} recover { case scala.util.control.NonFatal(e) =>
2020-09-21 01:28:28 -06:00
lila.log("http").error(s"""Error handler exception on "${exception.getMessage}\"""", e)
InternalServerError("Sorry, something went very wrong.")
2019-12-13 07:30:20 -07:00
}
2019-12-06 09:39:42 -07:00
2019-12-08 13:07:24 -07:00
override def onClientError(req: RequestHeader, statusCode: Int, msg: String): Fu[Result] =
2019-12-06 10:17:46 -07:00
statusCode match {
case 404 if canShowErrorPage(req) => mainC.handlerNotFound(req)
2019-12-13 07:30:20 -07:00
case 404 => fuccess(NotFound("404 - Resource not found"))
case 403 => lobbyC.handleStatus(req, Results.Forbidden)
case _ if req.attrs.contains(request.RequestAttrKey.Session) =>
2019-12-06 10:17:46 -07:00
lobbyC.handleStatus(req, Results.BadRequest)
case _ =>
fuccess {
Results.BadRequest("Sorry, the request could not be processed")
}
2019-12-06 10:17:46 -07:00
}
2019-12-06 09:39:42 -07:00
private def canShowErrorPage(req: RequestHeader): Boolean =
HTTPRequest.isSynchronousHttp(req) && !HTTPRequest.hasFileExtension(req)
}