public static String getResponseTextAndLogRestErrorErrorMessage()

in rest-api/src/jetbrains/buildServer/server/rest/jersey/ExceptionMapperBase.java [89:158]


  public static String getResponseTextAndLogRestErrorErrorMessage(final int statusCode,
                                                                  @Nullable final Throwable e,
                                                                  @Nullable final String message,
                                                                  final boolean isInternalError,
                                                                  final Level level,
                                                                  @NotNull final HttpServletRequest request) {
    Response.Status status = null;
    try {
      status = Response.Status.fromStatusCode(statusCode);
    } catch (Error error) {
      LOG.warn("Critical error encountered while reporting an error", error);
    }
    StringBuffer responseText = new StringBuffer();
    if (statusCode >= 500){
      responseText.append("Error has occurred during request processing");
    } else {
      responseText.append("Responding with error");
    }
    responseText.append(", status code: ").append(Integer.toString(statusCode));
    if (status != null) responseText.append(" (").append(status.toString()).append(")");
    responseText.append(".");

    //provide user-friendly message on missing or wrong Content-Type header
    if (statusCode == 415) { //Response.Status.UNSUPPORTED_MEDIA_TYPE.getStatusCode()
      //todo: response with supported content-types instead
      responseText.append("\nMake sure you have supplied correct 'Content-Type' header.");
    } else if (statusCode == 406) { //Response.Status.NOT_ACCEPTABLE.getStatusCode()
      //todo: response with supported "accept" header values instead
      responseText.append("\nMake sure you have supplied correct 'Accept' header.");
    } else {
      responseText.append("\nDetails: ");
      responseText.append(getMessageWithCauses(e));
      if (message != null) responseText.append("\n").append(message);
    }
    String result = responseText.toString();
    final String singleLineMessage = StringUtil.replace(StringUtil.replace(result, ".\n", ". "), "\n", ". ");
    String logMessage;
    if (TeamCityProperties.getBooleanOrTrue(REST_INCLUDE_REQUEST_DETAILS_INTO_ERRORS)){
      logMessage = singleLineMessage + " Request: " + WebUtil.getRequestDump(request) + ".";
    }else{
      logMessage = singleLineMessage + " URL: " + WebUtil.getRequestUrl(request) + ".";
    }

    if (isInternalError && !isCommonExternalError(e)) {
      logMessage(LOG, level, logMessage, e);
    } else {
      if (statusCode <=0 || statusCode >= 500) {
        logMessage(LOG, level, logMessage);
      }
      LOG.debug(logMessage, e);
    }

    try {
      final String includeStacktrace = TeamCityProperties.getProperty(REST_INCLUDE_EXCEPTION_STACKTRACE_PROPERTY, "false");
      if (e != null && !"false".equals(includeStacktrace)) {
        if ( "true".equals(request.getParameter(INCLUDE_STACKTRACE_REQUST_PARAMETER)) ||
            (!StringUtil.isEmpty(includeStacktrace) &&
             ("true".equals(includeStacktrace) || "any".equals(includeStacktrace) || String.valueOf(statusCode).startsWith(includeStacktrace)))) {
          StringWriter sw = new StringWriter();
          sw.write("\n\n");
          e.printStackTrace(new PrintWriter(sw));
          sw.write("\nThe stacktrace is included as '" + REST_INCLUDE_EXCEPTION_STACKTRACE_PROPERTY + "' internal property or " +
                   "'" + INCLUDE_STACKTRACE_REQUST_PARAMETER + "' request parameter is set.");
          result += sw.toString();
        }
      }
    } catch (Exception ignore) {
    }
    return result;
  }