summaryrefslogtreecommitdiff
path: root/cask/src/cask/endpoints
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-13 03:54:50 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-13 03:54:50 +0800
commit2fc9fd22084bb4a89a72be525c18fc409303ada5 (patch)
tree511734c255237e99ba0b5b302232073572faaa38 /cask/src/cask/endpoints
parent790deda0f38e36c7378ff05a9c234a56e14a5d6b (diff)
downloadcask-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.scala4
-rw-r--r--cask/src/cask/endpoints/JsonEndpoint.scala5
-rw-r--r--cask/src/cask/endpoints/StaticEndpoints.scala6
-rw-r--r--cask/src/cask/endpoints/WebEndpoints.scala6
-rw-r--r--cask/src/cask/endpoints/WebSocketEndpoint.scala52
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)
+
+
+}