diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-18 10:16:27 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-18 10:16:27 +0800 |
commit | 4b0cfdf0eeca46cfccbf9fe42af42f383932c427 (patch) | |
tree | eafc563d53cc6d840d88a9848a88fa67f03cbb9e /cask/src/cask/endpoints | |
parent | f8bb6f693b8450f8e049396fd0e7d032ac7acb23 (diff) | |
download | cask-4b0cfdf0eeca46cfccbf9fe42af42f383932c427.tar.gz cask-4b0cfdf0eeca46cfccbf9fe42af42f383932c427.tar.bz2 cask-4b0cfdf0eeca46cfccbf9fe42af42f383932c427.zip |
0.1.10.1.1
Diffstat (limited to 'cask/src/cask/endpoints')
-rw-r--r-- | cask/src/cask/endpoints/FormEndpoint.scala | 18 | ||||
-rw-r--r-- | cask/src/cask/endpoints/JsonEndpoint.scala | 10 | ||||
-rw-r--r-- | cask/src/cask/endpoints/ParamReader.scala | 16 | ||||
-rw-r--r-- | cask/src/cask/endpoints/StaticEndpoints.scala | 10 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebEndpoints.scala | 16 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebSocketEndpoint.scala | 15 |
6 files changed, 44 insertions, 41 deletions
diff --git a/cask/src/cask/endpoints/FormEndpoint.scala b/cask/src/cask/endpoints/FormEndpoint.scala index a952a2a..cc74093 100644 --- a/cask/src/cask/endpoints/FormEndpoint.scala +++ b/cask/src/cask/endpoints/FormEndpoint.scala @@ -7,40 +7,40 @@ import io.undertow.server.handlers.form.FormParserFactory import collection.JavaConverters._ -sealed trait FormReader[T] extends Router.ArgReader[Seq[FormEntry], T, ParamContext] +sealed trait FormReader[T] extends Router.ArgReader[Seq[FormEntry], T, Request] object FormReader{ implicit def paramFormReader[T: QueryParamReader] = new FormReader[T]{ def arity = implicitly[QueryParamReader[T]].arity - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = { + def read(ctx: Request, label: String, input: Seq[FormEntry]) = { implicitly[QueryParamReader[T]].read(ctx, label, if (input == null) null else input.map(_.valueOrFileName)) } } implicit def formEntryReader = new FormReader[FormEntry]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.head + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input.head } implicit def formEntriesReader = new FormReader[Seq[FormEntry]]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input } implicit def formValueReader = new FormReader[FormValue]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.head.asInstanceOf[FormValue] + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input.head.asInstanceOf[FormValue] } implicit def formValuesReader = new FormReader[Seq[FormValue]]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.map(_.asInstanceOf[FormValue]) + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input.map(_.asInstanceOf[FormValue]) } implicit def formFileReader = new FormReader[FormFile]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.head.asInstanceOf[FormFile] + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input.head.asInstanceOf[FormFile] } implicit def formFilesReader = new FormReader[Seq[FormFile]]{ def arity = 1 - def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.map(_.asInstanceOf[FormFile]) + def read(ctx: Request, label: String, input: Seq[FormEntry]) = input.map(_.asInstanceOf[FormFile]) } } class postForm(val path: String, override val subpath: Boolean = false) extends Endpoint { @@ -49,7 +49,7 @@ class postForm(val path: String, override val subpath: Boolean = false) extends val methods = Seq("post") type Input = Seq[FormEntry] type InputParser[T] = FormReader[T] - def wrapFunction(ctx: ParamContext, + def wrapFunction(ctx: Request, delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = { try { val formData = FormParserFactory.builder().build().createParser(ctx.exchange).parseBlocking() diff --git a/cask/src/cask/endpoints/JsonEndpoint.scala b/cask/src/cask/endpoints/JsonEndpoint.scala index f91b888..212597c 100644 --- a/cask/src/cask/endpoints/JsonEndpoint.scala +++ b/cask/src/cask/endpoints/JsonEndpoint.scala @@ -5,15 +5,15 @@ import java.io.ByteArrayOutputStream import cask.internal.{Router, Util} import cask.internal.Router.EntryPoint import cask.main.{Endpoint, HttpDecorator, Routes} -import cask.model.{ParamContext, Response} +import cask.model.{Request, Response} -sealed trait JsReader[T] extends Router.ArgReader[ujson.Js.Value, T, cask.model.ParamContext] +sealed trait JsReader[T] extends Router.ArgReader[ujson.Js.Value, T, cask.model.Request] object JsReader{ implicit def defaultJsReader[T: upickle.default.Reader] = new JsReader[T]{ def arity = 1 - def read(ctx: cask.model.ParamContext, label: String, input: ujson.Js.Value): T = { + def read(ctx: cask.model.Request, label: String, input: ujson.Js.Value): T = { implicitly[upickle.default.Reader[T]].apply(input) } } @@ -21,7 +21,7 @@ object JsReader{ implicit def paramReader[T: ParamReader] = new JsReader[T] { override def arity = 0 - override def read(ctx: cask.model.ParamContext, label: String, v: ujson.Js.Value) = { + override def read(ctx: cask.model.Request, label: String, v: ujson.Js.Value) = { implicitly[ParamReader[T]].read(ctx, label, Nil) } } @@ -31,7 +31,7 @@ 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 wrapFunction(ctx: ParamContext, + def wrapFunction(ctx: Request, delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = { val obj = for{ str <- diff --git a/cask/src/cask/endpoints/ParamReader.scala b/cask/src/cask/endpoints/ParamReader.scala index f1ec0bf..e43f482 100644 --- a/cask/src/cask/endpoints/ParamReader.scala +++ b/cask/src/cask/endpoints/ParamReader.scala @@ -1,22 +1,28 @@ package cask.endpoints import cask.internal.Router -import cask.model.ParamContext +import cask.model.{Cookie, Request} import io.undertow.server.HttpServerExchange import io.undertow.server.handlers.form.{FormData, FormParserFactory} -abstract class ParamReader[T] extends Router.ArgReader[Unit, T, cask.model.ParamContext]{ +abstract class ParamReader[T] extends Router.ArgReader[Unit, T, cask.model.Request]{ def arity: Int - def read(ctx: cask.model.ParamContext, label: String, v: Unit): T + def read(ctx: cask.model.Request, label: String, v: Unit): T } object ParamReader{ - class NilParam[T](f: (ParamContext, String) => T) extends ParamReader[T]{ + class NilParam[T](f: (Request, String) => T) extends ParamReader[T]{ def arity = 0 - def read(ctx: cask.model.ParamContext, label: String, v: Unit): T = f(ctx, label) + def read(ctx: cask.model.Request, label: String, v: Unit): T = f(ctx, label) } implicit object HttpExchangeParam extends NilParam[HttpServerExchange]((ctx, label) => ctx.exchange) implicit object FormDataParam extends NilParam[FormData]((ctx, label) => FormParserFactory.builder().build().createParser(ctx.exchange).parseBlocking() ) + + implicit object RequestParam extends NilParam[Request]((ctx, label) => ctx) + + implicit object CookieParam extends NilParam[Cookie]((ctx, label) => + Cookie.fromUndertow(ctx.exchange.getRequestCookies().get(label)) + ) } diff --git a/cask/src/cask/endpoints/StaticEndpoints.scala b/cask/src/cask/endpoints/StaticEndpoints.scala index 1d66b2c..15eae0d 100644 --- a/cask/src/cask/endpoints/StaticEndpoints.scala +++ b/cask/src/cask/endpoints/StaticEndpoints.scala @@ -1,7 +1,7 @@ package cask.endpoints import cask.main.Endpoint -import cask.model.ParamContext +import cask.model.Request class staticFiles(val path: String) extends Endpoint{ type Output = String @@ -9,8 +9,8 @@ class staticFiles(val path: String) extends Endpoint{ type Input = Seq[String] type InputParser[T] = QueryParamReader[T] override def subpath = true - def wrapFunction(ctx: ParamContext, delegate: Delegate): Returned = { - delegate(Map()).map(t => cask.model.StaticFile(t + "/" + ctx.remaining.mkString("/"))) + def wrapFunction(ctx: Request, delegate: Delegate): Returned = { + delegate(Map()).map(t => cask.model.StaticFile(t + "/" + ctx.remainingPathSegments.mkString("/"))) } def wrapPathSegment(s: String): Input = Seq(s) @@ -22,9 +22,9 @@ class staticResources(val path: String, resourceRoot: ClassLoader = getClass.get type Input = Seq[String] type InputParser[T] = QueryParamReader[T] override def subpath = true - def wrapFunction(ctx: ParamContext, delegate: Delegate): Returned = { + def wrapFunction(ctx: Request, delegate: Delegate): Returned = { delegate(Map()).map(t => - cask.model.StaticResource(t + "/" + ctx.remaining.mkString("/"), resourceRoot) + cask.model.StaticResource(t + "/" + ctx.remainingPathSegments.mkString("/"), resourceRoot) ) } diff --git a/cask/src/cask/endpoints/WebEndpoints.scala b/cask/src/cask/endpoints/WebEndpoints.scala index 41c3113..02aeec4 100644 --- a/cask/src/cask/endpoints/WebEndpoints.scala +++ b/cask/src/cask/endpoints/WebEndpoints.scala @@ -2,7 +2,7 @@ package cask.endpoints import cask.internal.Router import cask.main.{Endpoint, HttpDecorator} -import cask.model.{ParamContext, Response} +import cask.model.{Request, Response} import collection.JavaConverters._ @@ -11,7 +11,7 @@ trait WebEndpoint extends Endpoint with HttpDecorator{ type Output = Response type Input = Seq[String] type InputParser[T] = QueryParamReader[T] - def wrapFunction(ctx: ParamContext, + def wrapFunction(ctx: Request, delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = { delegate( ctx.exchange.getQueryParameters @@ -34,14 +34,14 @@ class put(val path: String, override val subpath: Boolean = false) extends WebEn class route(val path: String, val methods: Seq[String], override val subpath: Boolean = false) extends WebEndpoint abstract class QueryParamReader[T] - extends Router.ArgReader[Seq[String], T, cask.model.ParamContext]{ + extends Router.ArgReader[Seq[String], T, cask.model.Request]{ def arity: Int - def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): T + def read(ctx: cask.model.Request, label: String, v: Seq[String]): T } object QueryParamReader{ class SimpleParam[T](f: String => T) extends QueryParamReader[T]{ def arity = 1 - def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): T = f(v.head) + def read(ctx: cask.model.Request, label: String, v: Seq[String]): T = f(v.head) } implicit object StringParam extends SimpleParam[String](x => x) @@ -54,20 +54,20 @@ object QueryParamReader{ implicit object FloatParam extends SimpleParam[Float](_.toFloat) implicit def SeqParam[T: QueryParamReader] = new QueryParamReader[Seq[T]]{ def arity = 1 - def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): Seq[T] = { + def read(ctx: cask.model.Request, label: String, v: Seq[String]): Seq[T] = { v.map(x => implicitly[QueryParamReader[T]].read(ctx, label, Seq(x))) } } implicit def OptionParam[T: QueryParamReader] = new QueryParamReader[Option[T]]{ def arity = 1 - def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): Option[T] = { + def read(ctx: cask.model.Request, label: String, v: Seq[String]): Option[T] = { v.headOption.map(x => implicitly[QueryParamReader[T]].read(ctx, label, Seq(x))) } } implicit def paramReader[T: ParamReader] = new QueryParamReader[T] { override def arity = 0 - override def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]) = { + override def read(ctx: cask.model.Request, label: String, v: Seq[String]) = { implicitly[ParamReader[T]].read(ctx, label, v) } } diff --git a/cask/src/cask/endpoints/WebSocketEndpoint.scala b/cask/src/cask/endpoints/WebSocketEndpoint.scala index 89c05b9..8c6bc16 100644 --- a/cask/src/cask/endpoints/WebSocketEndpoint.scala +++ b/cask/src/cask/endpoints/WebSocketEndpoint.scala @@ -1,25 +1,22 @@ package cask.endpoints import cask.internal.Router -import cask.model.{ParamContext, Subpath} +import cask.model.Request import io.undertow.server.HttpServerExchange import io.undertow.websockets.WebSocketConnectionCallback -trait WebsocketParam[T] extends Router.ArgReader[Seq[String], T, cask.model.ParamContext] +trait WebsocketParam[T] extends Router.ArgReader[Seq[String], T, cask.model.Request] object WebsocketParam{ - class NilParam[T](f: (ParamContext, String) => T) extends WebsocketParam[T]{ + class NilParam[T](f: (Request, String) => T) extends WebsocketParam[T]{ def arity = 0 - def read(ctx: ParamContext, label: String, v: Seq[String]): T = f(ctx, label) + def read(ctx: Request, label: String, v: Seq[String]): T = f(ctx, label) } implicit object HttpExchangeParam extends NilParam[HttpServerExchange]( (ctx, label) => ctx.exchange ) - implicit object SubpathParam extends NilParam[Subpath]( - (ctx, label) => new Subpath(ctx.remaining) - ) class SimpleParam[T](f: String => T) extends WebsocketParam[T]{ def arity = 1 - def read(ctx: cask.model.ParamContext, label: String, v: Seq[String]): T = f(v.head) + def read(ctx: cask.model.Request, label: String, v: Seq[String]): T = f(v.head) } implicit object StringParam extends SimpleParam[String](x => x) @@ -44,7 +41,7 @@ class websocket(val path: String, override val subpath: Boolean = false) extends type Input = Seq[String] type InputParser[T] = WebsocketParam[T] type Returned = Router.Result[WebsocketResult] - def wrapFunction(ctx: ParamContext, delegate: Delegate): Returned = delegate(Map()) + def wrapFunction(ctx: Request, delegate: Delegate): Returned = delegate(Map()) def wrapPathSegment(s: String): Input = Seq(s) |