diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-09 00:36:25 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2018-08-09 00:36:25 +0800 |
commit | fe17f0a465a49433867ea4917fd4938a7d2b6609 (patch) | |
tree | 04f04f15df5c33325d7da24fad8085587c465895 /cask/src/cask/decorators | |
parent | b1969928a179bfa833cab528d544a1f77cf24987 (diff) | |
download | cask-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.scala | 43 |
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 + } + } +} |