package io.dropwizard.jersey.gzip;

import javax.annotation.Priority;
import javax.ws.rs.Priorities;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

GZIP encoding support. Writer interceptor that encodes the output if Content-Encoding header value equals to gzip or x-gzip. If so configured, it will encode the output even if the gzip and x-gzip Content-Encoding header is missing, and insert a value of gzip for that header.
/** * GZIP encoding support. Writer interceptor that encodes the output if * {@link HttpHeaders#CONTENT_ENCODING Content-Encoding header} value equals * to {@code gzip} or {@code x-gzip}. * * If so configured, it will encode the output even if the {@code gzip} and {@code x-gzip} * {@link HttpHeaders#CONTENT_ENCODING Content-Encoding header} is missing, and insert a value * of {@code gzip} for that header. * */
@Provider @Priority(Priorities.ENTITY_CODER) public class ConfiguredGZipEncoder implements WriterInterceptor, ClientRequestFilter { private boolean forceEncoding = false; public ConfiguredGZipEncoder(boolean forceEncoding) { this.forceEncoding = forceEncoding; } @Override public void filter(ClientRequestContext context) throws IOException { if (context.hasEntity() && context.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING) == null && this.forceEncoding) { context.getHeaders().add(HttpHeaders.CONTENT_ENCODING, "gzip"); } } @Override public final void aroundWriteTo(WriterInterceptorContext context) throws IOException { final String contentEncoding = (String) context.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING); if ((contentEncoding != null) && (contentEncoding.equals("gzip") || contentEncoding.equals("x-gzip"))) { context.setOutputStream(new GZIPOutputStream(context.getOutputStream())); } context.proceed(); } }