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:
committed by
Josh Cummings
parent
fba25614bf
commit
ac13b55ecd
@@ -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;
|
||||
|
||||
+21
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user