/** * {@inheritDoc} */ @Override public void load(final String path, final HttpServletRequestImpl request, final HttpServletResponseImpl response) throws IOException { ServletContextImpl servletContext = servletContextHelper.getResolvedContext(servletContexts, path); Objects.requireNonNull(servletContext); ServletMapping servletMapping = servletContextHelper.getResolvedServletMapping(servletContext, path); request.setServletContext(servletContext); Servlet servlet = getServlet(servletMapping, new ServletConfigImpl(servletContext)); response.setStatus(HttpServletResponse.STATUS_OK); try { FilterChainImpl filterChain = getFilterChain(path, servletContext, servlet); filterChain.doFilter(request, response); terminate(request, response); } catch (ServletException | FilterInitializationException e) { throw new UnexpectedSituationException(e); } }
private FilterChainImpl getFilterChain(final String path, final ServletContextImpl servletContext, final Servlet servlet) throws FilterInitializationException, ServletException { Deque<Filter> deque = new ArrayDeque<>(getFilterMappingsForPath(path, servletContext)); deque.add(new Filter() { @Override public void init(final FilterConfig filterConfig) { // Do nothing } @Override public void doFilter(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException { servlet.service(request, response); } }); return new FilterChainImpl(deque); }
@Before public void setUp() throws ServletException, ServletInitializationException { servletContainer = mock(ServletContainer.class); when(servletContainer.getServletForClass(any(Class.class), any(ServletConfig.class))). thenReturn(mock(Servlet.class)); servletContext = mock(ServletContextImpl.class); when(servletContext.getContextPath()).thenReturn("/"); ServletMapping servletMapping = new ServletMappingImpl(Pattern.compile("^.*$"), SampleServlet.class); when(servletContext.getServletMappings()).thenReturn(Arrays.asList(servletMapping)); when(servletContext.getFilterMappings()).thenReturn(Collections.<FilterMapping>emptyList()); servletResourceProvider = new ServletResourceProvider( servletContainer, Arrays.asList(servletContext) ); response = new HttpServletResponseImpl(mock( Serializer.class), mock(Serializer.class), mock(StreamHelper.class), mock(OutputStream.class)); request = mock(HttpServletRequestImpl.class); when(request.getServletContext()).thenReturn(servletContext); }
@Test public void shouldNotHandleSessionOnTerminateIfSessionExists() throws IOException { when(request.getSession(false)).thenReturn(null); servletResourceProvider.load("/", request, response); verify(servletContext, times(0)).handleSession(any(HttpSessionImpl.class), any(HttpServletResponseImpl.class)); }
/** * Terminates servlet. Sets all necessary headers, flushes content. * * @param request * @param response * @throws IOException */ private void terminate(final HttpServletRequestImpl request, final HttpServletResponseImpl response) throws IOException { freeUploadedUnprocessedFiles(request.getUploadedFiles()); HttpSessionImpl session = (HttpSessionImpl) request.getSession(false); if (session != null) { try { ((ServletContextImpl) request.getServletContext()).handleSession(session, response); } catch (IOException e) { LOGGER.log(Level.WARNING, "Unable to persist session", e); } } if (!response.isCommitted()) { if (response.getContentType() == null) { response.setContentType(DEFAULT_RESPONSE_CONTENT_TYPE); } response.getHeaders().setHeader(Headers.HEADER_CACHE_CONTROL, HEADER_VALUE_NO_CACHE); response.getHeaders().setHeader(Headers.HEADER_PRAGMA, HEADER_VALUE_NO_CACHE); } response.flush(); }
private ServletResourceProvider getServletResourceProvider(final ServerConfig serverConfig) { return new ServletResourceProvider( new ServletContainerImpl(new DateProvider(), SERVLET_TIME_TO_LIVE_IN_MS, MONITORING_INTERVAL_IN_MS), getServletContexts(serverConfig) ); } }
@Test(expected = UnexpectedSituationException.class) public void shouldWrapServletInitializationException() throws IOException, ServletException, ServletInitializationException { when(servletContainer.getServletForClass(any(Class.class), any(ServletConfig.class))) .thenThrow(new ServletInitializationException(new Exception())); servletResourceProvider.load("/", request, response); } }
@Test public void shouldHandleSessionOnTerminateIfSessionExists() throws IOException { when(request.getSession(false)).thenReturn(new HttpSessionImpl("1", System.currentTimeMillis())); servletResourceProvider.load("/", request, response); verify(servletContext, times(1)).handleSession(any(HttpSessionImpl.class), any(HttpServletResponseImpl.class)); }