diff --git a/src/main/scala/plugin/package.scala b/src/main/scala/plugin/package.scala index ffb519b..15fbad9 100644 --- a/src/main/scala/plugin/package.scala +++ b/src/main/scala/plugin/package.scala @@ -7,6 +7,7 @@ case class Redirect(path: String) case class Fragment(html: Html) + case class RawData(contentType: String, content: Array[Byte]) object db { // TODO labelled place holder support diff --git a/src/main/scala/servlet/PluginActionInvokeFilter.scala b/src/main/scala/servlet/PluginActionInvokeFilter.scala index 7076579..b74ac73 100644 --- a/src/main/scala/servlet/PluginActionInvokeFilter.scala +++ b/src/main/scala/servlet/PluginActionInvokeFilter.scala @@ -7,7 +7,7 @@ import service.{AccountService, RepositoryService, SystemSettingsService} import model.{Account, Session} import util.{JGitUtil, Keys} -import plugin.{Fragment, PluginConnectionHolder, Redirect} +import plugin.{RawData, Fragment, PluginConnectionHolder, Redirect} import service.RepositoryService.RepositoryInfo import plugin.Security._ @@ -46,13 +46,7 @@ } finally { PluginConnectionHolder.threadLocal.remove() } - result match { - case x: String => renderGlobalHtml(request, response, context, x) - case x: Html => renderGlobalHtml(request, response, context, x.toString) - case x: Fragment => renderFragmentHtml(request, response, context, x.html.toString) - case x: Redirect => response.sendRedirect(x.path) - case x: AnyRef => renderJson(request, response, x) - } + processActionResult(result, request, response, context) } else { // TODO NotFound or Error? } @@ -81,13 +75,7 @@ } finally { PluginConnectionHolder.threadLocal.remove() } - result match { - case x: String => renderRepositoryHtml(request, response, context, repository, x) - case x: Html => renderGlobalHtml(request, response, context, x.toString) - case x: Fragment => renderFragmentHtml(request, response, context, x.html.toString) - case x: Redirect => response.sendRedirect(x.path) - case x: AnyRef => renderJson(request, response, x) - } + processActionResult(result, request, response, context) } else { // TODO NotFound or Error? } @@ -97,6 +85,24 @@ } else false } + private def processActionResult(result: Any, request: HttpServletRequest, response: HttpServletResponse, + context: app.Context): Unit = { + result match { + case null|None => renderError(request, response, context, 404) + case x: String => renderGlobalHtml(request, response, context, x) + case Some(x: String) => renderGlobalHtml(request, response, context, x) + case x: Html => renderGlobalHtml(request, response, context, x.toString) + case Some(x: Html) => renderGlobalHtml(request, response, context, x.toString) + case x: Fragment => renderFragmentHtml(request, response, context, x.html.toString) + case Some(x: Fragment) => renderFragmentHtml(request, response, context, x.html.toString) + case x: RawData => renderRawData(request, response, context, x) + case Some(x: RawData) => renderRawData(request, response, context, x) + case x: Redirect => response.sendRedirect(x.path) + case Some(x: Redirect) => response.sendRedirect(x.path) + case x: AnyRef => renderJson(request, response, x) + } + } + /** * Authentication for global action */ @@ -145,6 +151,10 @@ } } + private def renderError(request: HttpServletRequest, response: HttpServletResponse, context: app.Context, error: Int): Unit = { + response.sendError(error) + } + private def renderGlobalHtml(request: HttpServletRequest, response: HttpServletResponse, context: app.Context, body: String): Unit = { response.setContentType("text/html; charset=UTF-8") val html = _root_.html.main("GitBucket", None)(Html(body))(context) @@ -162,6 +172,11 @@ IOUtils.write(body.getBytes("UTF-8"), response.getOutputStream) } + private def renderRawData(request: HttpServletRequest, response: HttpServletResponse, context: app.Context, rawData: RawData): Unit = { + response.setContentType(rawData.contentType) + IOUtils.write(rawData.content, response.getOutputStream) + } + private def renderJson(request: HttpServletRequest, response: HttpServletResponse, obj: AnyRef): Unit = { import org.json4s._ import org.json4s.jackson.Serialization