summaryrefslogtreecommitdiff
path: root/cask/src/cask/decorators
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-08-09 00:36:25 +0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-08-09 00:36:25 +0800
commitfe17f0a465a49433867ea4917fd4938a7d2b6609 (patch)
tree04f04f15df5c33325d7da24fad8085587c465895 /cask/src/cask/decorators
parentb1969928a179bfa833cab528d544a1f77cf24987 (diff)
downloadcask-fe17f0a465a49433867ea4917fd4938a7d2b6609.tar.gz
cask-fe17f0a465a49433867ea4917fd4938a7d2b6609.tar.bz2
cask-fe17f0a465a49433867ea4917fd4938a7d2b6609.zip
Add `@cask.decorators.compress` utility
Allow for decorators to be applied across `cask.Routes` or `cask.Main`
Diffstat (limited to 'cask/src/cask/decorators')
-rw-r--r--cask/src/cask/decorators/compress.scala43
1 files changed, 43 insertions, 0 deletions
diff --git a/cask/src/cask/decorators/compress.scala b/cask/src/cask/decorators/compress.scala
new file mode 100644
index 0000000..fc67dd4
--- /dev/null
+++ b/cask/src/cask/decorators/compress.scala
@@ -0,0 +1,43 @@
+package cask.decorators
+import java.io.{ByteArrayOutputStream, OutputStream}
+import java.util.zip.{DeflaterOutputStream, GZIPOutputStream}
+
+import cask.internal.Router
+import cask.model.{ParamContext, Response}
+
+import collection.JavaConverters._
+class compress extends cask.Decorator{
+ def wrapFunction(ctx: ParamContext, delegate: Delegate) = {
+ val acceptEncodings = ctx.exchange.getRequestHeaders.get("Accept-Encoding").asScala.flatMap(_.split(", "))
+ delegate(Map()) match{
+ case Router.Result.Success(v) =>
+ val (newData, newHeaders) = if (acceptEncodings.exists(_.toLowerCase == "gzip")) {
+ new Response.Data {
+ def write(out: OutputStream): Unit = {
+ val wrap = new GZIPOutputStream(out)
+ v.data.write(wrap)
+ wrap.flush()
+ wrap.close()
+ }
+ } -> Seq("Content-Encoding" -> "gzip")
+ }else if (acceptEncodings.exists(_.toLowerCase == "deflate")){
+ new Response.Data {
+ def write(out: OutputStream): Unit = {
+ val wrap = new DeflaterOutputStream(out)
+ v.data.write(wrap)
+ wrap.flush()
+ }
+ } -> Seq("Content-Encoding" -> "deflate")
+ }else v.data -> Nil
+ Router.Result.Success(
+ Response(
+ newData,
+ v.statusCode,
+ v.headers ++ newHeaders,
+ v.cookies
+ )
+ )
+ case e: Router.Result.Error => e
+ }
+ }
+}