Vert.x Web FailureHandler reroute to index.html

300 views
Skip to first unread message

Denis Ivanov

unread,
Feb 27, 2016, 12:03:21 PM2/27/16
to vert.x
Hi there!

I have a single page app on angularjs. It has a lot internal URL for routing inside the app. When I copy some nonexistent URL and GET it server should send me an index.html page. After that client sinde app parse URL and do some work.

On a server side I have StatisHandler:
// static handler
router
.route().handler(
   
StaticHandler
       
.create()
       
.setWebRoot("webroot")
       
.setCachingEnabled(true)
);
// and default page
router.get("/").handler(
    routingContext
-> {
        routingContext
.response()
           
.putHeader("content-type","text/html")
           
.putHeader("Cache-Control","max-age=864000") // 10 Days Caching
            .putHeader("accept-encoding","gzip, deflate")
           
.sendFile("index.html");
   
}
);

I'd like to send index.html in response without changing URL.

I tried this:
router.route("/*").handler(Hdl -> {
    System.out.println("rerouted");
    Hdl.reroute("/");
});

looks like recursive error and I have to stop this process manually:

java.lang.StackOverflowError
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.PrintWriter.<init>(PrintWriter.java:116)
        at java.io.PrintWriter.<init>(PrintWriter.java:100)
        at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:155)
        at java.util.logging.StreamHandler.publish(StreamHandler.java:211)
        at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:116)
        at java.util.logging.Logger.log(Logger.java:738)
        at io.vertx.core.logging.JULLogDelegate.log(JULLogDelegate.java:162)
        at io.vertx.core.logging.JULLogDelegate.log(JULLogDelegate.java:166)
        at io.vertx.core.logging.JULLogDelegate.error(JULLogDelegate.java:66)
        at io.vertx.core.logging.Logger.error(Logger.java:70)
        at io.vertx.ext.web.impl.RoutingContextImplBase.unhandledFailure(RoutingContextImplBase.java:106)
        at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:88)
        at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:93)
        at io.vertx.ext.web.impl.RoutingContextImplBase.restart(RoutingContextImplBase.java:63)
        at io.vertx.ext.web.impl.RoutingContextImpl.reroute(RoutingContextImpl.java:279)
        at io.vertx.ext.web.RoutingContext.reroute(RoutingContext.java:355)
        at TestWebServer.lambda$start$0(TestWebServer.java:32)
        at io.vertx.ext.web.impl.RouteImpl.handleFailure(RouteImpl.java:227)
        at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:76)
        at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:93)
        at io.vertx.ext.web.impl.RoutingContextImplBase.restart(RoutingContextImplBase.java:63)
        at io.vertx.ext.web.impl.RoutingContextImpl.reroute(RoutingContextImpl.java:279)
        at io.vertx.ext.web.RoutingContext.reroute(RoutingContext.java:355)

I checked this version:
router.route("/*").failureHandler(fHdl -> {
    fHdl
.response()
       
.putHeader("content-type","text/html")
       
.putHeader("Cache-Control","max-age=864000") // 10 Days Caching
        .putHeader("accept-encoding","gzip, deflate")
       
.sendFile("webroot/index.html");
});

It works. Browser receives index.html page but it generates an exception on the server without stopping webserver. It continues working...

Unexpected exception in route
java.lang.IllegalStateException: Response has already been written
        at io.vertx.core.http.impl.HttpServerResponseImpl.checkWritten(HttpServerResponseImpl.java:561)
        at io.vertx.core.http.impl.HttpServerResponseImpl.putHeader(HttpServerResponseImpl.java:154)
        at io.vertx.core.http.impl.HttpServerResponseImpl.putHeader(HttpServerResponseImpl.java:52)
        at TestWebServer.lambda$start$0(TestWebServer.java:33)
        at io.vertx.ext.web.impl.RouteImpl.handleFailure(RouteImpl.java:227)
        at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:76)
        at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:93)
        at io.vertx.ext.web.impl.RoutingContextImpl.doFail(RoutingContextImpl.java:349)
        at io.vertx.ext.web.impl.RoutingContextImpl.fail(RoutingContextImpl.java:118)
        at io.vertx.ext.web.handler.impl.StaticHandlerImpl.lambda$sendStatic$2(StaticHandlerImpl.java:189)
        at io.vertx.ext.web.handler.impl.StaticHandlerImpl.getFileProps(StaticHandlerImpl.java:284)
        at io.vertx.ext.web.handler.impl.StaticHandlerImpl.sendStatic(StaticHandlerImpl.java:184)
        at io.vertx.ext.web.handler.impl.StaticHandlerImpl.handle(StaticHandlerImpl.java:141)
        at io.vertx.ext.web.handler.impl.StaticHandlerImpl.handle(StaticHandlerImpl.java:51)
        at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:221)
        at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:78)
        at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:93)
        at io.vertx.ext.web.impl.RouterImpl.accept(RouterImpl.java:79)
        at io.vertx.core.http.impl.ServerConnection.handleRequest(ServerConnection.java:274)
        at io.vertx.core.http.impl.ServerConnection.processMessage(ServerConnection.java:392)
        at io.vertx.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:134)
        at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:471)
        at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:420)
        at io.vertx.core.http.impl.VertxHttpHandler.lambda$channelRead$18(VertxHttpHandler.java:80)
        at io.vertx.core.impl.ContextImpl.lambda$wrapTask$16(ContextImpl.java:333)
        at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:225)
        at io.vertx.core.http.impl.VertxHttpHandler.channelRead(VertxHttpHandler.java:80)
        at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:124)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
        at java.lang.Thread.run(Thread.java:745)

Reply all
Reply to author
Forward
0 new messages