diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-13 03:54:50 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-13 03:54:50 +0800 |
commit | 2fc9fd22084bb4a89a72be525c18fc409303ada5 (patch) | |
tree | 511734c255237e99ba0b5b302232073572faaa38 /cask/src/cask/endpoints | |
parent | 790deda0f38e36c7378ff05a9c234a56e14a5d6b (diff) | |
download | cask-2fc9fd22084bb4a89a72be525c18fc409303ada5.tar.gz cask-2fc9fd22084bb4a89a72be525c18fc409303ada5.tar.bz2 cask-2fc9fd22084bb4a89a72be525c18fc409303ada5.zip |
Basic websocket support works
Diffstat (limited to 'cask/src/cask/endpoints')
-rw-r--r-- | cask/src/cask/endpoints/FormEndpoint.scala | 4 | ||||
-rw-r--r-- | cask/src/cask/endpoints/JsonEndpoint.scala | 5 | ||||
-rw-r--r-- | cask/src/cask/endpoints/StaticEndpoints.scala | 6 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebEndpoints.scala | 6 | ||||
-rw-r--r-- | cask/src/cask/endpoints/WebSocketEndpoint.scala | 52 |
5 files changed, 62 insertions, 11 deletions
diff --git a/cask/src/cask/endpoints/FormEndpoint.scala b/cask/src/cask/endpoints/FormEndpoint.scala index 48190ce..eb882fa 100644 --- a/cask/src/cask/endpoints/FormEndpoint.scala +++ b/cask/src/cask/endpoints/FormEndpoint.scala @@ -1,7 +1,7 @@ package cask.endpoints import cask.internal.{Router, Util} -import cask.main.{Endpoint, Routes} +import cask.main.{Endpoint, HttpDecorator, Routes} import cask.model._ import io.undertow.server.handlers.form.FormParserFactory @@ -43,7 +43,7 @@ object FormReader{ def read(ctx: ParamContext, label: String, input: Seq[FormEntry]) = input.map(_.asInstanceOf[FormFile]) } } -class postForm(val path: String, override val subpath: Boolean = false) extends Endpoint{ +class postForm(val path: String, override val subpath: Boolean = false) extends Endpoint with HttpDecorator{ type Output = Response val methods = Seq("post") diff --git a/cask/src/cask/endpoints/JsonEndpoint.scala b/cask/src/cask/endpoints/JsonEndpoint.scala index 51199c3..f3b0cae 100644 --- a/cask/src/cask/endpoints/JsonEndpoint.scala +++ b/cask/src/cask/endpoints/JsonEndpoint.scala @@ -4,7 +4,7 @@ import java.io.ByteArrayOutputStream import cask.internal.{Router, Util} import cask.internal.Router.EntryPoint -import cask.main.{Endpoint, Routes} +import cask.main.{Endpoint, HttpDecorator, Routes} import cask.model.{ParamContext, Response} @@ -26,12 +26,11 @@ object JsReader{ } } } -class postJson(val path: String, override val subpath: Boolean = false) extends Endpoint{ +class postJson(val path: String, override val subpath: Boolean = false) extends Endpoint with HttpDecorator{ type Output = Response val methods = Seq("post") type Input = ujson.Js.Value type InputParser[T] = JsReader[T] - def wrapFunction(ctx: ParamContext, delegate: Map[String, Input] => Router.Result[Output]): Router.Result[Response] = { val obj = for{ diff --git a/cask/src/cask/endpoints/StaticEndpoints.scala b/cask/src/cask/endpoints/StaticEndpoints.scala index e93c09b..a9b3193 100644 --- a/cask/src/cask/endpoints/StaticEndpoints.scala +++ b/cask/src/cask/endpoints/StaticEndpoints.scala @@ -1,10 +1,10 @@ package cask.endpoints import cask.internal.Router -import cask.main.Endpoint -import cask.model.{Response, ParamContext} +import cask.main.{Endpoint, HttpDecorator} +import cask.model.{ParamContext, Response} -class static(val path: String) extends Endpoint { +class static(val path: String) extends Endpoint with HttpDecorator{ type Output = String val methods = Seq("get") type Input = Seq[String] diff --git a/cask/src/cask/endpoints/WebEndpoints.scala b/cask/src/cask/endpoints/WebEndpoints.scala index 2125b4d..41c3113 100644 --- a/cask/src/cask/endpoints/WebEndpoints.scala +++ b/cask/src/cask/endpoints/WebEndpoints.scala @@ -1,13 +1,13 @@ package cask.endpoints import cask.internal.Router -import cask.main.Endpoint -import cask.model.{Response, ParamContext} +import cask.main.{Endpoint, HttpDecorator} +import cask.model.{ParamContext, Response} import collection.JavaConverters._ -trait WebEndpoint extends Endpoint{ +trait WebEndpoint extends Endpoint with HttpDecorator{ type Output = Response type Input = Seq[String] type InputParser[T] = QueryParamReader[T] diff --git a/cask/src/cask/endpoints/WebSocketEndpoint.scala b/cask/src/cask/endpoints/WebSocketEndpoint.scala new file mode 100644 index 0000000..a795afd --- /dev/null +++ b/cask/src/cask/endpoints/WebSocketEndpoint.scala @@ -0,0 +1,52 @@ +package cask.endpoints + +import cask.internal.Router +import cask.model.{ParamContext, Subpath} +import io.undertow.server.HttpServerExchange +import io.undertow.websockets.WebSocketConnectionCallback +trait WebsocketParam[T] extends Router.ArgReader[Seq[String], T, cask.model.ParamContext] + +object WebsocketParam{ + class NilParam[T](f: (ParamContext, String) => T) extends WebsocketParam[T]{ + def arity = 0 + def read(ctx: ParamContext, 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) + } + + implicit object StringParam extends SimpleParam[String](x => x) + implicit object BooleanParam extends SimpleParam[Boolean](_.toBoolean) + implicit object ByteParam extends SimpleParam[Byte](_.toByte) + implicit object ShortParam extends SimpleParam[Short](_.toShort) + implicit object IntParam extends SimpleParam[Int](_.toInt) + implicit object LongParam extends SimpleParam[Long](_.toLong) + implicit object DoubleParam extends SimpleParam[Double](_.toDouble) + implicit object FloatParam extends SimpleParam[Float](_.toFloat) +} + +sealed trait WebsocketResult +object WebsocketResult{ + implicit class Response(val value: cask.model.Response) extends WebsocketResult + implicit class Listener(val value: WebSocketConnectionCallback) extends WebsocketResult +} + +class websocket(val path: String, subpath: Boolean = false) extends cask.main.BaseEndpoint{ + type Output = WebsocketResult + val methods = Seq("websocket") + type Input = Seq[String] + type InputParser[T] = WebsocketParam[T] + type Returned = Router.Result[WebsocketResult] + def wrapFunction(ctx: ParamContext, delegate: Delegate): Returned = delegate(Map()) + + def wrapPathSegment(s: String): Input = Seq(s) + + +} |