in httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/ServerBootstrap.java [349:444]
public HttpServer create() {
final String actualCanonicalHostName = canonicalHostName != null ? canonicalHostName : InetAddressUtils.getCanonicalLocalHostName();
final HttpRequestMapper<HttpRequestHandler> requestRouterCopy;
if (lookupRegistry != null && requestRouter == null) {
final org.apache.hc.core5.http.protocol.RequestHandlerRegistry<HttpRequestHandler> handlerRegistry = new org.apache.hc.core5.http.protocol.RequestHandlerRegistry<>(
actualCanonicalHostName,
() -> lookupRegistry != null ? lookupRegistry : new org.apache.hc.core5.http.protocol.UriPatternMatcher<>());
for (final RequestRouter.Entry<HttpRequestHandler> entry: routeEntries) {
handlerRegistry.register(entry.uriAuthority != null ? entry.uriAuthority.getHostName() : null, entry.route.pattern, entry.route.handler);
}
requestRouterCopy = handlerRegistry;
} else {
if (routeEntries.isEmpty()) {
requestRouterCopy = requestRouter;
} else {
requestRouterCopy = RequestRouter.create(
new URIAuthority(actualCanonicalHostName),
UriPatternType.URI_PATTERN,
routeEntries,
RequestRouter.IGNORE_PORT_AUTHORITY_RESOLVER,
requestRouter);
}
}
final HttpServerRequestHandler requestHandler;
if (!filters.isEmpty()) {
final NamedElementChain<HttpFilterHandler> filterChainDefinition = new NamedElementChain<>();
filterChainDefinition.addLast(
new TerminalServerFilter(
requestRouterCopy,
this.responseFactory != null ? this.responseFactory : DefaultClassicHttpResponseFactory.INSTANCE),
StandardFilter.MAIN_HANDLER.name());
filterChainDefinition.addFirst(
new HttpServerExpectationFilter(),
StandardFilter.EXPECT_CONTINUE.name());
for (final FilterEntry<HttpFilterHandler> entry: filters) {
switch (entry.position) {
case AFTER:
filterChainDefinition.addAfter(entry.existing, entry.filterHandler, entry.name);
break;
case BEFORE:
filterChainDefinition.addBefore(entry.existing, entry.filterHandler, entry.name);
break;
case REPLACE:
filterChainDefinition.replace(entry.existing, entry.filterHandler);
break;
case FIRST:
filterChainDefinition.addFirst(entry.filterHandler, entry.name);
break;
case LAST:
// Don't add last, after TerminalServerFilter, as that does not delegate to the chain
// Instead, add the filter just before it, making it effectively the last filter
filterChainDefinition.addBefore(StandardFilter.MAIN_HANDLER.name(), entry.filterHandler, entry.name);
break;
}
}
NamedElementChain<HttpFilterHandler>.Node current = filterChainDefinition.getLast();
HttpServerFilterChainElement filterChain = null;
while (current != null) {
filterChain = new HttpServerFilterChainElement(current.getValue(), filterChain);
current = current.getPrevious();
}
requestHandler = new HttpServerFilterChainRequestHandler(filterChain);
} else {
requestHandler = new BasicHttpServerExpectationDecorator(new BasicHttpServerRequestHandler(
requestRouterCopy,
this.responseFactory != null ? this.responseFactory : DefaultClassicHttpResponseFactory.INSTANCE));
}
final HttpService httpService = new HttpService(
this.httpProcessor != null ? this.httpProcessor : HttpProcessors.server(),
requestHandler,
this.http1Config,
this.connStrategy != null ? this.connStrategy : DefaultConnectionReuseStrategy.INSTANCE,
this.streamListener);
HttpConnectionFactory<? extends DefaultBHttpServerConnection> connectionFactoryCopy = this.connectionFactory;
if (connectionFactoryCopy == null) {
final String scheme = serverSocketFactory instanceof SSLServerSocketFactory || sslContext != null ?
URIScheme.HTTPS.id : URIScheme.HTTP.id;
connectionFactoryCopy = new DefaultBHttpServerConnectionFactory(scheme, this.http1Config, this.charCodingConfig);
}
return new HttpServer(
Math.max(this.listenerPort, 0),
httpService,
this.localAddress,
this.socketConfig != null ? this.socketConfig : SocketConfig.DEFAULT,
serverSocketFactory,
connectionFactoryCopy,
sslContext,
sslSetupHandler != null ? sslSetupHandler : DefaultTlsSetupHandler.SERVER,
this.exceptionListener != null ? this.exceptionListener : ExceptionListener.NO_OP);
}