From ebb1f353587c0bb80fd3f7a5fa5efa4c7a4aefaa Mon Sep 17 00:00:00 2001 From: Andrew Azores Date: Mon, 26 Oct 2020 15:31:10 +0000 Subject: [PATCH] Add timeouthandler (#310) * Add timeouthandler Wraps around Vert.x TimeoutHandler implementation to write a 500 response if a request is not completed by another handler within 15 seconds Fixes #288 * Add 'L' to long literal * Apply Spotless formatting --- .../net/web/handlers/CorsEnablingHandler.java | 2 +- .../web/handlers/RequestHandlersModule.java | 4 + .../net/web/handlers/TimeoutHandler.java | 78 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/TimeoutHandler.java diff --git a/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/CorsEnablingHandler.java b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/CorsEnablingHandler.java index f9ac4194df..85f5f20798 100644 --- a/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/CorsEnablingHandler.java +++ b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/CorsEnablingHandler.java @@ -76,7 +76,7 @@ class CorsEnablingHandler implements RequestHandler { @Override public int getPriority() { - return 0; + return 1; } @Override diff --git a/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/RequestHandlersModule.java b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/RequestHandlersModule.java index ec39ca415d..e6001acda8 100644 --- a/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/RequestHandlersModule.java +++ b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/RequestHandlersModule.java @@ -59,6 +59,10 @@ @Module public abstract class RequestHandlersModule { + @Binds + @IntoSet + abstract RequestHandler bindTimeoutHandler(TimeoutHandler handler); + @Binds @IntoSet abstract RequestHandler bindCorsEnablingHandler(CorsEnablingHandler handler); diff --git a/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/TimeoutHandler.java b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/TimeoutHandler.java new file mode 100644 index 0000000000..c7d519dfea --- /dev/null +++ b/src/main/java/com/redhat/rhjmc/containerjfr/net/web/handlers/TimeoutHandler.java @@ -0,0 +1,78 @@ +/*- + * #%L + * Container JFR + * %% + * Copyright (C) 2020 Red Hat, Inc. + * %% + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or data + * (collectively the "Software"), free of charge and under any and all copyright + * rights in the Software, and any and all patent rights owned or freely + * licensable by each licensor hereunder covering either (i) the unmodified + * Software as contributed to or provided by such licensor, or (ii) the Larger + * Works (as defined below), to deal in both + * + * (a) the Software, and + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software (each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * The above copyright notice and either this complete permission notice or at + * a minimum a reference to the UPL must be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * #L% + */ +package com.redhat.rhjmc.containerjfr.net.web.handlers; + +import javax.inject.Inject; + +import io.vertx.core.http.HttpMethod; +import io.vertx.ext.web.RoutingContext; + +class TimeoutHandler implements RequestHandler { + + static final long TIMEOUT_MS = 15_000L; + final io.vertx.ext.web.handler.TimeoutHandler handler; + + @Inject + TimeoutHandler() { + this.handler = io.vertx.ext.web.handler.TimeoutHandler.create(TIMEOUT_MS); + } + + @Override + public int getPriority() { + return 0; + } + + @Override + public HttpMethod httpMethod() { + return HttpMethod.OTHER; + } + + @Override + public String path() { + return ALL_PATHS; + } + + @Override + public void handle(RoutingContext ctx) { + handler.handle(ctx); + } +}