@Override public int statusCode() { return decoratedContext.statusCode(); }
@Override public int statusCode() { return inner.statusCode(); }
private void returnError(RoutingContext routingContext) { JsonObject result = new JsonObject(); int errorCode = routingContext.statusCode() > 0 ? routingContext.statusCode() : 500; // 不懂 Vert.x 为什么 EventBus 和 Web 是两套异常系统 if (routingContext.failure() instanceof ReplyException) { errorCode = ((ReplyException) routingContext.failure()).failureCode(); } result.put("error-code", errorCode); if (routingContext.failure() != null) { result.put("reason", routingContext.failure().getMessage()); } setCommonHeader(routingContext.response() .setStatusCode(errorCode) .putHeader("content-type", "application/json; charset=utf-8")) .end(result.encodePrettily()); }
/** * Try to determine response by status code, and send response. */ private void sendFailureRespDeterminedByStatus(RoutingContext context) { Family statusFamily = Family.familyOf(context.statusCode()); if (Family.CLIENT_ERROR.equals(statusFamily) || Family.SERVER_ERROR.equals(statusFamily) || Family.OTHER .equals(statusFamily)) { context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(context.statusCode()).end(); } else { // it seems the status code is not set properly context.response().putHeader(HttpHeaders.CONTENT_TYPE, MediaType.WILDCARD) .setStatusCode(Status.INTERNAL_SERVER_ERROR.getStatusCode()) .setStatusMessage(Status.INTERNAL_SERVER_ERROR.getReasonPhrase()) .end(wrapResponseBody(Status.INTERNAL_SERVER_ERROR.getReasonPhrase())); } context.response().close(); }
@Override public void handle(RoutingContext context) { HttpServerResponse response = context.response(); Throwable failure = context.failure(); int errorCode = context.statusCode(); String errorMessage = null; if (errorCode != -1) { context.response().setStatusCode(errorCode); errorMessage = context.response().getStatusMessage(); } else { errorCode = 500; if (displayExceptionDetails) { errorMessage = failure.getMessage(); } if (errorMessage == null) { errorMessage = "Internal Server Error"; } // no new lines are allowed in the status message response.setStatusMessage(errorMessage.replaceAll("\\r|\\n", " ")); } answerWithError(context, errorCode, errorMessage); }
@Test public void testBlockingHandlerFailure() throws Exception { List<Thread> threads = new ArrayList<>(); List<Context> contexts = new ArrayList<>(); router.route().handler(rc -> { threads.add(Thread.currentThread()); contexts.add(rc.vertx().getOrCreateContext()); rc.response().setChunked(true); rc.next(); }); router.route().blockingHandler(rc -> { assertTrue(!threads.get(0).equals(Thread.currentThread())); assertTrue(contexts.get(0).equals(rc.vertx().getOrCreateContext())); assertTrue(rc.currentRoute()!=null); rc.fail(501); }); router.route().failureHandler(rc -> { assertTrue(threads.get(0).equals(Thread.currentThread())); assertTrue(contexts.get(0).equals(rc.vertx().getOrCreateContext())); assertTrue(rc.currentRoute()!=null); rc.response().setStatusCode(rc.statusCode()).end(); }); testRequest(HttpMethod.GET, "/", 501, "Not Implemented"); }
@Test public void testFailCalled1() throws Exception { Router subRouter = Router.router(vertx); router.mountSubRouter("/subpath", subRouter); subRouter.route("/foo/*").handler(rc -> rc.fail(557)); router.route("/subpath/*").failureHandler(rc -> { assertEquals(557, rc.statusCode()); assertNull(rc.failure()); rc.response().setStatusCode(rc.statusCode()).setStatusMessage("Chipmunks").end(); }); testRequest(HttpMethod.GET, "/subpath/foo/bar", 557, "Chipmunks"); }
@Test public void testFailCalled2() throws Exception { Router subRouter = Router.router(vertx); router.mountSubRouter("/subpath", subRouter); subRouter.route("/foo/*").handler(rc -> rc.fail(557)); router.route("/subpath/*").failureHandler(rc -> { assertEquals(557, rc.statusCode()); assertNull(rc.failure()); rc.response().setStatusCode(rc.statusCode()).setStatusMessage("Chipmunks").end(); }); testRequest(HttpMethod.GET, "/subpath/foo/bar", 557, "Chipmunks"); }
@Test public void tesHandledRuntimeException2() throws Exception { Router subRouter = Router.router(vertx); router.mountSubRouter("/subpath", subRouter); subRouter.route("/foo/*").handler(rc -> { throw new RuntimeException("Balderdash!"); }); subRouter.route("/foo/*").failureHandler(rc -> { assertEquals(-1, rc.statusCode()); assertEquals("Balderdash!", rc.failure().getMessage()); rc.response().setStatusCode(555).setStatusMessage("Badgers").end(); }); testRequest(HttpMethod.GET, "/subpath/foo/bar", 555, "Badgers"); }
@Test public void testFailureWithThrowable() throws Exception { String path = "/blah"; Throwable failure = new Throwable(); router.route(path).handler(rc -> rc.fail(failure)).failureHandler(frc -> { assertEquals(-1, frc.statusCode()); assertSame(failure, frc.failure()); frc.response().setStatusCode(500).setStatusMessage("Internal Server Error").end(); }); testRequest(HttpMethod.GET, path, 500, "Internal Server Error"); }
@Test public void tesHandledRuntimeException1() throws Exception { Router subRouter = Router.router(vertx); router.mountSubRouter("/subpath", subRouter); subRouter.route("/foo/*").handler(rc -> { throw new RuntimeException("Balderdash!"); }); router.route("/subpath/*").failureHandler(rc -> { assertEquals(-1, rc.statusCode()); assertEquals("Balderdash!", rc.failure().getMessage()); rc.response().setStatusCode(555).setStatusMessage("Badgers").end(); }); testRequest(HttpMethod.GET, "/subpath/foo/bar", 555, "Badgers"); }
@Test public void testFailureHandler1CallFail() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(400)).failureHandler(frc -> { assertEquals(400, frc.statusCode()); frc.response().setStatusCode(400).setStatusMessage("oh dear").end(); }); testRequest(HttpMethod.GET, path, 400, "oh dear"); }
@Test public void testFailureHandler2CallFail() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(400)); router.route("/bl*").failureHandler(frc -> { assertEquals(400, frc.statusCode()); frc.response().setStatusCode(400).setStatusMessage("oh dear").end(); }); testRequest(HttpMethod.GET, path, 400, "oh dear"); }
@Test public void testFailureWithNullThrowable() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(null)).failureHandler(frc -> { assertEquals(-1, frc.statusCode()); assertTrue(frc.failure() instanceof NullPointerException); frc.response().setStatusCode(500).setStatusMessage("Internal Server Error").end(); }); testRequest(HttpMethod.GET, path, 500, "Internal Server Error"); }
@Test public void testRerouteFailure() throws Exception { router.get("/error/400").handler(ctx -> ctx.response() .setStatusCode(400) .end("/error/400")); router.get("/me").handler(ctx -> ctx.fail(400)); router.get().failureHandler(ctx -> { if (ctx.statusCode() == 400) { ctx.reroute("/error/400"); } else { ctx.next(); } }); testRequest(HttpMethod.GET, "/me", 400, "Bad Request", "/error/400"); }
@Test public void testFailureWithThrowable() throws Exception { String path = "/blah"; Throwable failure = new Throwable(); router.route(path).handler(rc -> rc.fail(failure)).failureHandler(frc -> { assertEquals(-1, frc.statusCode()); assertSame(failure, frc.failure()); frc.response().setStatusCode(500).setStatusMessage("Internal Server Error").end(); }); testRequest(HttpMethod.GET, path, 500, "Internal Server Error"); }
@Test public void testFailCalled2() throws Exception { Router subRouter = Router.router(vertx); router.mountSubRouter("/subpath", subRouter); subRouter.route("/foo/*").handler(rc -> rc.fail(557)); router.route("/subpath/*").failureHandler(rc -> { assertEquals(557, rc.statusCode()); assertNull(rc.failure()); rc.response().setStatusCode(rc.statusCode()).setStatusMessage("Chipmunks").end(); }); testRequest(HttpMethod.GET, "/subpath/foo/bar", 557, "Chipmunks"); }
@Test public void testFailureHandler1CallFail() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(400)).failureHandler(frc -> { assertEquals(400, frc.statusCode()); frc.response().setStatusCode(400).setStatusMessage("oh dear").end(); }); testRequest(HttpMethod.GET, path, 400, "oh dear"); }
@Test public void testFailureHandler2CallFail() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(400)); router.route("/bl*").failureHandler(frc -> { assertEquals(400, frc.statusCode()); frc.response().setStatusCode(400).setStatusMessage("oh dear").end(); }); testRequest(HttpMethod.GET, path, 400, "oh dear"); }
@Test public void testFailureWithNullThrowable() throws Exception { String path = "/blah"; router.route(path).handler(rc -> rc.fail(null)).failureHandler(frc -> { assertEquals(-1, frc.statusCode()); assertTrue(frc.failure() instanceof NullPointerException); frc.response().setStatusCode(500).setStatusMessage("Internal Server Error").end(); }); testRequest(HttpMethod.GET, path, 500, "Internal Server Error"); }