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

io.honeybadger.reporter.dto.PlayHttpRequestFactory Maven / Gradle / Ivy

There is a newer version: 2.1.2
Show newest version
package io.honeybadger.reporter.dto;

import io.honeybadger.reporter.config.ConfigContext;
import org.apache.http.HttpHeaders;
import play.mvc.Http;
import play.mvc.Security;

import java.util.Iterator;
import java.util.Optional;

/**
 * Factory class that creates a {@link Request} based on a
 * {@link play.mvc.Http.Request}.
 *
 * @author Elijah Zupancic
 * @since 1.0.9
 */
public final class PlayHttpRequestFactory {
    private PlayHttpRequestFactory() { }

    public static Request create(final ConfigContext config,
                                 final Http.Request httpRequest) {
        Context context = createContext(httpRequest);
        String url = getFullURL(httpRequest);
        Params params = createParams(config, httpRequest);
        Session session = createSession(httpRequest);
        CgiData cgiData = createCgiData(httpRequest);

        return new Request(context, url, params, session, cgiData);
    }

    protected static Context createContext(final Http.Request httpRequest) {
        final Context context = new Context();
        final Optional username = httpRequest.attrs().getOptional(Security.USERNAME);

        username.ifPresent(context::setUsername);

        return context;
    }

    protected static String getFullURL(final Http.Request httpRequest) {
        return httpRequest.uri();
    }

    protected static Params createParams(final ConfigContext config,
                                         final Http.Request httpRequest) {
        Http.RequestBody body = httpRequest.body();

        if (body == null) return new Params(config.getExcludedParams());

        return Params.parseParamsFromMap(config.getExcludedParams(),
                                  body.asFormUrlEncoded());
    }

    protected static Session createSession(final Http.Request httpRequest) {
        final Session session = new Session();

        // We don't support Play sessions or flash scopes yet
        // Please write me if you need me.

        return session;
    }

    @SuppressWarnings("StringSplitter")
    protected static CgiData createCgiData(final Http.Request httpRequest) {
        final CgiData cgiData = new CgiData()
                .setRequestMethod(httpRequest.method())
                .setContentLength(getHeaderValue(httpRequest, HttpHeaders.CONTENT_LENGTH))
                .setHttpAccept(getHeaderValue(httpRequest, HttpHeaders.ACCEPT))
                .setHttpUserAgent(getHeaderValue(httpRequest, HttpHeaders.USER_AGENT))
                .setHttpAcceptCharset(getHeaderValue(httpRequest, HttpHeaders.ACCEPT_CHARSET))
                .setHttpAcceptEncoding(getHeaderValue(httpRequest, HttpHeaders.ACCEPT_ENCODING))
                .setHttpAcceptLanguage(getHeaderValue(httpRequest, HttpHeaders.ACCEPT_LANGUAGE))
                .setHttpCookie(parseCookies(httpRequest))
                .setContentLength(getHeaderValue(httpRequest, HttpHeaders.CONTENT_LENGTH))
                .setContentType(getHeaderValue(httpRequest, HttpHeaders.CONTENT_TYPE))
                .setRemoteAddr(httpRequest.remoteAddress())
                .setQueryString(httpRequest.queryString())
                .setPathInfo(httpRequest.path());

        if (httpRequest.host() != null && !httpRequest.host().isEmpty()) {
            final String[] hostParts = httpRequest.host().split(":");

            if (hostParts.length > 0) {
                cgiData.setServerName(hostParts[0]);
            }
            if (hostParts.length > 1) {
                cgiData.setServerPort(hostParts[1]);
            }
        }

        return cgiData;
    }

    static Object getHeaderValue(final Http.Request httpRequest, final String key) {
        final Http.Headers headers = httpRequest.getHeaders();
        return headers.get(key).orElse(null);
    }

    static String parseCookies(final Http.Request httpRequest) {
        Http.Cookies cookies = httpRequest.cookies();

        Iterator itr = cookies.iterator();

        if (cookies == null || !itr.hasNext()) return null;

        StringBuilder builder = new StringBuilder();

        while (itr.hasNext()) {
            Http.Cookie next = itr.next();
            String c = String.format("%s=%s", next.name(), next.value());

            builder.append(c.trim());

            if (itr.hasNext()) {
                builder.append("; ");
            }
        }

        return builder.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy