From c006089b05f4461783ee340b9d39f1557b27728d Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Thu, 23 Jan 2020 19:04:31 -0500 Subject: [PATCH] add http encoding utility --- pom.xml | 13 +++++ .../util/http/HttpContentEncodingType.java | 58 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 src/main/java/org/cobbzilla/util/http/HttpContentEncodingType.java diff --git a/pom.xml b/pom.xml index 8264ee3..81e0f86 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,14 @@ cobbzilla-utils is available under the Apache License, version 2: http://www.apa 1.0.0-SNAPSHOT jar + + + bintray-nitram509-jbrotli + bintray + http://dl.bintray.com/nitram509/jbrotli + + + The Apache Software License, Version 2.0 @@ -163,6 +171,11 @@ cobbzilla-utils is available under the Apache License, version 2: http://www.apa commons-compress ${commons-compress.version} + + org.meteogroup.jbrotli + jbrotli + 0.5.0 + org.apache.commons diff --git a/src/main/java/org/cobbzilla/util/http/HttpContentEncodingType.java b/src/main/java/org/cobbzilla/util/http/HttpContentEncodingType.java new file mode 100644 index 0000000..897eeef --- /dev/null +++ b/src/main/java/org/cobbzilla/util/http/HttpContentEncodingType.java @@ -0,0 +1,58 @@ +package org.cobbzilla.util.http; + +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.AllArgsConstructor; +import org.cobbzilla.util.io.FilterInputStreamViaOutputStream; +import org.meteogroup.jbrotli.io.BrotliInputStream; +import org.meteogroup.jbrotli.io.BrotliOutputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.*; + +@AllArgsConstructor +public enum HttpContentEncodingType { + + gzip (GZIPInputStream::new, GZIPOutputStream::new, GZIPOutputStream.class), + + deflate (in -> new InflaterInputStream(in, new Inflater(true)), + out -> new DeflaterOutputStream(out, new Deflater(7, true)), + in -> new FilterInputStreamViaOutputStream(in, out -> new InflaterOutputStream(out, new Inflater(true)))), + + br (BrotliInputStream::new, BrotliOutputStream::new, BrotliOutputStream.class), + bro (BrotliInputStream::new, BrotliOutputStream::new, BrotliOutputStream.class); + + private final HttpContentEncodingInputWrapper inputWrapper; + private final HttpContentEncodingOutputWrapper outputWrapper; + private final HttpContentEncodingInputAsOutputWrapper inputAsOutputWrapper; + + HttpContentEncodingType (HttpContentEncodingInputWrapper inWrap, + HttpContentEncodingOutputWrapper outWrap, + Class inAsOutClass) { + this.inputWrapper = inWrap; + this.outputWrapper = outWrap; + this.inputAsOutputWrapper = in -> new FilterInputStreamViaOutputStream(in, inAsOutClass); + } + + @JsonCreator public static HttpContentEncodingType fromString (String v) { return valueOf(v.toLowerCase()); } + + public InputStream wrapInput(InputStream in) throws IOException { return inputWrapper.wrap(in); } + + public OutputStream wrapOutput(OutputStream out) throws IOException { return outputWrapper.wrap(out); } + + public FilterInputStreamViaOutputStream wrapInputAsOutput(InputStream in) throws IOException { return inputAsOutputWrapper.wrap(in); } + + public interface HttpContentEncodingInputWrapper { + InputStream wrap(InputStream in) throws IOException; + } + + public interface HttpContentEncodingOutputWrapper { + OutputStream wrap(OutputStream out) throws IOException; + } + + public interface HttpContentEncodingInputAsOutputWrapper { + FilterInputStreamViaOutputStream wrap(InputStream in) throws IOException; + } + +}