Skip to content

Commit

Permalink
增加alwaysProcessEntity参数
Browse files Browse the repository at this point in the history
  • Loading branch information
dbstarll committed Mar 29, 2023
1 parent 56996e2 commit a56fbae
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.HttpResponseException;
import org.apache.hc.client5.http.impl.classic.AbstractHttpClientResponseHandler;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.HttpStatus;
import org.apache.hc.core5.http.io.entity.EntityUtils;

import java.io.IOException;

public abstract class AbstractResponseHandler<T> extends AbstractHttpClientResponseHandler<T> {
private final boolean alwaysProcessEntity;

protected AbstractResponseHandler(final boolean alwaysProcessEntity) {
this.alwaysProcessEntity = alwaysProcessEntity;
}

@Override
public final T handleResponse(final ClassicHttpResponse response) throws IOException {
final HttpEntity entity = response.getEntity();
if (response.getCode() >= HttpStatus.SC_REDIRECTION && (entity == null || !alwaysProcessEntity)) {
EntityUtils.consume(entity);
throw new HttpResponseException(response.getCode(), response.getReasonPhrase());
}
return entity == null ? null : handleEntity(entity);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;

public class BasicResponseHandlerFactory extends AbstractResponseHandlerFactory {
/**
* 构造BasicResponseHandlerFactory.
*
* @param alwaysProcessEntity 在返回错误的状态码时,是否还要继续解析entity
*/
public BasicResponseHandlerFactory() {
addResponseHandler(String.class, new BasicHttpClientResponseHandler());
public BasicResponseHandlerFactory(final boolean alwaysProcessEntity) {
addResponseHandler(String.class, new StringResponseHandler(alwaysProcessEntity));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
import org.apache.hc.core5.http.HttpEntity;

import java.io.IOException;

public final class StringResponseHandler extends AbstractResponseHandler<String> {
private static final BasicHttpClientResponseHandler DEFAULT_HANDLER = new BasicHttpClientResponseHandler();

/**
* @param alwaysProcessEntity 在返回错误的状态码时,是否还要继续解析entity
*/
public StringResponseHandler(final boolean alwaysProcessEntity) {
super(alwaysProcessEntity);
}

@Override
public String handleEntity(final HttpEntity entity) throws IOException {
return DEFAULT_HANDLER.handleEntity(entity);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
import org.junit.jupiter.api.Test;

Expand All @@ -16,15 +15,15 @@
class BasicResponseHandlerFactoryTest {
@Test
void getResponseHandler() {
final ResponseHandlerFactory factory = new BasicResponseHandlerFactory();
final ResponseHandlerFactory factory = new BasicResponseHandlerFactory(true);
final HttpClientResponseHandler<String> handler = factory.getResponseHandler(String.class);
assertNotNull(handler);
assertEquals(handler.getClass(), BasicHttpClientResponseHandler.class);
assertEquals(handler.getClass(), StringResponseHandler.class);
}

@Test
void iterator() {
final ResponseHandlerFactory factory = new BasicResponseHandlerFactory();
final ResponseHandlerFactory factory = new BasicResponseHandlerFactory(false);
final Iterator<Class<?>> ite = factory.iterator();
assertNotNull(ite);
assertTrue(ite.hasNext());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler;
import org.apache.hc.core5.http.io.HttpClientResponseHandler;
import org.junit.jupiter.api.Test;

Expand All @@ -16,16 +15,16 @@
class MultiResponseHandlerFactoryTest {
@Test
void getResponseHandler() {
final ResponseHandlerFactory factory = new MultiResponseHandlerFactory(new BasicResponseHandlerFactory());
final ResponseHandlerFactory factory = new MultiResponseHandlerFactory(new BasicResponseHandlerFactory(true));
final HttpClientResponseHandler<String> handler = factory.getResponseHandler(String.class);
assertNotNull(handler);
assertEquals(handler.getClass(), BasicHttpClientResponseHandler.class);
assertEquals(handler.getClass(), StringResponseHandler.class);
}


@Test
void iterator() {
final ResponseHandlerFactory factory = new MultiResponseHandlerFactory(new BasicResponseHandlerFactory());
final ResponseHandlerFactory factory = new MultiResponseHandlerFactory(new BasicResponseHandlerFactory(true));
final Iterator<Class<?>> ite = factory.iterator();
assertNotNull(ite);
assertTrue(ite.hasNext());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.github.dbstarll.utils.http.client.response;

import org.apache.hc.client5.http.HttpResponseException;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.io.support.ClassicResponseBuilder;
import org.junit.jupiter.api.Test;

import java.io.IOException;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrowsExactly;

class StringResponseHandlerTest {
@Test
void handleResponse() throws IOException {
final ClassicHttpResponse response = ClassicResponseBuilder.create(200).setEntity("abc").build();
assertEquals("abc", new StringResponseHandler(false).handleResponse(response));
}

@Test
void handleNull() throws IOException {
final ClassicHttpResponse response = ClassicResponseBuilder.create(200).build();
assertNull(new StringResponseHandler(false).handleResponse(response));
}

@Test
void handle404() {
final ClassicHttpResponse response = ClassicResponseBuilder.create(404).setEntity("abc").build();
final HttpResponseException e = assertThrowsExactly(HttpResponseException.class,
() -> new StringResponseHandler(false).handleResponse(response));
assertEquals(404, e.getStatusCode());
assertEquals("Not Found", e.getReasonPhrase());
}

@Test
void alwaysProcessEntity() throws IOException {
final ClassicHttpResponse response = ClassicResponseBuilder.create(404).setEntity("abc").build();
assertEquals("abc", new StringResponseHandler(true).handleResponse(response));
}

@Test
void alwaysProcessEntityNull() {
final ClassicHttpResponse response = ClassicResponseBuilder.create(404).build();
final HttpResponseException e = assertThrowsExactly(HttpResponseException.class,
() -> new StringResponseHandler(true).handleResponse(response));
assertEquals(404, e.getStatusCode());
assertEquals("Not Found", e.getReasonPhrase());
}
}

0 comments on commit a56fbae

Please sign in to comment.