diff --git a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java index f9eaf0208bbb..b4c873c6cbf2 100644 --- a/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java @@ -175,6 +175,12 @@ public class MockHttpServletRequest implements HttpServletRequest { @Nullable private byte[] content; + @Nullable + private ServletInputStream inputStream; + + @Nullable + private BufferedReader reader; + @Nullable private String contentType; @@ -492,12 +498,17 @@ public String getContentType() { @Override public ServletInputStream getInputStream() { + if (this.inputStream != null) { + return this.inputStream; + } + if (this.content != null) { - return new DelegatingServletInputStream(new ByteArrayInputStream(this.content)); + this.inputStream = new DelegatingServletInputStream(new ByteArrayInputStream(this.content)); } else { - return EMPTY_SERVLET_INPUT_STREAM; + this.inputStream = EMPTY_SERVLET_INPUT_STREAM; } + return this.inputStream; } /** @@ -697,16 +708,21 @@ public int getServerPort() { @Override public BufferedReader getReader() throws UnsupportedEncodingException { + if (this.reader != null) { + return this.reader; + } + if (this.content != null) { InputStream sourceStream = new ByteArrayInputStream(this.content); Reader sourceReader = (this.characterEncoding != null) ? new InputStreamReader(sourceStream, this.characterEncoding) : new InputStreamReader(sourceStream); - return new BufferedReader(sourceReader); + this.reader = new BufferedReader(sourceReader); } else { - return EMPTY_BUFFERED_READER; + this.reader = EMPTY_BUFFERED_READER; } + return this.reader; } public void setRemoteAddr(String remoteAddr) { diff --git a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java index f3cc3a7a55d5..357d07eab2a7 100644 --- a/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java +++ b/spring-test/src/test/java/org/springframework/mock/web/MockHttpServletRequestTests.java @@ -112,6 +112,24 @@ public void noContent() throws IOException { assertNull(request.getContentAsByteArray()); } + @Test + public void getReaderTwice() throws IOException { + byte[] bytes = "body".getBytes(Charset.defaultCharset()); + request.setContent(bytes); + assertSame( + request.getReader(), + request.getReader()); + } + + @Test + public void getInputStreamTwice() throws IOException { + byte[] bytes = "body".getBytes(Charset.defaultCharset()); + request.setContent(bytes); + assertSame( + request.getInputStream(), + request.getInputStream()); + } + @Test public void setContentType() { String contentType = "test/plain";