From d95bbb6b1b7dc5a0d2cd24fb4628aef038bd665c Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 28 Mar 2018 12:16:03 +0200 Subject: [PATCH] Test for hasError keeping body available in case of unknown status code Issue: SPR-16604 --- .../DefaultResponseErrorHandlerTests.java | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java b/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java index b34cd1d599..4731d43661 100644 --- a/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/client/DefaultResponseErrorHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.web.client; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.junit.Test; @@ -25,6 +26,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.StreamUtils; import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; @@ -33,6 +35,8 @@ import static org.mockito.BDDMockito.*; * Unit tests for {@link DefaultResponseErrorHandler}. * * @author Arjen Poutsma + * @author Juergen Hoeller + * @author Denys Ivano */ public class DefaultResponseErrorHandlerTests { @@ -121,4 +125,56 @@ public class DefaultResponseErrorHandlerTests { assertFalse(handler.hasError(response)); } + @Test // SPR-16604 + public void bodyAvailableAfterHasErrorForUnknownStatusCode() throws Exception { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.TEXT_PLAIN); + TestByteArrayInputStream body = new TestByteArrayInputStream("Hello World".getBytes(StandardCharsets.UTF_8)); + + given(response.getRawStatusCode()).willReturn(999); + given(response.getStatusText()).willReturn("Custom status code"); + given(response.getHeaders()).willReturn(headers); + given(response.getBody()).willReturn(body); + + assertFalse(handler.hasError(response)); + assertFalse(body.isClosed()); + assertEquals("Hello World", StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8)); + } + + + private static class TestByteArrayInputStream extends ByteArrayInputStream { + + private boolean closed; + + public TestByteArrayInputStream(byte[] buf) { + super(buf); + this.closed = false; + } + + public boolean isClosed() { + return closed; + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public synchronized void mark(int readlimit) { + throw new UnsupportedOperationException("mark/reset not supported"); + } + + @Override + public synchronized void reset() { + throw new UnsupportedOperationException("mark/reset not supported"); + } + + @Override + public void close() throws IOException { + super.close(); + this.closed = true; + } + } + }