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

org.glassfish.grizzly.http.server.util.HtmlHelper Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.grizzly.http.server.util;

import java.io.IOException;
import java.io.Writer;

import org.glassfish.grizzly.http.server.ErrorPageGenerator;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.glassfish.grizzly.http.util.HttpUtils;

/**
 * Utility class used to generate HTML pages.
 *
 * @author Jean-Francois Arcand
 */
public class HtmlHelper {

    private static final int MAX_STACK_ELEMENTS = 10;

    private final static String CSS = "div.header {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#003300;font-size:22px;-moz-border-radius-topleft: 10px;border-top-left-radius: 10px;-moz-border-radius-topright: 10px;border-top-right-radius: 10px;padding-left: 5px}"
            + "div.body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:#FFFFCC;font-size:16px;padding-top:10px;padding-bottom:10px;padding-left:10px}"
            + "div.footer {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#666633;font-size:14px;-moz-border-radius-bottomleft: 10px;border-bottom-left-radius: 10px;-moz-border-radius-bottomright: 10px;border-bottom-right-radius: 10px;padding-left: 5px}"
            + "BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;}" + "B {font-family:Tahoma,Arial,sans-serif;color:black;}"
            + "A {color : black;}" + "HR {color : #999966;}";

    /**
     * Generate and send an error page for the given HTTP response status. Unlike
     * {@link #setErrorAndSendErrorPage(org.glassfish.grizzly.http.server.Request, org.glassfish.grizzly.http.server.Response, org.glassfish.grizzly.http.server.ErrorPageGenerator, int, java.lang.String, java.lang.String, java.lang.Throwable)},
     * this method doesn't change the {@link Response} status code and reason phrase.
     *
     * @param request
     * @param response
     * @param generator
     * @param status
     * @param reasonPhrase
     * @param description
     * @param exception
     *
     * @throws IOException
     */
    public static void sendErrorPage(final Request request, final Response response, final ErrorPageGenerator generator, final int status,
            final String reasonPhrase, final String description, final Throwable exception) throws IOException {

        if (generator != null && !response.isCommitted() && response.getOutputBuffer().getBufferedDataSize() == 0) {
            final String errorPage = generator.generate(request, status, reasonPhrase, description, exception);

            final Writer writer = response.getWriter();

            if (errorPage != null) {
                if (!response.getResponse().isContentTypeSet()) {
                    response.setContentType("text/html");
                }

                writer.write(errorPage);
            }
            writer.close();
        }
    }

    /**
     * Generate and send an error page for the given HTTP response status. Unlike
     * {@link #setErrorAndSendErrorPage(org.glassfish.grizzly.http.server.Request, org.glassfish.grizzly.http.server.Response, org.glassfish.grizzly.http.server.ErrorPageGenerator, int, java.lang.String, java.lang.String, java.lang.Throwable)},
     * this method does change the {@link Response} status code and reason phrase.
     *
     * @param request
     * @param response
     * @param generator
     * @param status
     * @param reasonPhrase
     * @param description
     * @param exception
     *
     * @throws IOException
     */
    public static void setErrorAndSendErrorPage(final Request request, final Response response, final ErrorPageGenerator generator, final int status,
            final String reasonPhrase, final String description, final Throwable exception) throws IOException {

        response.setStatus(status, reasonPhrase);

        if (generator != null && !response.isCommitted() && response.getOutputBuffer().getBufferedDataSize() == 0) {
            final String errorPage = generator.generate(request, status, reasonPhrase, description, exception);

            final Writer writer = response.getWriter();

            if (errorPage != null) {
                if (!response.getResponse().isContentTypeSet()) {
                    response.setContentType("text/html");
                }

                writer.write(errorPage);
            }
            writer.close();
        }
    }

    public static void writeTraceMessage(final Request request, final Response response) throws IOException {
        response.setStatus(HttpStatus.OK_200);
        response.setContentType("message/http");
        final Writer writer = response.getWriter();
        writer.append(request.getMethod().toString()).append(' ').append(request.getRequest().getRequestURIRef().getOriginalRequestURIBC().toString())
                .append(' ').append(request.getProtocol().getProtocolString()).append("\r\n");

        for (String headerName : request.getHeaderNames()) {
            for (String headerValue : request.getHeaders(headerName)) {
                writer.append(headerName).append(": ").append(headerValue).append("\r\n");
            }
        }
    }

    /**
     *
     * @return A {@link String} containing the HTTP response.
     */
    public static String getErrorPage(String headerMessage, String message, String serverName) {
        return prepareBody(headerMessage, message, serverName);
    }

    public static String getExceptionErrorPage(String headerMessage, String message, String serverName, Throwable t) {
        return prepareExceptionBody(headerMessage, message, serverName, t);
    }

    /**
     * Prepare the HTTP body containing the error messages.
     */
    private static String prepareBody(String headerMessage, String message, String serverName) {
        final StringBuilder sb = new StringBuilder();

        sb.append("");
        sb.append(serverName);
        sb.append("");
        sb.append(" ");
        sb.append("");
        sb.append("
"); sb.append(headerMessage); sb.append("
"); sb.append("
"); sb.append(message != null ? message : "
"); sb.append("
"); sb.append("
").append(serverName).append("
"); sb.append(""); return sb.toString(); } @SuppressWarnings({ "ThrowableResultOfMethodCallIgnored" }) private static String prepareExceptionBody(String headerMessage, String message, String serverName, Throwable t) { if (t == null) { return prepareBody(headerMessage, message, serverName); } Throwable rootCause = getRootCause(t); StackTraceElement[] elements = t.getStackTrace(); StackTraceElement[] rootCauseElements = null; if (rootCause != null) { rootCauseElements = rootCause.getStackTrace(); } StringBuilder tBuilder = new StringBuilder(); formatStackElements(elements, tBuilder); StringBuilder rootBuilder = new StringBuilder(); if (rootCause != null) { formatStackElements(rootCauseElements, rootBuilder); } final String exMessage = t.getMessage() != null ? HttpUtils.filter(t.getMessage()) : HttpUtils.filter(t.toString()); StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(serverName); sb.append(""); sb.append(" "); sb.append(""); sb.append("
"); sb.append(headerMessage); sb.append("
"); sb.append("
"); sb.append("").append(exMessage).append(""); sb.append("
");
        sb.append(tBuilder.toString());
        sb.append("
"); if (rootCause != null) { sb.append("Root Cause: ").append(rootCause.toString()).append(""); sb.append("
");
            sb.append(rootBuilder.toString());
            sb.append("
"); } sb.append("Please see the log for more detail."); sb.append("
"); sb.append("
").append(serverName).append("
"); sb.append(""); return sb.toString(); } private static Throwable getRootCause(Throwable t) { Throwable rootCause = null; if (t.getCause() != null) { rootCause = t.getCause(); while (rootCause.getCause() != null) { rootCause = rootCause.getCause(); } } return rootCause; } private static void formatStackElements(StackTraceElement[] elements, StringBuilder builder) { final int maxLines = getMaxStackElementsToDisplay(elements); for (int i = 0; i < maxLines; i++) { builder.append(i + 1 > 9 ? " " : " ").append(i + 1).append(": ").append(elements[i].toString()).append('\n'); } boolean ellipse = elements.length > MAX_STACK_ELEMENTS; if (ellipse) { builder.append(" ... ").append(elements.length - MAX_STACK_ELEMENTS).append(" more"); } } private static int getMaxStackElementsToDisplay(StackTraceElement[] elements) { return elements.length > MAX_STACK_ELEMENTS ? MAX_STACK_ELEMENTS : elements.length; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy