in gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java [465:547]
private static HandlerCollection createHandlers(
final GatewayConfig config,
final GatewayServices services,
final ContextHandlerCollection contexts,
final Map<String, Integer> topologyPortMap) {
final Map<String, Handler> contextToHandlerMap = new HashMap<>();
if(contexts.getHandlers() != null) {
Arrays.asList(contexts.getHandlers()).stream()
.filter(h -> h instanceof WebAppContext)
.forEach(h -> contextToHandlerMap
.put(((WebAppContext) h).getContextPath(), h));
}
HandlerCollection handlers = new HandlerCollection();
RequestLogHandler logHandler = new RequestLogHandler();
logHandler.setRequestLog( new AccessHandler() );
TraceHandler traceHandler = new TraceHandler();
traceHandler.setHandler( contexts );
traceHandler.setTracedBodyFilter( System.getProperty( "org.apache.knox.gateway.trace.body.status.filter" ) );
CorrelationHandler correlationHandler = new CorrelationHandler();
correlationHandler.setHandler( traceHandler );
// Used to correct the {target} part of request with Topology Port Mapping feature
final PortMappingHelperHandler portMappingHandler = new PortMappingHelperHandler(config);
portMappingHandler.setHandler(correlationHandler);
// If topology to port mapping feature is enabled then we add new Handler {RequestForwardHandler}
// to the chain, this handler listens on the configured port (in gateway-site.xml)
// and simply forwards requests to the correct context path.
// The reason for adding ContextHandler is so that we can add a connector
// to it on which the handler listens (exclusively).
if (config.isGatewayPortMappingEnabled()) {
/* Do the virtual host bindings for all the defined topology port mapped
* contexts except for the one that has gateway port to prevent issues
* with context deployment */
topologyPortMap
.entrySet()
.stream()
.filter(e -> !e.getValue().equals(config.getGatewayPort()))
.forEach( entry -> {
log.createJettyHandler(entry.getKey());
final Handler context = contextToHandlerMap
.get("/" + config.getGatewayPath() + "/" + entry.getKey());
if(context != null) {
((WebAppContext) context).setVirtualHosts(
new String[] { "@" + entry.getKey().toLowerCase(Locale.ROOT) });
} else {
// no topology found for mapping entry.getKey()
log.noMappedTopologyFound(entry.getKey());
}
});
}
handlers.addHandler(logHandler);
if(config.isStrictTransportEnabled()) {
final String strictTransportOption = config.getStrictTransportOption();
handlers.addHandler(new HSTSHandler(strictTransportOption));
log.strictTransportHeaderEnabled(strictTransportOption);
}
if (config.isWebsocketEnabled()) {
final GatewayWebsocketHandler websocketHandler = new GatewayWebsocketHandler(
config, services);
websocketHandler.setHandler(portMappingHandler);
handlers.addHandler(websocketHandler);
} else {
handlers.addHandler(portMappingHandler);
}
return handlers;
}