Package com.jetdrone.vertx.yoke.middleware

Source Code of com.jetdrone.vertx.yoke.middleware.Compress

/**
* Copyright 2011-2014 the original author or authors.
*/
package com.jetdrone.vertx.yoke.middleware;

import com.jetdrone.vertx.yoke.Middleware;
import com.jetdrone.vertx.yoke.middleware.filters.DeflateWriterFilter;
import com.jetdrone.vertx.yoke.middleware.filters.GZipWriterFilter;
import org.jetbrains.annotations.NotNull;
import org.vertx.java.core.Handler;

import java.io.IOException;
import java.util.regex.Pattern;

/**
* # Compress
*
* Middleware to compress responses and set the appropriate response headers.
* Not all responses are compressed, the middleware first inspects if the
* request accepts compression and tries to select the best matched algorithm.
*
* You can specify which content types are compressable and by default json/text/javascript
* are enabled.
*/
public class Compress implements Middleware {

    /**
     * Regular expression to identify resources that are subject to compression
     */
    private final Pattern filter;

    /**
     * Creates a new Compression Middleware given a regular expression of allowed mime types
     *
     * @param filter Regular expression to specify which mime types are allowed to be compressed
     */
    public Compress(@NotNull final Pattern filter) {
        this.filter = filter;
    }

    /**
     * Creates a new Compression Middleware using the default allowed mime types
     */
    public Compress() {
        this(Pattern.compile("json|text|javascript"));
    }

    @Override
    public void handle(@NotNull final YokeRequest request, @NotNull final Handler<Object> next) {
        final String method = request.method();
        final YokeResponse response = request.response();

        // vary
        response.putHeader("vary", "accept-encoding");

        // head requests are not compressed
        if ("HEAD".equals(method)) {
            next.handle(null);
            return;
        }

        final String accept = request.getHeader("accept-encoding");

        // if no accept then there is no need to filter
        if (accept == null) {
            next.handle(null);
            return;
        }

        try {
            // default to gzip
            if ("*".equals(accept.trim())) {
                response.setFilter(new GZipWriterFilter(filter));
            } else {
                if (accept.contains("gzip")) {
                    response.setFilter(new GZipWriterFilter(filter));
                } else if (accept.contains("deflate")) {
                    response.setFilter(new DeflateWriterFilter(filter));
                }
            }
            next.handle(null);
        } catch (IOException ioe) {
            next.handle(ioe);
        }
    }
}
TOP

Related Classes of com.jetdrone.vertx.yoke.middleware.Compress

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.