From f615ba0891e459c8848704173096a697b23225f4 Mon Sep 17 00:00:00 2001 From: Steve Hu Date: Mon, 30 Dec 2019 15:20:57 -0500 Subject: [PATCH] fixes #637 refactor the LightHttpHandler to ensure the auditInfo is called by both default methods (#638) --- .../networknt/handler/LightHttpHandler.java | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/handler/src/main/java/com/networknt/handler/LightHttpHandler.java b/handler/src/main/java/com/networknt/handler/LightHttpHandler.java index 6d43167b95..d05964b533 100644 --- a/handler/src/main/java/com/networknt/handler/LightHttpHandler.java +++ b/handler/src/main/java/com/networknt/handler/LightHttpHandler.java @@ -44,13 +44,13 @@ public interface LightHttpHandler extends HttpHandler { String ERROR_NOT_DEFINED = "ERR10042"; // Handler can save errors and stack traces for auditing. Default: false - static final String CONFIG_NAME = "handler"; - static final String AUDIT_ON_ERROR = "auditOnError"; - static final String AUDIT_STACK_TRACE = "auditStackTrace"; + String CONFIG_NAME = "handler"; + String AUDIT_ON_ERROR = "auditOnError"; + String AUDIT_STACK_TRACE = "auditStackTrace"; - public static HandlerConfig config = (HandlerConfig) Config.getInstance().getJsonObjectConfig(CONFIG_NAME, HandlerConfig.class); - static boolean auditOnError = config != null ? config.getAuditOnError() : false; - static boolean auditStackTrace = config != null ? config.getAuditStackTrace() : false; + HandlerConfig config = (HandlerConfig) Config.getInstance().getJsonObjectConfig(CONFIG_NAME, HandlerConfig.class); + boolean auditOnError = config != null ? config.getAuditOnError() : false; + boolean auditStackTrace = config != null ? config.getAuditStackTrace() : false; /** * This method is used to construct a standard error status in JSON format from an error code. @@ -65,13 +65,23 @@ default void setExchangeStatus(HttpServerExchange exchange, String code, final O // There is no entry in status.yml for this particular error code. status = new Status(ERROR_NOT_DEFINED, code); } + setExchangeStatus(exchange, status); + } + + /** + * There are situations that the downstream service returns an error status response and we just + * want to bubble up to the caller and eventually to the original caller. + * + * @param exchange HttpServerExchange + * @param status error status + */ + default void setExchangeStatus(HttpServerExchange exchange, Status status) { exchange.setStatusCode(status.getStatusCode()); exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json"); status.setDescription(status.getDescription().replaceAll("\\\\", "\\\\\\\\")); exchange.getResponseSender().send(status.toString()); StackTraceElement[] elements = Thread.currentThread().getStackTrace(); logger.error(status.toString() + " at " + elements[2].getClassName() + "." + elements[2].getMethodName() + "(" + elements[2].getFileName() + ":" + elements[2].getLineNumber() + ")"); - // In normal case, the auditInfo shouldn't be null as it is created by OpenApiHandler with // endpoint and openapiOperation available. This handler will enrich the auditInfo. @SuppressWarnings("unchecked") @@ -79,29 +89,13 @@ default void setExchangeStatus(HttpServerExchange exchange, String code, final O if(auditInfo == null) { auditInfo = new HashMap<>(); exchange.putAttachment(AttachmentConstants.AUDIT_INFO, auditInfo); - } + } // save info for auditing purposes in case of an error if(auditOnError) - auditInfo.put(Constants.STATUS, status); + auditInfo.put(Constants.STATUS, status); if(auditStackTrace) { - auditInfo.put(Constants.STACK_TRACE, Arrays.toString(elements)); - } - } - - /** - * There are situations that the downstream service returns an error status response and we just - * want to bubble up to the caller and eventually to the original caller. - * - * @param exchange HttpServerExchange - * @param status error status - */ - default void setExchangeStatus(HttpServerExchange exchange, Status status) { - exchange.setStatusCode(status.getStatusCode()); - exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json"); - status.setDescription(status.getDescription().replaceAll("\\\\", "\\\\\\\\")); - exchange.getResponseSender().send(status.toString()); - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - logger.error(status.toString() + " at " + elements[2].getClassName() + "." + elements[2].getMethodName() + "(" + elements[2].getFileName() + ":" + elements[2].getLineNumber() + ")"); + auditInfo.put(Constants.STACK_TRACE, Arrays.toString(elements)); + } } }