in aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java [91:141]
FilterChainHolder getFilterChain(final HttpServletRequest request, Servlet servlet) {
String targetPath = request.getRequestURI();
DispatcherType type = request.getDispatcherType();
// only return the cached result if the filter list hasn't changed in the meanwhile
if (getFilterHolders().size() == filtersSize && getFilterChainCache(type, targetPath, servlet) != null) {
return getFilterChainCache(type, targetPath, servlet);
}
AwsServletRegistration servletRegistration = (AwsServletRegistration)servletContext.getServletRegistrations()
.values().stream()
.filter((Predicate<ServletRegistration>) servletRegistration1 -> ((AwsServletRegistration) servletRegistration1).getServlet().equals(servlet))
.findFirst().orElse(null);
FilterChainHolder chainHolder = new FilterChainHolder();
Map<String, FilterHolder> registrations = getFilterHolders();
if (registrations == null || registrations.size() == 0) {
if (servletRegistration != null) {
chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext));
}
return chainHolder;
}
for (Map.Entry<String, FilterHolder> entry : registrations.entrySet()) {
FilterHolder holder = entry.getValue();
// we only check the dispatcher type if it's not empty. Otherwise we assume it's a REQUEST as per section 6.2.5
// of servlet specs
if (holder.getRegistration().getDispatcherTypes().size() > 0 && !holder.getRegistration().getDispatcherTypes().contains(type)) {
continue;
}
for (String path : holder.getRegistration().getUrlPatternMappings()) {
if (pathMatches(targetPath, path)) {
chainHolder.addFilter(holder);
}
}
// TODO: We do not allow programmatic registration of servlets so we never check for servlet name
// we assume we only ever have one servlet.
}
if (servletRegistration != null) {
chainHolder.addFilter(new FilterHolder(new ServletExecutionFilter(servletRegistration), servletContext));
}
putFilterChainCache(type, targetPath, servlet, chainHolder);
// update total filter size
if (filtersSize != registrations.size()) {
filtersSize = registrations.size();
}
return chainHolder;
}