summaryrefslogtreecommitdiff
path: root/ext/web/compression.rs
diff options
context:
space:
mode:
authorKayla Washburn <mckayla@hey.com>2022-06-14 10:10:28 -0600
committerGitHub <noreply@github.com>2022-06-14 10:10:28 -0600
commite1d488ab886ac19716e2b51c3ce1cebef163db8f (patch)
tree993e0756475bfc5c644420e1e53da5bc1a8306c2 /ext/web/compression.rs
parent443041c23e2e02ea59d69e1f2093c67ddfd818fd (diff)
feature(web): enable deflate-raw compression format (#14863)
Diffstat (limited to 'ext/web/compression.rs')
-rw-r--r--ext/web/compression.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/ext/web/compression.rs b/ext/web/compression.rs
index 9f5fcb813..f3610e2ea 100644
--- a/ext/web/compression.rs
+++ b/ext/web/compression.rs
@@ -6,6 +6,8 @@ use deno_core::OpState;
use deno_core::Resource;
use deno_core::ResourceId;
use deno_core::ZeroCopyBuf;
+use flate2::write::DeflateDecoder;
+use flate2::write::DeflateEncoder;
use flate2::write::GzDecoder;
use flate2::write::GzEncoder;
use flate2::write::ZlibDecoder;
@@ -19,10 +21,13 @@ use std::rc::Rc;
#[derive(Debug)]
struct CompressionResource(RefCell<Inner>);
+/// https://wicg.github.io/compression/#supported-formats
#[derive(Debug)]
enum Inner {
DeflateDecoder(ZlibDecoder<Vec<u8>>),
DeflateEncoder(ZlibEncoder<Vec<u8>>),
+ DeflateRawDecoder(DeflateDecoder<Vec<u8>>),
+ DeflateRawEncoder(DeflateEncoder<Vec<u8>>),
GzDecoder(GzDecoder<Vec<u8>>),
GzEncoder(GzEncoder<Vec<u8>>),
}
@@ -45,6 +50,10 @@ pub fn op_compression_new(
("deflate", false) => {
Inner::DeflateEncoder(ZlibEncoder::new(w, Compression::default()))
}
+ ("deflate-raw", true) => Inner::DeflateRawDecoder(DeflateDecoder::new(w)),
+ ("deflate-raw", false) => {
+ Inner::DeflateRawEncoder(DeflateEncoder::new(w, Compression::default()))
+ }
("gzip", true) => Inner::GzDecoder(GzDecoder::new(w)),
("gzip", false) => {
Inner::GzEncoder(GzEncoder::new(w, Compression::default()))
@@ -74,6 +83,16 @@ pub fn op_compression_write(
d.flush()?;
d.get_mut().drain(..)
}
+ Inner::DeflateRawDecoder(d) => {
+ d.write_all(&input)?;
+ d.flush()?;
+ d.get_mut().drain(..)
+ }
+ Inner::DeflateRawEncoder(d) => {
+ d.write_all(&input)?;
+ d.flush()?;
+ d.get_mut().drain(..)
+ }
Inner::GzDecoder(d) => {
d.write_all(&input)?;
d.flush()?;
@@ -100,6 +119,8 @@ pub fn op_compression_finish(
let out: Vec<u8> = match inner {
Inner::DeflateDecoder(d) => d.finish()?,
Inner::DeflateEncoder(d) => d.finish()?,
+ Inner::DeflateRawDecoder(d) => d.finish()?,
+ Inner::DeflateRawEncoder(d) => d.finish()?,
Inner::GzDecoder(d) => d.finish()?,
Inner::GzEncoder(d) => d.finish()?,
};