All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zalando.riptide.RequestCompressionPlugin Maven / Gradle / Ivy

package org.zalando.riptide;

import lombok.AllArgsConstructor;
import org.apiguardian.api.API;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.zalando.riptide.RequestArguments.Entity;

import javax.annotation.Nonnull;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

import static org.apiguardian.api.API.Status.EXPERIMENTAL;

@API(status = EXPERIMENTAL)
public final class RequestCompressionPlugin implements Plugin {

    @Override
    public RequestExecution aroundNetwork(final RequestExecution execution) {
        return arguments -> {
            final Entity entity = arguments.getEntity();

            if (entity.isEmpty()) {
                return execution.execute(arguments);
            }

            return execution.execute(
                    arguments.withEntity(new GzipEntity(entity)));
        };
    }

    @AllArgsConstructor
    private static class GzipEntity implements Entity {

        private final Entity entity;

        @Override
        public void writeTo(final HttpOutputMessage message) throws IOException {
            entity.writeTo(new GzipHttpOutputMessage(message));
            update(message.getHeaders());
        }

        private void update(final HttpHeaders headers) {
            headers.set("Content-Encoding", "gzip");
            headers.set("Transfer-Encoding", "chunked");
        }

    }

    @AllArgsConstructor
    private static final class GzipHttpOutputMessage implements HttpOutputMessage {

        private final HttpOutputMessage message;

        @Nonnull
        @Override
        public OutputStream getBody() throws IOException {
            return new GZIPOutputStream(message.getBody());
        }

        @Nonnull
        @Override
        public HttpHeaders getHeaders() {
            return message.getHeaders();
        }

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy