1
0
mirror of synced 2026-08-05 17:57:15 +00:00

HeaderWriterFilter writes headers at beginning

Add support for HeaderWriterFilter to write headers at the beginning of the request

Fixes: gh-6501
This commit is contained in:
Ankur Pathak
2019-02-13 15:04:46 +05:30
committed by Josh Cummings
parent fba25614bf
commit ac13b55ecd
3 changed files with 181 additions and 1 deletions
@@ -51,6 +51,11 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
*/
private final HeaderWriter headerWriter;
/**
* Indicates whether to write the headers at the beginning of the request.
*/
private boolean shouldWriteHeadersEagerly = false;
/**
* Creates a new instance.
*
@@ -67,11 +72,23 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (this.shouldWriteHeadersEagerly) {
doHeadersBefore(request, response, filterChain);
} else {
doHeadersAfter(request, response, filterChain);
}
}
private void doHeadersBefore(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
this.headerWriter.writeHeaders(request, response);
filterChain.doFilter(request, response);
}
private void doHeadersAfter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HeaderWriterResponse headerWriterResponse = new HeaderWriterResponse(request,
response, this.headerWriter);
HeaderWriterRequest headerWriterRequest = new HeaderWriterRequest(request,
headerWriterResponse);
try {
filterChain.doFilter(headerWriterRequest, headerWriterResponse);
} finally {
@@ -79,6 +96,17 @@ public class HeaderWriterFilter extends OncePerRequestFilter {
}
}
/**
* Allow writing headers at the beginning of the request.
*
* @param shouldWriteHeadersEagerly boolean to allow writing headers at the beginning of the request.
* @author Ankur Pathak
* @since 5.2
*/
public void setShouldWriteHeadersEagerly(boolean shouldWriteHeadersEagerly) {
this.shouldWriteHeadersEagerly = shouldWriteHeadersEagerly;
}
static class HeaderWriterResponse extends OnCommittedResponseWrapper {
private final HttpServletRequest request;
private final HeaderWriter headerWriter;
@@ -136,4 +136,25 @@ public class HeaderWriterFilterTests {
verifyNoMoreInteractions(this.writer1);
}
@Test
public void headersWrittenAtBeginningOfRequest() throws Exception {
HeaderWriterFilter filter = new HeaderWriterFilter(
Collections.singletonList(this.writer1));
filter.setShouldWriteHeadersEagerly(true);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
filter.doFilter(request, response, new FilterChain() {
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException {
verify(HeaderWriterFilterTests.this.writer1).writeHeaders(
any(HttpServletRequest.class), any(HttpServletResponse.class));
}
});
verifyNoMoreInteractions(this.writer1);
}
}