public final void testQueryInRequestUri_regex() throws Exception { final Injector injector = Guice.createInjector( new ServletModule() { @Override protected void configureServlets() { filterRegex("(.)*\\.html").through(TestFilter.class); serveRegex("(.)*\\.html").with(TestServlet.class); } }); final FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); pipeline.initPipeline(null); //create ourselves a mock request with test URI HttpServletRequest requestMock = createMock(HttpServletRequest.class); expect(requestMock.getRequestURI()).andReturn("/index.html?query=params").atLeastOnce(); expect(requestMock.getContextPath()).andReturn("").anyTimes(); //dispatch request replay(requestMock); pipeline.dispatch(requestMock, null, createMock(FilterChain.class)); pipeline.destroyPipeline(); verify(requestMock); assertEquals(1, doFilters); assertEquals(1, services); }
public final void testServletExceptionPrunesStack() throws Exception { Injector injector = Guice.createInjector( new ServletModule() { @Override protected void configureServlets() { filter("/").through(TestFilter.class); filter("/nothing").through(TestFilter.class); serve("/").with(ThrowingServlet.class); } }); HttpServletRequest request = newFakeHttpServletRequest(); FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); pipeline.initPipeline(null); try { pipeline.dispatch(request, null, null); fail("expected exception"); } catch (ServletException ex) { for (StackTraceElement element : ex.getStackTrace()) { String className = element.getClassName(); assertTrue( "was: " + element, !className.equals(FilterChainInvocation.class.getName()) && !className.equals(FilterDefinition.class.getName())); } } }
public final void testFilterBypass() throws ServletException, IOException { final Injector injector = Guice.createInjector( new ServletModule() { @Override protected void configureServlets() { filter("/protected/*").through(TestFilter.class); } }); final FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); pipeline.initPipeline(null); assertEquals(1, inits); runRequestForPath(pipeline, "/./protected/resource", true); runRequestForPath(pipeline, "/protected/../resource", false); runRequestForPath(pipeline, "/protected/../protected/resource", true); assertEquals(0, destroys); pipeline.destroyPipeline(); assertEquals(1, destroys); }
@Override public void init(FilterConfig filterConfig) throws ServletException { final ServletContext servletContext = filterConfig.getServletContext(); // Store servlet context in a weakreference, for injection GuiceFilter.servletContext = new WeakReference<>(servletContext); // In the default pipeline, this is a noop. However, if replaced // by a managed pipeline, a lazy init will be triggered the first time // dispatch occurs. FilterPipeline filterPipeline = getFilterPipeline(); filterPipeline.initPipeline(servletContext); }
@Override public void destroy() { try { // Destroy all registered filters & servlets in that order FilterPipeline filterPipeline = getFilterPipeline(); filterPipeline.destroyPipeline(); } finally { reset(); servletContext.clear(); } }
@Override public void doFilter( final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { final FilterPipeline filterPipeline = getFilterPipeline(); Context previous = GuiceFilter.localContext.get(); HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletRequest originalRequest = (previous != null) ? previous.getOriginalRequest() : request; try { RequestScoper.CloseableScope scope = new Context(originalRequest, request, response).open(); try { //dispatch across the servlet pipeline, ensuring web.xml's filterchain is honored filterPipeline.dispatch(servletRequest, servletResponse, filterChain); } finally { scope.close(); } } catch (IOException e) { throw e; } catch (ServletException e) { throw e; } catch (Exception e) { Throwables.propagate(e); } }
public final void testFilterExceptionPrunesStack() throws Exception { Injector injector = Guice.createInjector( new ServletModule() { @Override protected void configureServlets() { filter("/").through(TestFilter.class); filter("/nothing").through(TestFilter.class); filter("/").through(ThrowingFilter.class); } }); HttpServletRequest request = newFakeHttpServletRequest(); FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); pipeline.initPipeline(null); try { pipeline.dispatch(request, null, null); fail("expected exception"); } catch (ServletException ex) { for (StackTraceElement element : ex.getStackTrace()) { String className = element.getClassName(); assertTrue( "was: " + element, !className.equals(FilterChainInvocation.class.getName()) && !className.equals(FilterDefinition.class.getName())); } } }
public void initPipeline(ServletContext context) throws ServletException { for (final FilterPipeline p : pipelines) { p.initPipeline(context); } }
public void destroyPipeline() { for (final FilterPipeline p : pipelines) { p.destroyPipeline(); } } }
private void runRequestForPath(FilterPipeline pipeline, String value, boolean matches) throws IOException, ServletException { assertEquals(0, doFilters); //create ourselves a mock request with test URI HttpServletRequest requestMock = control.createMock(HttpServletRequest.class); expect(requestMock.getRequestURI()).andReturn(value).anyTimes(); expect(requestMock.getContextPath()).andReturn("").anyTimes(); // dispatch request FilterChain filterChain = control.createMock(FilterChain.class); filterChain.doFilter(requestMock, null); control.replay(); pipeline.dispatch(requestMock, null, filterChain); control.verify(); control.reset(); if (matches) { assertEquals("filter was not run", 1, doFilters); doFilters = 0; } else { assertEquals("filter was run", 0, doFilters); } }
pipeline.initPipeline(null); pipeline.dispatch(requestMock, null, createMock(FilterChain.class)); pipeline.destroyPipeline();
public void testFilterOrder() throws Exception { AtomicInteger counter = new AtomicInteger(); final CountFilter f1 = new CountFilter(counter); final CountFilter f2 = new CountFilter(counter); Injector injector = Guice.createInjector( new ServletModule() { @Override protected void configureServlets() { filter("/").through(f1); install( new ServletModule() { @Override protected void configureServlets() { filter("/").through(f2); } }); } }); HttpServletRequest request = newFakeHttpServletRequest(); final FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); pipeline.initPipeline(null); pipeline.dispatch(request, null, newNoOpFilterChain()); assertEquals(0, f1.calledAt); assertEquals(1, f2.calledAt); }
public void init(FilterConfig filterConfig) throws ServletException { final ServletContext servletContext = filterConfig.getServletContext(); // Store servlet context in a weakreference, for injection GuiceFilter.servletContext = new WeakReference<ServletContext>(servletContext); // In the default pipeline, this is a noop. However, if replaced // by a managed pipeline, a lazy init will be triggered the first time // dispatch occurs. GuiceFilter.pipeline.initPipeline(servletContext); }
public void destroy() { try { // Destroy all registered filters & servlets in that order FilterPipeline filterPipeline = null != injectedPipeline ? injectedPipeline : pipeline; filterPipeline.destroyPipeline(); } finally { reset(); servletContext.clear(); } } }
public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { if (itr.hasNext()) { itr.next().dispatch(request, response, this); } else { defaultChain.doFilter(request, response); } } }
pipeline.initPipeline(null); pipeline.dispatch(requestMock, null, createMock(FilterChain.class)); pipeline.destroyPipeline();
public void init(FilterConfig filterConfig) throws ServletException { final ServletContext servletContext = filterConfig.getServletContext(); // Store servlet context in a weakreference, for injection GuiceFilter.servletContext = new WeakReference<ServletContext>(servletContext); // In the default pipeline, this is a noop. However, if replaced // by a managed pipeline, a lazy init will be triggered the first time // dispatch occurs. FilterPipeline filterPipeline = null != injectedPipeline ? injectedPipeline : pipeline; filterPipeline.initPipeline(servletContext); }
public void destroy() { try { // Destroy all registered filters & servlets in that order pipeline.destroyPipeline(); } finally { reset(); servletContext.clear(); } } }
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { Context previous = localContext.get(); FilterPipeline filterPipeline = pipeline; try { localContext.set(new Context((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse)); //dispatch across the servlet pipeline, ensuring web.xml's filterchain is honored filterPipeline.dispatch(servletRequest, servletResponse, filterChain); } finally { localContext.set(previous); } }
pipeline.initPipeline(null); pipeline.dispatch(requestMock, null, createMock(FilterChain.class)); pipeline.destroyPipeline();