From 315a3c33cfe6a2bd2d44d0732cc91f0a82ce229b Mon Sep 17 00:00:00 2001 From: catbref Date: Tue, 19 Mar 2019 10:09:01 +0000 Subject: [PATCH] Add API error handler to log unexpected errors/exceptions Fixed /admin/uptime to return text/plain instead of application/json as response is only a simple long. Ditto /admin/stop. --- .../java/org/qora/api/ApiErrorHandler.java | 36 +++++++++++++++++++ src/main/java/org/qora/api/ApiService.java | 14 +++++--- .../org/qora/api/resource/AdminResource.java | 4 +-- 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/qora/api/ApiErrorHandler.java diff --git a/src/main/java/org/qora/api/ApiErrorHandler.java b/src/main/java/org/qora/api/ApiErrorHandler.java new file mode 100644 index 00000000..de30ed83 --- /dev/null +++ b/src/main/java/org/qora/api/ApiErrorHandler.java @@ -0,0 +1,36 @@ +package org.qora.api; + +import java.io.IOException; + +import javax.servlet.RequestDispatcher; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.handler.ErrorHandler; + +public class ApiErrorHandler extends ErrorHandler { + + private static final Logger LOGGER = LogManager.getLogger(ApiErrorHandler.class); + + @Override + public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { + String requestURI = request.getRequestURI(); + + String queryString = request.getQueryString(); + if (queryString != null) + requestURI += "?" + queryString; + + Throwable th = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION); + if (th != null) { + LOGGER.error(String.format("Unexpected %s during request %s", th.getClass().getCanonicalName(), requestURI)); + } else { + LOGGER.error(String.format("Unexpected error during request %s", requestURI)); + } + + super.handle(target, baseRequest, request, response); + } + +} diff --git a/src/main/java/org/qora/api/ApiService.java b/src/main/java/org/qora/api/ApiService.java index aed8977e..afa5ed9c 100644 --- a/src/main/java/org/qora/api/ApiService.java +++ b/src/main/java/org/qora/api/ApiService.java @@ -6,6 +6,7 @@ import org.eclipse.jetty.rewrite.handler.RedirectPatternRule; import org.eclipse.jetty.rewrite.handler.RewriteHandler; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.handler.InetAccessHandler; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.FilterHolder; @@ -33,6 +34,10 @@ public class ApiService { // Create RPC server this.server = new Server(Settings.getInstance().getApiPort()); + // Error handler + ErrorHandler errorHandler = new ApiErrorHandler(); + this.server.setErrorHandler(errorHandler); + // IP address based access control InetAccessHandler accessHandler = new InetAccessHandler(); for (String pattern : Settings.getInstance().getApiWhitelist()) { @@ -49,10 +54,11 @@ public class ApiService { context.setContextPath("/"); rewriteHandler.setHandler(context); - FilterHolder filterHolder = new FilterHolder(CrossOriginFilter.class); - filterHolder.setInitParameter("allowedOrigins", "*"); - filterHolder.setInitParameter("allowedMethods", "GET, POST"); - context.addFilter(filterHolder, "/*", null); + // Cross-origin resource sharing + FilterHolder corsFilterHolder = new FilterHolder(CrossOriginFilter.class); + corsFilterHolder.setInitParameter("allowedOrigins", "*"); + corsFilterHolder.setInitParameter("allowedMethods", "GET, POST, DELETE"); + context.addFilter(corsFilterHolder, "/*", null); // API servlet ServletContainer container = new ServletContainer(config); diff --git a/src/main/java/org/qora/api/resource/AdminResource.java b/src/main/java/org/qora/api/resource/AdminResource.java index 17d49ad2..201840b4 100644 --- a/src/main/java/org/qora/api/resource/AdminResource.java +++ b/src/main/java/org/qora/api/resource/AdminResource.java @@ -59,7 +59,7 @@ public class AdminResource { responses = { @ApiResponse( description = "uptime in milliseconds", - content = @Content(schema = @Schema(type = "number")) + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number")) ) } ) @@ -75,7 +75,7 @@ public class AdminResource { responses = { @ApiResponse( description = "\"true\"", - content = @Content(schema = @Schema(type = "string")) + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string")) ) } )