summaryrefslogtreecommitdiff
path: root/cask/src/cask/endpoints
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:36:07 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-26 12:36:07 +0800
commitd8ae2662b44cc70d296832e3dc54685de4008a2d (patch)
tree61235be47c85a16707a53861bee97ee3651bb487 /cask/src/cask/endpoints
parentdfaece8336adc803b9088621b45bdba1deb3213f (diff)
downloadcask-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.scala25
-rw-r--r--cask/src/cask/endpoints/JsonEndpoint.scala21
-rw-r--r--cask/src/cask/endpoints/StaticEndpoints.scala2
-rw-r--r--cask/src/cask/endpoints/WebEndpoints.scala10
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{