Skip to content

Commit 1dae9aa

Browse files
committed
Add Missing OnCommitedResponseWrapper Header Overrides
Spring Security's `OnCommitedResponseWrapper` does not override the `setHeader`, `setIntHeader`, `addIntHeader` methods. This means that if the `Content-Length` response header is specified using any of those methods then the response body length is not tracked and can be committed before the response headers are written. Spring Security should override the missing methods and track `Content-Length` as is already done for `addHeader`. This issue is the underlying problem for spring-projects/spring-framework#36381 Closes gh-18797
1 parent bec25ed commit 1dae9aa

2 files changed

Lines changed: 56 additions & 1 deletion

File tree

web/src/main/java/org/springframework/security/web/util/OnCommittedResponseWrapper.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,38 @@ public OnCommittedResponseWrapper(HttpServletResponse response) {
5858

5959
@Override
6060
public void addHeader(String name, String value) {
61+
checkContentLengthHeader(name, value);
62+
super.addHeader(name, value);
63+
}
64+
65+
@Override
66+
public void addIntHeader(String name, int value) {
67+
checkContentLengthHeader(name, value);
68+
super.addIntHeader(name, value);
69+
}
70+
71+
@Override
72+
public void setHeader(String name, String value) {
73+
checkContentLengthHeader(name, value);
74+
super.setHeader(name, value);
75+
}
76+
77+
@Override
78+
public void setIntHeader(String name, int value) {
79+
checkContentLengthHeader(name, value);
80+
super.setIntHeader(name, value);
81+
}
82+
83+
private void checkContentLengthHeader(String name, int value) {
84+
if ("Content-Length".equalsIgnoreCase(name)) {
85+
setContentLength(value);
86+
}
87+
}
88+
89+
private void checkContentLengthHeader(String name, String value) {
6190
if ("Content-Length".equalsIgnoreCase(name)) {
6291
setContentLength(Long.parseLong(value));
6392
}
64-
super.addHeader(name, value);
6593
}
6694

6795
@Override

web/src/test/java/org/springframework/security/web/util/OnCommittedResponseWrapperTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,33 @@ public void addHeaderContentLengthPrintWriterWriteStringCommits() throws Excepti
10061006
assertThat(this.committed).isTrue();
10071007
}
10081008

1009+
@Test
1010+
public void addIntHeaderContentLengthPrintWriterWriteStringCommits() throws Exception {
1011+
givenGetWriterThenReturn();
1012+
int expected = 1234;
1013+
this.response.addIntHeader("Content-Length", String.valueOf(expected).length());
1014+
this.response.getWriter().write(expected);
1015+
assertThat(this.committed).isTrue();
1016+
}
1017+
1018+
@Test
1019+
public void setHeaderContentLengthPrintWriterWriteStringCommits() throws Exception {
1020+
givenGetWriterThenReturn();
1021+
int expected = 1234;
1022+
this.response.setHeader("Content-Length", String.valueOf(String.valueOf(expected).length()));
1023+
this.response.getWriter().write(expected);
1024+
assertThat(this.committed).isTrue();
1025+
}
1026+
1027+
@Test
1028+
public void setIntHeaderContentLengthPrintWriterWriteStringCommits() throws Exception {
1029+
givenGetWriterThenReturn();
1030+
int expected = 1234;
1031+
this.response.setIntHeader("Content-Length", String.valueOf(expected).length());
1032+
this.response.getWriter().write(expected);
1033+
assertThat(this.committed).isTrue();
1034+
}
1035+
10091036
@Test
10101037
public void bufferSizePrintWriterWriteCommits() throws Exception {
10111038
givenGetWriterThenReturn();

0 commit comments

Comments
 (0)