Skip to content

Commit ffe1332

Browse files
takeseemtsegismont
andauthored
Subrouter failure handler is ignored (vert-x3#2779)
* fix vert-x3#2772 Subrouter failure handler is ignored * fix(test): do junit assert in vert.x and add timeout * Revert changes in WebTestBase We can use existing testRequest methods Signed-off-by: Thomas Segismont <tsegismont@gmail.com> --------- Signed-off-by: Thomas Segismont <tsegismont@gmail.com> Co-authored-by: Thomas Segismont <tsegismont@gmail.com>
1 parent f443f43 commit ffe1332

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

vertx-web/src/main/java/io/vertx/ext/web/impl/RoutingContextImplBase.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ boolean iterateNext() {
163163
currentRoute.handleFailure(this);
164164
return true;
165165
}
166+
167+
RouterImpl subRouter = (RouterImpl) currentRoute.getSubRouter();
168+
if (subRouter != null) {
169+
int statusCode = statusCode();
170+
if (statusCode == -1) {
171+
statusCode = failed ? 500 : matchFailure;
172+
}
173+
Handler<RoutingContext> errorHandler = subRouter.getErrorHandlerByStatusCode(statusCode);
174+
if (errorHandler != null) {
175+
errorHandler.handle(this);
176+
return true;
177+
}
178+
}
166179
} catch (Throwable t) {
167180
handleInHandlerRuntimeFailure(currentRoute.getRouter(), failed, t);
168181
return true;

vertx-web/src/test/java/io/vertx/ext/web/tests/SubRouterTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package io.vertx.ext.web.tests;
1818

19+
import io.netty.handler.codec.http.HttpResponseStatus;
1920
import io.vertx.core.Handler;
2021
import io.vertx.core.Vertx;
2122
import io.vertx.core.http.HttpMethod;
@@ -25,6 +26,9 @@
2526

2627
import java.util.function.Consumer;
2728

29+
import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR;
30+
import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
31+
2832
/**
2933
* @author <a href="http://tfox.org">Tim Fox</a>
3034
*/
@@ -743,4 +747,41 @@ public void testHierarchicalWithParamsSimpleWithDummy() throws Exception {
743747

744748
testRequest(HttpMethod.GET, "/rest/product/123/bar", 200, "OK");
745749
}
750+
751+
@Test
752+
public void testSetExceptionHandler() throws Exception {
753+
Router restRouter = Router.router(vertx);
754+
Router productRouter = Router.router(vertx);
755+
Router instanceRouter = Router.router(vertx);
756+
757+
router.route("/rest*").subRouter(restRouter);
758+
restRouter.route("/product*").subRouter(productRouter);
759+
productRouter.route("/:id*").subRouter(instanceRouter);
760+
instanceRouter.get("/:foo").handler(ctx -> {
761+
if ("ex".equals(ctx.pathParam("foo"))) {
762+
throw new RuntimeException("ouch!");
763+
}
764+
ctx.response().end();
765+
});
766+
767+
testRequest(HttpMethod.GET, "/rest/product/123/ex", 500, "Internal Server Error", "Internal Server Error");
768+
769+
assertRouterErrorHandlers("root", router, INTERNAL_SERVER_ERROR, "/rest/product/123/ex");
770+
assertRouterErrorHandlers("root", router, NOT_FOUND, "/rest/product/123/foo/404");
771+
772+
assertRouterErrorHandlers("rest", restRouter, INTERNAL_SERVER_ERROR, "/rest/product/123/ex");
773+
assertRouterErrorHandlers("rest", restRouter, NOT_FOUND, "/rest/product/123/foo/404");
774+
775+
assertRouterErrorHandlers("product", productRouter, INTERNAL_SERVER_ERROR, "/rest/product/123/ex");
776+
assertRouterErrorHandlers("product", productRouter, NOT_FOUND, "/rest/product/123/foo/404");
777+
778+
assertRouterErrorHandlers("instance", instanceRouter, INTERNAL_SERVER_ERROR, "/rest/product/123/ex");
779+
assertRouterErrorHandlers("instance", instanceRouter, NOT_FOUND, "/rest/product/123/foo/404");
780+
}
781+
782+
private void assertRouterErrorHandlers(String name, Router router, HttpResponseStatus status, String path) throws Exception {
783+
String handlerKey = name + "." + status.codeAsText() + ".errorHandler";
784+
router.errorHandler(status.code(), ctx -> ctx.response().setStatusCode(status.code()).end(handlerKey));
785+
testRequest(HttpMethod.GET, path, status.code(), status.reasonPhrase(), handlerKey);
786+
}
746787
}

0 commit comments

Comments
 (0)