diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-22 01:53:26 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-07-22 01:53:26 +0800 |
commit | 48b60ea02268b060f859101a41fee5394925237a (patch) | |
tree | 69a0c3336e17d6367f7839de632464aee7799b91 | |
parent | cc42c8dd9778862c8a0eb10c0e5051409a105666 (diff) | |
download | cask-48b60ea02268b060f859101a41fee5394925237a.tar.gz cask-48b60ea02268b060f859101a41fee5394925237a.tar.bz2 cask-48b60ea02268b060f859101a41fee5394925237a.zip |
File uploads and cookies now work
-rw-r--r-- | cask/src/cask/Main.scala | 9 | ||||
-rw-r--r-- | cask/src/cask/ParamReader.scala | 12 | ||||
-rw-r--r-- | cask/src/cask/Routes.scala | 5 | ||||
-rw-r--r-- | cask/src/cask/Util.scala | 5 | ||||
-rw-r--r-- | cask/test/src/test/cask/Cookies.scala | 22 | ||||
-rw-r--r-- | cask/test/src/test/cask/FileUploads.scala | 16 | ||||
-rw-r--r-- | notes.txt | 32 |
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 |