From b72bbd85e79d389d086cc3d8fa0e5353af7450c5 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 8 Oct 2023 23:07:05 +0800 Subject: [PATCH] add gzip support for okhttp --- .../http/GlobalCompressStreamRegister.java | 21 ++++++++++++++++ .../client/engine/jdk/JdkHttpInputStream.java | 11 +------- .../client/engine/okhttp/OkHttpEngine.java | 4 +-- .../client/engine/okhttp/OkHttpResponse.java | 12 ++++++--- .../hutool/http/client/XiaohonshuTest.java | 25 +++++++++++-------- 5 files changed, 45 insertions(+), 28 deletions(-) diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/GlobalCompressStreamRegister.java b/hutool-http/src/main/java/org/dromara/hutool/http/GlobalCompressStreamRegister.java index 99d755646..e6efe20b6 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/GlobalCompressStreamRegister.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/GlobalCompressStreamRegister.java @@ -14,6 +14,7 @@ package org.dromara.hutool.http; import org.dromara.hutool.core.compress.InflaterInputStream; import org.dromara.hutool.core.map.CaseInsensitiveMap; +import org.dromara.hutool.core.reflect.ConstructorUtil; import java.io.InputStream; import java.util.Map; @@ -45,6 +46,26 @@ public enum GlobalCompressStreamRegister { compressMap.put("deflate", InflaterInputStream.class); } + /** + * 包装原始响应流为指定压缩算法解压流 + * + * @param in 原始响应流 + * @param contentEncoding 压缩编码,如gzip等 + * @return 包装后的响应流 + */ + public InputStream wrapStream(final InputStream in, final String contentEncoding){ + final Class streamClass = get(contentEncoding); + if (null != streamClass) { + try { + return ConstructorUtil.newInstance(streamClass, in); + } catch (final Exception ignore) { + // 对于构造错误的压缩算法,跳过之 + } + } + + return in; + } + /** * 获取解压器 * diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkHttpInputStream.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkHttpInputStream.java index ee0b43389..8ab561d88 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkHttpInputStream.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/JdkHttpInputStream.java @@ -12,7 +12,6 @@ package org.dromara.hutool.http.client.engine.jdk; -import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.http.GlobalCompressStreamRegister; import org.dromara.hutool.http.HttpException; @@ -106,14 +105,6 @@ public class JdkHttpInputStream extends InputStream { return; } - final String contentEncoding = response.contentEncoding(); - final Class streamClass = GlobalCompressStreamRegister.INSTANCE.get(contentEncoding); - if (null != streamClass) { - try { - this.in = ConstructorUtil.newInstance(streamClass, this.in); - } catch (final Exception ignore) { - // 对于构造错误的压缩算法,跳过之 - } - } + this.in = GlobalCompressStreamRegister.INSTANCE.wrapStream(this.in, response.contentEncoding()); } } diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java index afac4f617..07b1c6b5c 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpEngine.java @@ -40,9 +40,7 @@ public class OkHttpEngine implements ClientEngine { /** * 构造 */ - public OkHttpEngine() { - this.client = new OkHttpClient(); - } + public OkHttpEngine() {} @Override public OkHttpEngine init(final ClientConfig config) { diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpResponse.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpResponse.java index 2fe591496..cea448382 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpResponse.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/okhttp/OkHttpResponse.java @@ -12,12 +12,14 @@ package org.dromara.hutool.http.client.engine.okhttp; -import org.dromara.hutool.core.io.stream.EmptyInputStream; -import org.dromara.hutool.core.util.ObjUtil; -import org.dromara.hutool.http.client.Response; import kotlin.Pair; import okhttp3.Headers; import okhttp3.ResponseBody; +import org.dromara.hutool.core.io.stream.EmptyInputStream; +import org.dromara.hutool.core.util.ObjUtil; +import org.dromara.hutool.http.GlobalCompressStreamRegister; +import org.dromara.hutool.http.client.Response; +import org.dromara.hutool.http.meta.HeaderName; import java.io.InputStream; import java.nio.charset.Charset; @@ -77,7 +79,9 @@ public class OkHttpResponse implements Response { if(null == body){ return EmptyInputStream.INSTANCE; } - return body.byteStream(); + + return GlobalCompressStreamRegister.INSTANCE.wrapStream(body.byteStream(), + this.rawRes.header(HeaderName.CONTENT_ENCODING.getValue())); } @Override diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/client/XiaohonshuTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/client/XiaohonshuTest.java index 147898ead..6123e057c 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/client/XiaohonshuTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/client/XiaohonshuTest.java @@ -13,37 +13,40 @@ package org.dromara.hutool.http.client; import org.dromara.hutool.core.lang.Console; -import org.dromara.hutool.http.client.engine.httpclient5.HttpClient5Engine; +import org.dromara.hutool.http.client.engine.okhttp.OkHttpEngine; import org.dromara.hutool.http.meta.HeaderName; import org.dromara.hutool.http.meta.Method; import org.dromara.hutool.json.JSONUtil; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import java.util.Date; import java.util.HashMap; public class XiaohonshuTest { @Test @Disabled void postTest() { - long l = (new Date().getTime()); - String sign = "oauth.getAccessToken?appId=880c43b57a97425d9a06×tamp="+l - +"&version=2.0d9758815286df7a3075d64785df2b890"; + final long l = System.currentTimeMillis(); + final String sign = "oauth.getAccessToken?appId=880c43b57a97425d9a06×tamp=" + l + + "&version=2.0d9758815286df7a3075d64785df2b890"; - HashMap paramMap = new HashMap<>(); - paramMap.put("sign",sign); + final HashMap paramMap = new HashMap<>(); + paramMap.put("sign", sign); paramMap.put("appId", "880c43b57a97425d9a06"); //880c43b57a97425d9a06 paramMap.put("timestamp", l); paramMap.put("version", "2.0"); paramMap.put("method", "oauth.getAccessToken"); paramMap.put("code", "code-266ef7f29fff4f0d80d4bd23f579391e-2097e077fad84eb0a5ec4a44a8de1116"); - String json = JSONUtil.toJsonStr(paramMap); + final String json = JSONUtil.toJsonStr(paramMap); - Request request = Request.of("https://ark.xiaohongshu.com/ark/open_api/v3/common_controller") - .header(HeaderName.CONTENT_TYPE, "application/json;charset=UTF-8") + final Request request = Request.of("https://ark.xiaohongshu.com/ark/open_api/v3/common_controller") + .header(HeaderName.CONTENT_TYPE, "application/json;charset=UTF-8") .method(Method.POST) + .header(HeaderName.ACCEPT_ENCODING, "gzip") .body(json); - Console.log(request.send(new HttpClient5Engine()).bodyStr()); + + final Response res = request.send(new OkHttpEngine()); + Console.log(res.header(HeaderName.CONTENT_ENCODING)); + Console.log(res.bodyStr()); } }