diff --git a/httpclient/src/main/java/org/apache/http/impl/client/BasicResponseHandler.java b/httpclient/src/main/java/org/apache/http/impl/client/BasicResponseHandler.java index 5ad5427b0..54df962db 100644 --- a/httpclient/src/main/java/org/apache/http/impl/client/BasicResponseHandler.java +++ b/httpclient/src/main/java/org/apache/http/impl/client/BasicResponseHandler.java @@ -42,13 +42,12 @@ import org.apache.http.util.EntityUtils; * A {@link ResponseHandler} that returns the response body as a String * for successful (2xx) responses. If the response code was >= 300, the response * body is consumed and an {@link HttpResponseException} is thrown. - * + *

* If this is used with * {@link org.apache.http.client.HttpClient#execute( * org.apache.http.client.methods.HttpUriRequest, ResponseHandler)}, * HttpClient may handle redirects (3xx responses) internally. * - * * @since 4.0 */ @Immutable @@ -63,12 +62,12 @@ public class BasicResponseHandler implements ResponseHandler { public String handleResponse(final HttpResponse response) throws HttpResponseException, IOException { StatusLine statusLine = response.getStatusLine(); + HttpEntity entity = response.getEntity(); if (statusLine.getStatusCode() >= 300) { + EntityUtils.consume(entity); throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase()); } - - HttpEntity entity = response.getEntity(); return entity == null ? null : EntityUtils.toString(entity); } diff --git a/httpclient/src/test/java/org/apache/http/impl/client/TestBasicResponseHandler.java b/httpclient/src/test/java/org/apache/http/impl/client/TestBasicResponseHandler.java new file mode 100644 index 000000000..4518a817b --- /dev/null +++ b/httpclient/src/test/java/org/apache/http/impl/client/TestBasicResponseHandler.java @@ -0,0 +1,86 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http.impl.client; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import junit.framework.Assert; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.StatusLine; +import org.apache.http.client.HttpResponseException; +import org.apache.http.entity.StringEntity; +import org.apache.http.message.BasicStatusLine; +import org.junit.Test; +import org.mockito.Mockito; + +/** + * Unit tests for {@link BasicResponseHandler}. + */ +public class TestBasicResponseHandler { + + @Test + public void testSuccessfulResponse() throws Exception { + StatusLine sl = new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK"); + HttpResponse response = Mockito.mock(HttpResponse.class); + HttpEntity entity = StringEntity.create("stuff"); + Mockito.when(response.getStatusLine()).thenReturn(sl); + Mockito.when(response.getEntity()).thenReturn(entity); + + BasicResponseHandler handler = new BasicResponseHandler(); + String s = handler.handleResponse(response); + Assert.assertEquals("stuff", s); + } + + @Test + public void testUnsuccessfulResponse() throws Exception { + InputStream instream = Mockito.mock(InputStream.class); + HttpEntity entity = Mockito.mock(HttpEntity.class); + Mockito.when(entity.isStreaming()).thenReturn(true); + Mockito.when(entity.getContent()).thenReturn(instream); + StatusLine sl = new BasicStatusLine(HttpVersion.HTTP_1_1, 404, "Not Found"); + HttpResponse response = Mockito.mock(HttpResponse.class); + Mockito.when(response.getStatusLine()).thenReturn(sl); + Mockito.when(response.getEntity()).thenReturn(entity); + + BasicResponseHandler handler = new BasicResponseHandler(); + try { + handler.handleResponse(response); + Assert.fail("HttpResponseException expected"); + } catch (HttpResponseException ex) { + Assert.assertEquals(404, ex.getStatusCode()); + Assert.assertEquals("Not Found", ex.getMessage()); + } + Mockito.verify(entity).getContent(); + Mockito.verify(instream).close(); + } + +}