summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-07-22 01:53:26 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-07-22 01:53:26 +0800
commit48b60ea02268b060f859101a41fee5394925237a (patch)
tree69a0c3336e17d6367f7839de632464aee7799b91
parentcc42c8dd9778862c8a0eb10c0e5051409a105666 (diff)
downloadcask-48b60ea02268b060f859101a41fee5394925237a.tar.gz
cask-48b60ea02268b060f859101a41fee5394925237a.tar.bz2
cask-48b60ea02268b060f859101a41fee5394925237a.zip
File uploads and cookies now work
-rw-r--r--cask/src/cask/Main.scala9
-rw-r--r--cask/src/cask/ParamReader.scala12
-rw-r--r--cask/src/cask/Routes.scala5
-rw-r--r--cask/src/cask/Util.scala5
-rw-r--r--cask/test/src/test/cask/Cookies.scala22
-rw-r--r--cask/test/src/test/cask/FileUploads.scala16
-rw-r--r--notes.txt32
7 files changed, 97 insertions, 4 deletions
diff --git a/cask/src/cask/Main.scala b/cask/src/cask/Main.scala
index 8cdbd4f..13e638b 100644
--- a/cask/src/cask/Main.scala
+++ b/cask/src/cask/Main.scala
@@ -41,6 +41,7 @@ abstract class BaseMain{
response.headers.foreach{case (k, v) =>
exchange.getResponseHeaders.put(new HttpString(k), v)
}
+ response.cookies.foreach(exchange.setResponseCookie)
exchange.setStatusCode(response.statusCode)
response.data.write(exchange.getOutputStream)
@@ -58,7 +59,13 @@ abstract class BaseMain{
result match{
case Router.Result.Success(response: Response) => writeResponse(exchange, response)
- case err: Router.Result.Error => writeResponse(exchange, handleError(400))
+ case Router.Result.Error.Exception(e) =>
+ println(e)
+ e.printStackTrace()
+ writeResponse(exchange, handleError(500))
+ case err: Router.Result.Error =>
+ println(err)
+ writeResponse(exchange, handleError(400))
}
diff --git a/cask/src/cask/ParamReader.scala b/cask/src/cask/ParamReader.scala
index d389049..75b0d14 100644
--- a/cask/src/cask/ParamReader.scala
+++ b/cask/src/cask/ParamReader.scala
@@ -1,6 +1,8 @@
package cask
import io.undertow.server.HttpServerExchange
+import io.undertow.server.handlers.Cookie
+import io.undertow.server.handlers.form.{FormData, FormParserFactory}
abstract class ParamReader[T]
extends Router.ArgReader[T, (HttpServerExchange, Seq[String])]{
@@ -33,6 +35,14 @@ object ParamReader{
implicit object HttpExchangeParam extends NilParam[HttpServerExchange]((server, remaining) => server)
implicit object SubpathParam extends NilParam[Subpath]((server, remaining) => new Subpath(remaining))
+ implicit object CookieParam extends NilParam[Cookies]((server, remaining) => {
+ import collection.JavaConverters._
+ new Cookies(server.getRequestCookies.asScala.toMap)
+ })
+ implicit object FormDataParam extends NilParam[FormData]((server, remaining) =>
+ FormParserFactory.builder().build().createParser(server).parseBlocking()
+ )
}
-class Subpath(val value: Seq[String]) \ No newline at end of file
+class Subpath(val value: Seq[String])
+class Cookies(val value: Map[String, Cookie]) \ No newline at end of file
diff --git a/cask/src/cask/Routes.scala b/cask/src/cask/Routes.scala
index 01783f0..dabf711 100644
--- a/cask/src/cask/Routes.scala
+++ b/cask/src/cask/Routes.scala
@@ -8,10 +8,13 @@ import io.undertow.server.HttpServerExchange
import scala.reflect.macros.blackbox.Context
import java.io.InputStream
+import io.undertow.server.handlers.Cookie
+
case class Response(data: Response.Data,
statusCode: Int = 200,
- headers: Seq[(String, String)] = Nil)
+ headers: Seq[(String, String)] = Nil,
+ cookies: Seq[Cookie] = Nil)
object Response{
implicit def dataResponse[T](t: T)(implicit c: T => Data) = Response(t)
trait Data{
diff --git a/cask/src/cask/Util.scala b/cask/src/cask/Util.scala
index 0f88883..3d5035a 100644
--- a/cask/src/cask/Util.scala
+++ b/cask/src/cask/Util.scala
@@ -1,7 +1,10 @@
package cask
+import java.net.HttpCookie
+
+import io.undertow.server.handlers.{Cookie, CookieImpl}
+
object Util {
def splitPath(p: String) =
p.dropWhile(_ == '/').reverse.dropWhile(_ == '/').reverse.split('/').filter(_.nonEmpty)
-
}
diff --git a/cask/test/src/test/cask/Cookies.scala b/cask/test/src/test/cask/Cookies.scala
new file mode 100644
index 0000000..9b32f25
--- /dev/null
+++ b/cask/test/src/test/cask/Cookies.scala
@@ -0,0 +1,22 @@
+package test.cask
+
+import io.undertow.server.handlers.CookieImpl
+
+object Cookies extends cask.MainRoutes{
+ @cask.get("/read-cookies")
+ def readCookies(cookies: cask.Cookies) = {
+ val username = cookies.value.get("username")
+ username.map(_.getValue).toString
+ }
+
+ @cask.get("store-cookies")
+ def storeCookies() = {
+ cask.Response(
+ "Cookies Set!",
+ cookies = Seq(new CookieImpl("username", "the username"))
+ )
+ }
+
+ initialize()
+}
+
diff --git a/cask/test/src/test/cask/FileUploads.scala b/cask/test/src/test/cask/FileUploads.scala
new file mode 100644
index 0000000..e56be2d
--- /dev/null
+++ b/cask/test/src/test/cask/FileUploads.scala
@@ -0,0 +1,16 @@
+package test.cask
+
+import io.undertow.server.HttpServerExchange
+import io.undertow.server.handlers.form.FormData
+
+object FileUploads extends cask.MainRoutes{
+ // curl -F "image=@build.sc" localhost:8080/upload
+ @cask.post("/upload")
+ def uploadFile(exchange: HttpServerExchange, formData: FormData) = {
+ val file = formData.getFirst("image")
+ file.getPath.toString
+ }
+
+ initialize()
+}
+
diff --git a/notes.txt b/notes.txt
new file mode 100644
index 0000000..7977544
--- /dev/null
+++ b/notes.txt
@@ -0,0 +1,32 @@
+Web Framework
+- Build tool
+ Y Mill
+- Routing
+ ? Custom
+ Y Basics
+ X Composition
+- HTML Templating
+ Y Scalatags
+ Y Twirl
+- JSON
+ Y uJson
+- Filesystem
+ Y Ammonite
+- SQL
+ Y Quill?
+- Migrations
+ ?
+- HTTP Client
+ Y Requests-Scala
+- Modules
+ X Traits mixed into Main
+- Dev Environment
+ X Custom
+--- PUNT ---
+Async
+Forms
+Client-side Support
+ - Packaging/Resource pipelines can be handled by Mill
+Sending Emails
+User Management
+Sending Emails \ No newline at end of file