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;
}