In this quick quick tutorial we will learn how to add a custom Handler to Undertow and then we will install it on WildFly as a module.
The main Undertow functionality is provided by io.undertow.server.HttpHandler instances. These handlers can be chained together to form a complete server. In this example, we will add a TimedHandler which will allow to handle request between a time frame. Out of this timeframe, a service unavailable will be returned.
Here is our Handler:
package com.mastertheboss; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.util.StatusCodes; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; public class TimedHandler implements HttpHandler { private HttpHandler next; public TimedHandler(HttpHandler next) { this.next = next; } // Default values String from ="09:00"; String to ="13:00"; public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public String getTo() { return to; } public void setTo(String to) { this.to = to; } @Override public void handleRequest(final HttpServerExchange exchange) throws Exception { if (checkTime()) { next.handleRequest(exchange); } else { exchange.setStatusCode(StatusCodes.SERVICE_UNAVAILABLE); exchange.endExchange(); } } public boolean checkTime() { Calendar now = Calendar.getInstance(); int hour = now.get(Calendar.HOUR_OF_DAY); // Get hour in 24 hour format int minute = now.get(Calendar.MINUTE); Date date = parseDate(hour + ":" + minute); Date dateCompareOne = parseDate(from); Date dateCompareTwo = parseDate(to); if (dateCompareOne.before( date ) && dateCompareTwo.after(date)) { return true; } return false; } private Date parseDate(String date) { final String inputFormat = "HH:mm"; SimpleDateFormat inputParser = new SimpleDateFormat(inputFormat, Locale.US); try { return inputParser.parse(date); } catch (java.text.ParseException e) { return new Date(0); } } }
In order to compile this class, you will need the following Maven dependency:
<dependency> <groupId>io.undertow</groupId> <artifactId>undertow-core</artifactId> <version>2.0.29.Final</version> </dependency>
Now let’s install the Undertow Handler as a Module. Assumed that you have packaged your Handler in the file undertow-handler-1.0-SNAPSHOT.jar</>, connect to the CLI:
$ ./jboss-cli -c
Then execute the following commands that will install the module and add it to the Undertow subsystem:
module add --name=com.mastertheboss.demohandler --slot=main --resources=undertow-handler-1.0-SNAPSHOT.jar --dependencies=io.undertow.core,javaee.api,javax.api /subsystem=undertow/configuration=filter/custom-filter=example-handler:add(class-name=com.mastertheboss.TimedHandler, module=com.mastertheboss.demohandler)
As the Handler supports the “from” and “to” parameters, we will add a beginning and the end of the service:
/subsystem=undertow/configuration=filter/custom-filter=example-handler:write-attribute(name=parameters.from,value="08:00") /subsystem=undertow/configuration=filter/custom-filter=example-handler:write-attribute(name=parameters.to,value="18:00")
Finally, add the filter ref to the host to enable it:
/subsystem=undertow/server=default-server/host=default-host/filter-ref=example-handler:add()
This is undertow configuration after these commands:
<subsystem xmlns="urn:jboss:domain:undertow:10.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other" statistics-enabled="${wildfly.undertow.statistics-enabled:${wildfly.statistics-enabled:false}}"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/> <https-listener name="https" socket-binding="https" ssl-context="ssl-context-server.keystore_1" enable-http2="true"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="example-handler"/> <http-invoker security-realm="ApplicationRealm"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <filter name="example-handler" class-name="com.mastertheboss.TimedHandler" module="com.mastertheboss.demohandler"> <param name="from" value="08:00"/> <param name="to" value="18:00"/> </filter> </filters> </subsystem>
You can check, if you issue an HTTP request beyond the defined timeframe, an error will be raised:
curl http://localhost:8080 <html><head><title>Error</title></head><body>503 - Service Unavailable</body></html>
Source code for this tutorial: Here