Skip to content

Commit d0264ef

Browse files
takeseemtsegismont
andcommitted
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 <[email protected]> --------- Signed-off-by: Thomas Segismont <[email protected]> Co-authored-by: Thomas Segismont <[email protected]>
1 parent 21f5abf commit d0264ef

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
@@ -144,6 +144,19 @@ boolean iterateNext() {
144144
currentRoute.handleFailure(this);
145145
return true;
146146
}
147+
148+
RouterImpl subRouter = (RouterImpl) currentRoute.getSubRouter();
149+
if (subRouter != null) {
150+
int statusCode = statusCode();
151+
if (statusCode == -1) {
152+
statusCode = failed ? 500 : matchFailure;
153+
}
154+
Handler<RoutingContext> errorHandler = subRouter.getErrorHandlerByStatusCode(statusCode);
155+
if (errorHandler != null) {
156+
errorHandler.handle(this);
157+
return true;
158+
}
159+
}
147160
} catch (Throwable t) {
148161
handleInHandlerRuntimeFailure(currentRoute.getRouter(), failed, t);
149162
return true;

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

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

1717
package io.vertx.ext.web;
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;
2223
import org.junit.Test;
2324

2425
import java.util.function.Consumer;
2526

27+
import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR;
28+
import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
29+
2630
/**
2731
* @author <a href="http://tfox.org">Tim Fox</a>
2832
*/
@@ -741,4 +745,41 @@ public void testHierarchicalWithParamsSimpleWithDummy() throws Exception {
741745

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

0 commit comments

Comments
 (0)