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

com.yammer.dropwizard.jetty.QuietErrorHandler Maven / Gradle / Ivy

package com.yammer.dropwizard.jetty;

import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableSet;
import org.eclipse.jetty.http.HttpGenerator;
import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.http.HttpMethods;
import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.server.AbstractHttpConnection;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * An {@link ErrorHandler} subclass which returns concise, {@code text/plain} error messages.
 */
public class QuietErrorHandler extends ErrorHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(QuietErrorHandler.class);
    private static final int RESPONSE_BUFFER_SIZE = 4096;

    /*
     * Sadly, this class is basically untestable.
     */
    private static final ImmutableSet ALLOWED_METHODS = ImmutableSet.of(
            HttpMethods.GET, HttpMethods.HEAD, HttpMethods.POST, HttpMethods.PUT, HttpMethods.DELETE
    );

    @Override
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) throws IOException {
        final AbstractHttpConnection connection = AbstractHttpConnection.getCurrentConnection();
        if (connection != null) {
            connection.getRequest().setHandled(true);
            final Response jettyResponse = connection.getResponse();
            jettyResponse.setStatus(jettyResponse.getStatus());

            connection.getRequest().setHandled(true);
            final String method = request.getMethod();

            if (!ALLOWED_METHODS.contains(method)) {
                return;
            }

            response.setContentType(MimeTypes.TEXT_PLAIN_UTF_8);
            if (getCacheControl() != null) {
                response.setHeader(HttpHeaders.CACHE_CONTROL, getCacheControl());
            }

            final StringBuilder builder = new StringBuilder(RESPONSE_BUFFER_SIZE);
            builder.append(errorMessage(request, jettyResponse.getStatus()))
                   .append('\n')
                   .append('\n');
            final byte[] bytes = builder.toString().getBytes(Charsets.UTF_8);
            response.setContentLength(bytes.length);
            final ServletOutputStream output = response.getOutputStream();
            try {
                output.write(bytes);
            } finally {
                output.close();
            }
        }
    }

    private static String errorMessage(HttpServletRequest request, int status) {
        try {
            final ResourceBundle bundle = ResourceBundle.getBundle("HttpErrorMessages",
                                                                   request.getLocale());
            final String message = bundle.getString(Integer.toString(status));
            if (message != null) {
                final MessageFormat format = new MessageFormat(message, request.getLocale());
                return format.format(new Object[]{request.getMethod()});
            }
        } catch (MissingResourceException e) {
            LOGGER.error("Unable to load HttpErrorMessages.properties", e);
        }
        return "Your request could not be processed: " + HttpGenerator.getReasonBuffer(status);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy