diff --git a/src/main/scala/gitbucket/core/controller/ControllerBase.scala b/src/main/scala/gitbucket/core/controller/ControllerBase.scala index 60e7893..41b45cd 100644 --- a/src/main/scala/gitbucket/core/controller/ControllerBase.scala +++ b/src/main/scala/gitbucket/core/controller/ControllerBase.scala @@ -26,6 +26,7 @@ import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.treewalk._ import org.apache.commons.io.IOUtils +import org.slf4j.LoggerFactory /** * Provides generic features for controller implementations. @@ -34,6 +35,8 @@ with ClientSideValidationFormSupport with JacksonJsonSupport with I18nSupport with FlashMapSupport with Validations with SystemSettingsService { + private val logger = LoggerFactory.getLogger(getClass) + implicit val jsonFormats = gitbucket.core.api.JsonFormat.jsonFormats before("/api/v3/*") { @@ -147,6 +150,20 @@ } } + error{ + case e => { + logger.error(s"Catch unhandled error in request: ${request}", e) + if(request.hasAttribute(Keys.Request.Ajax)){ + org.scalatra.InternalServerError() + } else if(request.hasAttribute(Keys.Request.APIv3)){ + contentType = formats("json") + org.scalatra.InternalServerError(ApiError("Internal Server Error")) + } else { + org.scalatra.InternalServerError(gitbucket.core.html.error("Internal Server Error", Some(e))) + } + } + } + override def url(path: String, params: Iterable[(String, Any)] = Iterable.empty, includeContextPath: Boolean = true, includeServletPath: Boolean = true, absolutize: Boolean = true, withSessionId: Boolean = true) diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index 080d499..47585c7 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -64,7 +64,8 @@ "ssl" -> trim(label("Enable SSL", optional(boolean()))), "keystore" -> trim(label("Keystore", optional(text()))) )(Ldap.apply)), - "skinName" -> trim(label("AdminLTE skin name", text(required))) + "skinName" -> trim(label("AdminLTE skin name", text(required))), + "debug" -> trim(label("Debug", boolean())) )(SystemSettings.apply).verifying { settings => Vector( if(settings.ssh && settings.baseUrl.isEmpty){ diff --git a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala index c73ed35..591dd54 100644 --- a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala +++ b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala @@ -55,6 +55,7 @@ } } props.setProperty(SkinName, settings.skinName.toString) + props.setProperty(Debug, settings.debug.toString) using(new java.io.FileOutputStream(GitBucketConf)){ out => props.store(out, null) } @@ -113,7 +114,8 @@ } else { None }, - getValue(props, SkinName, "skin-blue") + getValue(props, SkinName, "skin-blue"), + getValue(props, Debug, false) ) } } @@ -139,7 +141,8 @@ smtp: Option[Smtp], ldapAuthentication: Boolean, ldap: Option[Ldap], - skinName: String){ + skinName: String, + debug: Boolean){ def baseUrl(request: HttpServletRequest): String = baseUrl.fold(request.baseUrl)(_.stripSuffix("/")) def sshAddress:Option[SshAddress] = @@ -223,6 +226,7 @@ private val LdapSsl = "ldap.ssl" private val LdapKeystore = "ldap.keystore" private val SkinName = "skinName" + private val Debug = "debug" private def getValue[A: ClassTag](props: java.util.Properties, key: String, default: A): A = { getSystemProperty(key).getOrElse(getEnvironmentVariable(key).getOrElse { diff --git a/src/main/twirl/gitbucket/core/error.scala.html b/src/main/twirl/gitbucket/core/error.scala.html index 3c987d8..2671797 100644 --- a/src/main/twirl/gitbucket/core/error.scala.html +++ b/src/main/twirl/gitbucket/core/error.scala.html @@ -1,8 +1,22 @@ -@(title: String)(implicit context: gitbucket.core.controller.Context) +@(title: String, e: Option[Throwable]=None)(implicit context: gitbucket.core.controller.Context) @gitbucket.core.html.main("Error"){
@st |