diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 12:36:07 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-26 12:36:07 +0800 |
commit | d8ae2662b44cc70d296832e3dc54685de4008a2d (patch) | |
tree | 61235be47c85a16707a53861bee97ee3651bb487 /cask/src/cask/endpoints | |
parent | dfaece8336adc803b9088621b45bdba1deb3213f (diff) | |
download | cask-d8ae2662b44cc70d296832e3dc54685de4008a2d.tar.gz cask-d8ae2662b44cc70d296832e3dc54685de4008a2d.tar.bz2 cask-d8ae2662b44cc70d296832e3dc54685de4008a2d.zip |
Allow Decorators to short-circuit request processing by bailing out early
Diffstat (limited to 'cask/src/cask/endpoints')
-rw-r--r-- | cask/src/cask/endpoints/FormEndpoint.scala | 25 | ||||
-rw-r--r-- | cask/src/cask/endpoints/JsonEndpoint.scala | 21 | ||||
-rw-r--r-- | cask/src/cask/endpoints/StaticEndpoints.scala | 2 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebEndpoints.scala | 10 |
4 files changed, 41 insertions, 17 deletions
diff --git a/cask/src/cask/endpoints/FormEndpoint.scala b/cask/src/cask/endpoints/FormEndpoint.scala index 2d9fc1f..2a7fbd2 100644 --- a/cask/src/cask/endpoints/FormEndpoint.scala +++ b/cask/src/cask/endpoints/FormEndpoint.scala @@ -1,6 +1,6 @@ package cask.endpoints -import cask.internal.Router +import cask.internal.{Router, Util} import cask.main.Routes import cask.model.{FormValue, ParamContext, Response} import io.undertow.server.handlers.form.FormParserFactory @@ -40,14 +40,21 @@ class postForm(val path: String, override val subpath: Boolean = false) extends type Input = Seq[FormValue] type InputParser[T] = FormReader[T] def getRawParams(ctx: ParamContext) = { - val formData = FormParserFactory.builder().build().createParser(ctx.exchange).parseBlocking() - val formDataBindings = - formData - .iterator() - .asScala - .map(k => (k, formData.get(k).asScala.map(FormValue.fromUndertow).toSeq)) - .toMap - formDataBindings + for{ + formData <- + try Right(FormParserFactory.builder().build().createParser(ctx.exchange).parseBlocking()) + catch{case e: Exception => Left(cask.model.Response( + "Unable to parse form data: " + e + "\n" + Util.stackTraceString(e) + ))} + } yield { + val formDataBindings = + formData + .iterator() + .asScala + .map(k => (k, formData.get(k).asScala.map(FormValue.fromUndertow).toSeq)) + .toMap + formDataBindings + } } def wrapPathSegment(s: String): Input = Seq(FormValue.Plain(s, new io.undertow.util.HeaderMap)) } diff --git a/cask/src/cask/endpoints/JsonEndpoint.scala b/cask/src/cask/endpoints/JsonEndpoint.scala index 80fac9a..d9d39c3 100644 --- a/cask/src/cask/endpoints/JsonEndpoint.scala +++ b/cask/src/cask/endpoints/JsonEndpoint.scala @@ -1,6 +1,6 @@ package cask.endpoints -import cask.internal.Router +import cask.internal.{Router, Util} import cask.internal.Router.EntryPoint import cask.main.Routes import cask.model.{ParamContext, Response} @@ -28,7 +28,22 @@ class postJson(val path: String, override val subpath: Boolean = false) extends val methods = Seq("post") type Input = ujson.Js.Value type InputParser[T] = JsReader[T] - def getRawParams(ctx: ParamContext) = - ujson.read(new String(ctx.exchange.getInputStream.readAllBytes())).obj.toMap + def getRawParams(ctx: ParamContext) = { + for{ + str <- + try Right(new String(ctx.exchange.getInputStream.readAllBytes())) + catch{case e: Throwable => Left(cask.model.Response( + "Unable to deserialize input JSON text: " + e + "\n" + Util.stackTraceString(e) + ))} + json <- + try Right(ujson.read(str)) + catch{case e: Throwable => Left(cask.model.Response( + "Input text is invalid JSON: " + e + "\n" + Util.stackTraceString(e) + ))} + obj <- + try Right(json.obj) + catch {case e: Throwable => Left(cask.model.Response("Input JSON must be a dictionary"))} + } yield obj.toMap + } def wrapPathSegment(s: String): Input = ujson.Js.Str(s) } diff --git a/cask/src/cask/endpoints/StaticEndpoints.scala b/cask/src/cask/endpoints/StaticEndpoints.scala index 5d57144..31528aa 100644 --- a/cask/src/cask/endpoints/StaticEndpoints.scala +++ b/cask/src/cask/endpoints/StaticEndpoints.scala @@ -14,6 +14,6 @@ class static(val path: String) extends Routes.Endpoint[String] { Router.Result.Success(cask.model.Static(t + "/" + ctx.remaining.mkString("/"))) } - def getRawParams(ctx: ParamContext) = Map() + def getRawParams(ctx: ParamContext) = Right(Map()) def wrapPathSegment(s: String): Input = Seq(s) } diff --git a/cask/src/cask/endpoints/WebEndpoints.scala b/cask/src/cask/endpoints/WebEndpoints.scala index 82009df..cd707b8 100644 --- a/cask/src/cask/endpoints/WebEndpoints.scala +++ b/cask/src/cask/endpoints/WebEndpoints.scala @@ -11,10 +11,12 @@ import collection.JavaConverters._ trait WebEndpoint extends Routes.Endpoint[BaseResponse]{ type Input = Seq[String] type InputParser[T] = QueryParamReader[T] - def getRawParams(ctx: ParamContext) = ctx.exchange.getQueryParameters - .asScala - .map{case (k, vs) => (k, vs.asScala.toArray.toSeq)} - .toMap + def getRawParams(ctx: ParamContext) = Right( + ctx.exchange.getQueryParameters + .asScala + .map{case (k, vs) => (k, vs.asScala.toArray.toSeq)} + .toMap + ) def wrapPathSegment(s: String) = Seq(s) } class get(val path: String, override val subpath: Boolean = false) extends WebEndpoint{ |