From 48b60ea02268b060f859101a41fee5394925237a Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 22 Jul 2018 01:53:26 +0800 Subject: File uploads and cookies now work --- cask/src/cask/Main.scala | 9 ++++++++- cask/src/cask/ParamReader.scala | 12 +++++++++++- cask/src/cask/Routes.scala | 5 ++++- cask/src/cask/Util.scala | 5 ++++- cask/test/src/test/cask/Cookies.scala | 22 ++++++++++++++++++++++ cask/test/src/test/cask/FileUploads.scala | 16 ++++++++++++++++ 6 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 cask/test/src/test/cask/Cookies.scala create mode 100644 cask/test/src/test/cask/FileUploads.scala (limited to 'cask') 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() +} + -- cgit v1.2.3