diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java
index e5a491071..01591d730 100644
--- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java
+++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Engine.java
@@ -21,7 +21,6 @@ import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
@@ -75,14 +74,11 @@ public class HttpClient4Engine extends AbstractClientEngine {
initEngine();
final HttpUriRequest request = buildRequest(message);
- final CloseableHttpResponse response;
try {
- response = this.engine.execute(request);
+ return this.engine.execute(request, response -> new HttpClient4Response(response, message.charset()));
} catch (final IOException e) {
throw new HttpException(e);
}
-
- return new HttpClient4Response(response, message.charset());
}
@Override
@@ -223,6 +219,7 @@ public class HttpClient4Engine extends AbstractClientEngine {
/**
* 构建请求配置,包括重定向
+ *
* @param request 请求
* @return {@link RequestConfig}
*/
@@ -258,7 +255,7 @@ public class HttpClient4Engine extends AbstractClientEngine {
if (readTimeout > 0) {
requestConfigBuilder.setSocketTimeout(readTimeout);
}
- if(config instanceof HttpClientConfig){
+ if (config instanceof HttpClientConfig) {
requestConfigBuilder.setMaxRedirects(((HttpClientConfig) config).getMaxRedirects());
}
diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Response.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Response.java
index 416cdd378..c3ff0a554 100644
--- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Response.java
+++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient4/HttpClient4Response.java
@@ -16,25 +16,25 @@
package org.dromara.hutool.http.client.engine.httpclient4;
-import org.dromara.hutool.core.io.IORuntimeException;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.util.EntityUtils;
import org.dromara.hutool.core.array.ArrayUtil;
+import org.dromara.hutool.core.io.IORuntimeException;
+import org.dromara.hutool.core.lang.wrapper.SimpleWrapper;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.http.HttpException;
import org.dromara.hutool.http.HttpUtil;
import org.dromara.hutool.http.client.Response;
-import org.apache.http.Header;
-import org.apache.http.ParseException;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.util.EntityUtils;
+import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* HttpClient响应包装
@@ -42,12 +42,12 @@ import java.util.Map;
*
* @author looly
*/
-public class HttpClient4Response implements Response {
+public class HttpClient4Response extends SimpleWrapper implements Response {
/**
- * HttpClient的响应对象
+ * 响应主体
*/
- private final CloseableHttpResponse rawRes;
+ private final HttpEntity entity;
/**
* 请求时的默认编码
*/
@@ -57,23 +57,24 @@ public class HttpClient4Response implements Response {
* 构造
* 通过传入一个请求时的编码,当无法获取响应内容的编码时,默认使用响应时的编码
*
- * @param rawRes {@link CloseableHttpResponse}
+ * @param rawRes {@link HttpResponse}
* @param requestCharset 请求时的编码
*/
- public HttpClient4Response(final CloseableHttpResponse rawRes, final Charset requestCharset) {
- this.rawRes = rawRes;
+ public HttpClient4Response(final HttpResponse rawRes, final Charset requestCharset) {
+ super(rawRes);
+ this.entity = rawRes.getEntity();
this.requestCharset = requestCharset;
}
@Override
public int getStatus() {
- return rawRes.getStatusLine().getStatusCode();
+ return this.raw.getStatusLine().getStatusCode();
}
@Override
public String header(final String name) {
- final Header[] headers = rawRes.getHeaders(name);
+ final Header[] headers = this.raw.getHeaders(name);
if (ArrayUtil.isNotEmpty(headers)) {
return headers[0].getValue();
}
@@ -83,7 +84,7 @@ public class HttpClient4Response implements Response {
@Override
public Map> headers() {
- final Header[] headers = rawRes.getAllHeaders();
+ final Header[] headers = this.raw.getAllHeaders();
final HashMap> result = new LinkedHashMap<>(headers.length, 1);
for (final Header header : headers) {
final List valueList = result.computeIfAbsent(header.getName(), k -> new ArrayList<>());
@@ -94,7 +95,7 @@ public class HttpClient4Response implements Response {
@Override
public long contentLength() {
- return rawRes.getEntity().getContentLength();
+ return this.entity.getContentLength();
}
@Override
@@ -105,7 +106,7 @@ public class HttpClient4Response implements Response {
@Override
public InputStream bodyStream() {
try {
- return rawRes.getEntity().getContent();
+ return this.entity.getContent();
} catch (final IOException e) {
throw new IORuntimeException(e);
}
@@ -114,7 +115,7 @@ public class HttpClient4Response implements Response {
@Override
public String bodyStr() throws HttpException {
try {
- return EntityUtils.toString(rawRes.getEntity(), charset());
+ return EntityUtils.toString(this.entity, charset());
} catch (final IOException e) {
throw new IORuntimeException(e);
} catch (final ParseException e) {
@@ -124,7 +125,9 @@ public class HttpClient4Response implements Response {
@Override
public void close() throws IOException {
- rawRes.close();
+ if(this.raw instanceof Closeable){
+ ((Closeable) this.raw).close();
+ }
}
@Override
diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java
index bf8684954..dcfce4a06 100644
--- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java
+++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Engine.java
@@ -30,7 +30,6 @@ import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.message.BasicHeader;
@@ -82,14 +81,11 @@ public class HttpClient5Engine extends AbstractClientEngine {
initEngine();
final ClassicHttpRequest request = buildRequest(message);
- final ClassicHttpResponse response;
try {
- response = this.engine.executeOpen(null, request, null);
+ return this.engine.execute(request, (response -> new HttpClient5Response(response, message.charset())));
} catch (final IOException e) {
throw new HttpException(e);
}
-
- return new HttpClient5Response(response, message.charset());
}
@Override
diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Response.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Response.java
index 13aea38b0..57c002bd5 100644
--- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Response.java
+++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/httpclient5/HttpClient5Response.java
@@ -16,8 +16,10 @@
package org.dromara.hutool.http.client.engine.httpclient5;
+import org.apache.hc.core5.http.HttpEntity;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.array.ArrayUtil;
+import org.dromara.hutool.core.lang.wrapper.SimpleWrapper;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.http.HttpException;
import org.dromara.hutool.http.HttpUtil;
@@ -43,12 +45,9 @@ import java.util.Map;
*
* @author looly
*/
-public class HttpClient5Response implements Response {
+public class HttpClient5Response extends SimpleWrapper implements Response {
- /**
- * HttpClient的响应对象
- */
- private final ClassicHttpResponse rawRes;
+ private final HttpEntity entity;
/**
* 请求时的默认编码
*/
@@ -62,19 +61,20 @@ public class HttpClient5Response implements Response {
* @param requestCharset 请求时的编码
*/
public HttpClient5Response(final ClassicHttpResponse rawRes, final Charset requestCharset) {
- this.rawRes = rawRes;
+ super(rawRes);
+ this.entity = rawRes.getEntity();
this.requestCharset = requestCharset;
}
@Override
public int getStatus() {
- return rawRes.getCode();
+ return this.raw.getCode();
}
@Override
public String header(final String name) {
- final Header[] headers = rawRes.getHeaders(name);
+ final Header[] headers = this.raw.getHeaders(name);
if (ArrayUtil.isNotEmpty(headers)) {
return headers[0].getValue();
}
@@ -84,7 +84,7 @@ public class HttpClient5Response implements Response {
@Override
public Map> headers() {
- final Header[] headers = rawRes.getHeaders();
+ final Header[] headers = this.raw.getHeaders();
final HashMap> result = new LinkedHashMap<>(headers.length, 1);
for (final Header header : headers) {
final List valueList = result.computeIfAbsent(header.getName(), k -> new ArrayList<>());
@@ -95,7 +95,7 @@ public class HttpClient5Response implements Response {
@Override
public long contentLength() {
- return rawRes.getEntity().getContentLength();
+ return this.entity.getContentLength();
}
@Override
@@ -106,7 +106,7 @@ public class HttpClient5Response implements Response {
@Override
public InputStream bodyStream() {
try {
- return rawRes.getEntity().getContent();
+ return this.entity.getContent();
} catch (final IOException e) {
throw new IORuntimeException(e);
}
@@ -115,7 +115,7 @@ public class HttpClient5Response implements Response {
@Override
public String bodyStr() throws HttpException {
try {
- return EntityUtils.toString(rawRes.getEntity(), charset());
+ return EntityUtils.toString(this.entity, charset());
} catch (final IOException e) {
throw new IORuntimeException(e);
} catch (final ParseException e) {
@@ -125,7 +125,7 @@ public class HttpClient5Response implements Response {
@Override
public void close() throws IOException {
- rawRes.close();
+ this.raw.close();
}
@Override