package com.example; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.security.web.header.HeaderWriter; import org.springframework.security.web.header.HeaderWriterFilter; @SuppressWarnings("serial") public class HeaderWriterFilterNotWrittingHeadersTest { private HeaderWriterFilter subject; private MockHttpServletRequest req; private MockHttpServletResponse res; private FilterChain filterChain; private final static Map HEADERS = Collections.unmodifiableMap(new HashMap() {{ put("header", "value"); }}); private static final List WRITERS = Collections.unmodifiableList(Arrays.asList(new HeaderWriter() { @Override public void writeHeaders(HttpServletRequest request, HttpServletResponse response) { assertFalse("attempted to write headers on an already committed response - API offense", response.isCommitted()); HEADERS.forEach((h, v) -> response.setHeader(h, v)); } })); @Before public void setup() throws UnsupportedEncodingException { subject = new HeaderWriterFilter(WRITERS); req = new MockHttpServletRequest(); res = new MockHttpServletResponse(); filterChain = new FilterChain() { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { //do nothing } }; } @Test public void testWritingHeaders() throws ServletException, IOException { //arrange (some filter in the chain commits the response before the HeaderWriterFilter could wrap the original response with the extended header-writer capabilities res.getWriter().write("lets flush the stream"); res.flushBuffer(); //act subject.doFilter(req, res, filterChain); //assert HEADERS.forEach((h, v) -> assertEquals(v, res.getHeader(h))); } }