From 2d8664d84119d663a525ca6f0b2d86cd60cd09f4 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Tue, 10 Mar 2015 00:29:03 -0500 Subject: [PATCH] OnCommittedResponseWrapper tracks getOutputStream().write(byte[]) properly Fixes gh-171 --- .../web/http/OnCommittedResponseWrapper.java | 4 ++++ .../http/OnCommittedResponseWrapperTests.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java b/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java index 60fe3a78..ac9d6b0a 100644 --- a/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java +++ b/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java @@ -155,6 +155,10 @@ abstract class OnCommittedResponseWrapper extends HttpServletResponseWrapper { trackContentLength(String.valueOf(content)); } + private void trackContentLength(byte[] content) { + checkContentLength(content == null ? 0 : content.length); + } + private void trackContentLength(char[] content) { checkContentLength(content == null ? 0 : content.length); } diff --git a/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java b/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java index d857b79c..2612b638 100644 --- a/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java +++ b/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java @@ -882,6 +882,25 @@ public class OnCommittedResponseWrapperTests { assertThat(committed).isTrue(); } + // gh-171 + @Test + public void contentLengthPlus1OutputStreamWriteByteArrayMultiDigitCommits() throws Exception { + String expected = "{\n" + + " \"parameterName\" : \"_csrf\",\n" + + " \"token\" : \"06300b65-c4aa-4c8f-8cda-39ee17f545a0\",\n" + + " \"headerName\" : \"X-CSRF-TOKEN\"\n" + + "}"; + response.setContentLength(expected.length() + 1); + + response.getOutputStream().write(expected.getBytes()); + + assertThat(committed).isFalse(); + + response.getOutputStream().write("1".getBytes("UTF-8")); + + assertThat(committed).isTrue(); + } + @Test public void contentLengthOutputStreamPrintBooleanCommits() throws Exception { boolean b = true;