diff --git a/telegrambots/pom.xml b/telegrambots/pom.xml index 0510e7cb..4835dbb3 100644 --- a/telegrambots/pom.xml +++ b/telegrambots/pom.xml @@ -114,6 +114,11 @@ commons-compress 1.21 + + org.brotli + dec + 0.1.2 + com.fasterxml.jackson.module jackson-module-jaxb-annotations diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/BrotliEncoder.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/BrotliEncoder.java new file mode 100644 index 00000000..f8858469 --- /dev/null +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/BrotliEncoder.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package org.telegram.telegrambots.updatesreceivers; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.function.Function; +import javax.annotation.Priority; +import javax.ws.rs.Priorities; +import javax.ws.rs.core.HttpHeaders; +import org.apache.commons.compress.compressors.CompressorException; +import org.apache.commons.compress.compressors.CompressorStreamFactory; +import org.apache.commons.compress.compressors.CompressorStreamProvider; +import org.glassfish.jersey.spi.ContentEncoder; + +/** + * BR encoding support. Interceptor that encodes the output or decodes the input if + * {@link HttpHeaders#CONTENT_ENCODING Content-Encoding header} value equals to {@code br} or {@code x-br}. + * + * @author Andrea Cavalli + */ +@Priority(Priorities.ENTITY_CODER) +public class BrotliEncoder extends ContentEncoder { + + private static final CompressorStreamFactory factory = new CompressorStreamFactory(); + + /** + * Initialize BrEncoder. + */ + public BrotliEncoder() { + super("br", "x-br"); + } + + @Override + public InputStream decode(String contentEncoding, InputStream encodedStream) + throws IOException { + try { + return factory.createCompressorInputStream(CompressorStreamFactory.BROTLI, encodedStream); + } catch (CompressorException e) { + throw new IOException(e); + } + } + + @Override + public OutputStream encode(String contentEncoding, OutputStream entityStream) + throws IOException { + try { + return factory.createCompressorOutputStream(CompressorStreamFactory.BROTLI, entityStream); + } catch (CompressorException e) { + throw new IOException(e); + } + } +} diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/CompressionEncoder.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/CompressionEncoder.java index 48dfe30e..8b7686ca 100644 --- a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/CompressionEncoder.java +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/CompressionEncoder.java @@ -27,25 +27,25 @@ import org.apache.commons.compress.compressors.CompressorStreamFactory; import org.glassfish.jersey.spi.ContentEncoder; /** - * BR encoding support. Interceptor that encodes the output or decodes the input if - * {@link HttpHeaders#CONTENT_ENCODING Content-Encoding header} value equals to {@code br} or {@code x-br}. + * Compression encoding support. Interceptor that encodes the output or decodes the input if + * {@link HttpHeaders#CONTENT_ENCODING Content-Encoding header} value equals to most compression formats. * - * @author Martin Matula + * @author Andrea Cavalli */ @Priority(Priorities.ENTITY_CODER) public class CompressionEncoder extends ContentEncoder { + + private static final CompressorStreamFactory factory = new CompressorStreamFactory(); + /** - * Initialize BrEncoder. + * Initialize Encoder. */ public CompressionEncoder() { - super("br", "x-br", "deflate", "deflate64", "gzip", "zstd", "lz4", "lzma"); + super("deflate", "deflate64", "gzip", "zstd", "lz4", "lzma"); } private String translateEncoding(String contentEncoding) throws IOException { switch (contentEncoding) { - case "br": - case "x-br": - return CompressorStreamFactory.BROTLI; case "deflate": return CompressorStreamFactory.DEFLATE; case "deflate64": @@ -68,7 +68,7 @@ public class CompressionEncoder extends ContentEncoder { throws IOException { try { String enc = translateEncoding(contentEncoding); - return new CompressorStreamFactory().createCompressorInputStream(enc, encodedStream); + return factory.createCompressorInputStream(enc, encodedStream); } catch (CompressorException e) { throw new IOException(e); } @@ -79,7 +79,7 @@ public class CompressionEncoder extends ContentEncoder { throws IOException { try { String enc = translateEncoding(contentEncoding); - return new CompressorStreamFactory().createCompressorOutputStream(enc, entityStream); + return factory.createCompressorOutputStream(enc, entityStream); } catch (CompressorException e) { throw new IOException(e); } diff --git a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultWebhook.java b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultWebhook.java index fff42ffc..eec91e57 100644 --- a/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultWebhook.java +++ b/telegrambots/src/main/java/org/telegram/telegrambots/updatesreceivers/DefaultWebhook.java @@ -50,6 +50,7 @@ public class DefaultWebhook implements Webhook { rc.register(JacksonFeature.class); rc.register(DefaultExceptionMapper.class); rc.register(CompressionEncoder.class); + rc.register(BrotliEncoder.class); final HttpServer grizzlyServer; if (keystoreServerFile != null && keystoreServerPwd != null) {