diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index 5a1e199b32..1150b4a642 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -123,6 +123,9 @@ public class GitBridgeServer { handlers.addHandler(new DefaultHandler()); api.setHandler(handlers); + + ProductionErrorHandler errorHandler = new ProductionErrorHandler(); + api.setErrorHandler(errorHandler); return api; } @@ -149,6 +152,8 @@ public class GitBridgeServer { ), "/*" ); + ProductionErrorHandler errorHandler = new ProductionErrorHandler(); + servletContextHandler.setErrorHandler(errorHandler); return servletContextHandler; } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java new file mode 100644 index 0000000000..d4b19e26fe --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java @@ -0,0 +1,21 @@ +package uk.ac.ic.wlgitbridge.server; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.server.handler.ErrorHandler; +import java.io.IOException; + +public class ProductionErrorHandler extends ErrorHandler { + @Override + public void handle( + String target, + org.eclipse.jetty.server.Request baseRequest, + HttpServletRequest request, + HttpServletResponse response + ) throws IOException { + response.getWriter() + .append("{\"message\":\"HTTP error ") + .append(String.valueOf(response.getStatus())) + .append("\"}"); + } +} diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java index cc5a726cc6..20b1fb85ed 100644 --- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java +++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java @@ -693,6 +693,40 @@ public class WLGitBridgeIntegrationTest { wlgb.stop(); } + @Test + public void usesCustomErrorHandler( + ) throws IOException, ExecutionException, InterruptedException { + + int gitBridgePort = 33873; + int mockServerPort = 3873; + + MockSnapshotServer server = new MockSnapshotServer( + mockServerPort, getResource("/canServePushedFiles").toFile()); + server.start(); + server.setState(states.get("canServePushedFiles").get("state")); + + GitBridgeApp wlgb = new GitBridgeApp(new String[] { + makeConfigFile(gitBridgePort, mockServerPort) + }); + wlgb.run(); + + // With an invalid project and no key, we should get a 404, + // which is rendered by our custom error handler. + String url = "http://127.0.0.1:" + gitBridgePort + "/api/notavalidproject/main.tex"; + Response response = new AsyncHttpClient().prepareGet(url).execute().get(); + assertEquals(404, response.getStatusCode()); + assertEquals("{\"message\":\"HTTP error 404\"}", response.getResponseBody()); + + // With an unsupported URL outside the api, we should get a 500, + // which is rendered by our custom error handler. + url = "http://127.0.0.1:" + gitBridgePort + "/foo"; + response = new AsyncHttpClient().prepareGet(url).execute().get(); + assertEquals(500, response.getStatusCode()); + assertEquals("{\"message\":\"HTTP error 500\"}", response.getResponseBody()); + + wlgb.stop(); + } + private String makeConfigFile( int port, int apiPort