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

org.beangle.sas.engine.tomcat.SwallowErrorValve Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2005, The Beangle Software.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 */

package org.beangle.sas.engine.tomcat;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.Constants;
import org.apache.catalina.valves.ErrorReportValve;
import org.apache.coyote.ActionCode;
import org.apache.tomcat.util.ExceptionUtils;
import org.apache.tomcat.util.http.ServerCookie;
import org.apache.tomcat.util.http.ServerCookies;
import org.apache.tomcat.util.res.StringManager;
import org.apache.tomcat.util.security.Escape;

import java.io.Writer;
import java.util.Collections;
import java.util.Locale;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Simplify error report
 *
 * @author chaostone
 */
public class SwallowErrorValve extends ErrorReportValve {

  @Override
  protected void report(Request request, Response response, Throwable throwable) {
    int statusCode = response.getStatus();
    if (statusCode < 400 || response.getContentWritten() > 0 || !response.setErrorReported()) {
      return;
    }

    AtomicBoolean result = new AtomicBoolean(false);
    response.getCoyoteResponse().action(ActionCode.IS_IO_ALLOWED, result);
    if (!result.get()) {
      return;
    }

    if (isDevModeEnabled(request)) {
      reportTrace(request, response, throwable);
    } else {
      StringBuilder sb = new StringBuilder();
      sb.append("HTTP Status ").append(statusCode);
      if (null != throwable) sb.append("  Error:").append(throwable.getMessage());
      try {
        Writer writer = response.getReporter();
        if (writer != null) {
          writer.write(sb.toString());
          response.finishResponse();
        }
      } catch (Exception e) {
      }
    }
  }

  private void reportTrace(Request request, Response response, Throwable throwable) {
    int statusCode = response.getStatus();
    String message = Escape.htmlElementContent(response.getMessage());
    if (message == null) {
      if (throwable != null) {
        String exceptionMessage = throwable.getMessage();
        if (exceptionMessage != null && exceptionMessage.length() > 0) {
          message = Escape.htmlElementContent((new Scanner(exceptionMessage)).nextLine());
        }
      }
      if (message == null) {
        message = "";
      }
    }

    String reason = null;
    String description = null;
    StringManager smClient = StringManager.getManager(Constants.Package,
      Collections.enumeration(Collections.singletonList(Locale.ENGLISH)));
    response.setLocale(Locale.ENGLISH);
    try {
      reason = smClient.getString("http." + statusCode + ".reason");
      description = smClient.getString("http." + statusCode + ".desc");
    } catch (Throwable t) {
      ExceptionUtils.handleThrowable(t);
    }
    if (reason == null || description == null) {
      if (message.isEmpty()) {
        return;
      } else {
        reason = smClient.getString("errorReportValve.unknownReason");
        description = smClient.getString("errorReportValve.noDescription");
      }
    }

    StringBuilder sb = new StringBuilder();
    sb.append("

"); sb.append(smClient.getString("errorReportValve.statusHeader", String.valueOf(statusCode), reason)) .append("

"); if (isShowReport()) { sb.append("
"); if (!message.isEmpty()) { sb.append("

"); sb.append(smClient.getString("errorReportValve.message")); sb.append(" "); sb.append(message).append("

"); } sb.append("

"); sb.append(smClient.getString("errorReportValve.description")); sb.append(" "); sb.append(description); sb.append("

"); if (throwable != null) { String stackTrace = getPartialServletStackTrace(throwable); sb.append("

"); sb.append(smClient.getString("errorReportValve.exception")); sb.append("

");
        sb.append(Escape.htmlElementContent(stackTrace));
        sb.append("
"); int loops = 0; Throwable rootCause = throwable.getCause(); while (rootCause != null && (loops < 10)) { stackTrace = getPartialServletStackTrace(rootCause); sb.append("

"); sb.append(smClient.getString("errorReportValve.rootCause")); sb.append("

");
          sb.append(Escape.htmlElementContent(stackTrace));
          sb.append("
"); rootCause = rootCause.getCause(); loops++; } } sb.append("
"); } if (isShowServerInfo()) { sb.append("

").append("Beangle Sas").append("

"); } try { Writer writer = response.getReporter(); if (writer != null) { writer.write(sb.toString()); response.finishResponse(); } } catch (Exception e) { } } private static boolean isDevModeEnabled(Request request) { ServerCookies cookies = request.getServerCookies(); for (int i = 0; i < cookies.getCookieCount(); i++) { ServerCookie sc = cookies.getCookie(i); if (sc.getName().equals("devMode")) { return true; } } return false; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy