From 3906d7e6e403689a7d948695bda250391968776d Mon Sep 17 00:00:00 2001 From: "mai.jh" Date: Wed, 9 Sep 2020 14:44:59 +0800 Subject: [PATCH 1/3] bug: fix issue #3790, Supplement http response Content-Encoding processing --- .../handler/AbstractResponseHandler.java | 26 +++++++++++++++++++ .../client/handler/BeanResponseHandler.java | 2 +- .../handler/RestResultResponseHandler.java | 2 +- .../client/handler/StringResponseHandler.java | 2 +- .../nacos/common/http/param/Header.java | 1 - 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java index 04918837171..e6a7eeca093 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java @@ -16,12 +16,16 @@ package com.alibaba.nacos.common.http.client.handler; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.http.HttpRestResult; import com.alibaba.nacos.common.http.client.response.HttpClientResponse; import com.alibaba.nacos.common.http.param.Header; import com.alibaba.nacos.common.utils.IoUtils; import org.apache.http.HttpStatus; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Type; /** @@ -33,6 +37,8 @@ public abstract class AbstractResponseHandler implements ResponseHandler { private Type responseType; + private static final String CONTENT_ENCODING = "gzip"; + @Override public final void setResponseType(Type responseType) { this.responseType = responseType; @@ -52,6 +58,26 @@ private HttpRestResult handleError(HttpClientResponse response) throws Except return new HttpRestResult(headers, response.getStatusCode(), null, message); } + /** + * Used to process http content_encoding, when content_encoding is GZIP, use GZIPInputStream. + * + * @param response HttpClientResponse + * @return InputStream + * @throws Exception Exception + */ + protected InputStream getBody(HttpClientResponse response) throws Exception { + final Header headers = response.getHeaders(); + final String contentEncoding = headers.getValue(HttpHeaderConsts.CONTENT_ENCODING); + if (CONTENT_ENCODING.equals(contentEncoding)) { + byte[] bytes = IoUtils.tryDecompress(response.getBody()); + if (bytes == null) { + throw new IOException("decompress http response error"); + } + return new ByteArrayInputStream(bytes); + } + return response.getBody(); + } + /** * Abstract convertResult method, Different types of converters for expansion. * diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java index 70c531534c6..8b454bdc3d0 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java @@ -35,7 +35,7 @@ public class BeanResponseHandler extends AbstractResponseHandler { @Override public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - InputStream body = response.getBody(); + InputStream body = getBody(response); T extractBody = JacksonUtils.toObj(body, responseType); return new HttpRestResult(headers, response.getStatusCode(), extractBody, null); } diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java index ec83b6aec55..5aa7ef6b5b7 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java @@ -36,7 +36,7 @@ public class RestResultResponseHandler extends AbstractResponseHandler { @SuppressWarnings("unchecked") public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - InputStream body = response.getBody(); + InputStream body = getBody(response); T extractBody = JacksonUtils.toObj(body, responseType); HttpRestResult httpRestResult = convert((RestResult) extractBody); httpRestResult.setHeader(headers); diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java index 43ca2cb44c8..d3117dbaf98 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java @@ -33,7 +33,7 @@ public class StringResponseHandler extends AbstractResponseHandler { @Override public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - String extractBody = IoUtils.toString(response.getBody(), headers.getCharset()); + String extractBody = IoUtils.toString(getBody(response), headers.getCharset()); return new HttpRestResult(headers, response.getStatusCode(), extractBody, null); } } diff --git a/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java b/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java index bebba34eac5..c581d7b26cd 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java @@ -45,7 +45,6 @@ private Header() { addParam(HttpHeaderConsts.CONTENT_TYPE, MediaType.APPLICATION_JSON); addParam(HttpHeaderConsts.ACCEPT_CHARSET, "UTF-8"); addParam(HttpHeaderConsts.ACCEPT_ENCODING, "gzip"); - addParam(HttpHeaderConsts.CONTENT_ENCODING, "gzip"); } public static Header newInstance() { From c38255a379f029fe6ca1a8f9f1bfc99ba8ad6f3e Mon Sep 17 00:00:00 2001 From: "mai.jh" Date: Wed, 9 Sep 2020 16:11:56 +0800 Subject: [PATCH 2/3] bug: fix issue #3790, Supplement http response Content-Encoding processing. --- .../handler/AbstractResponseHandler.java | 26 ------------------- .../client/handler/BeanResponseHandler.java | 2 +- .../handler/RestResultResponseHandler.java | 2 +- .../client/handler/StringResponseHandler.java | 2 +- .../response/JdkHttpClientResponse.java | 14 ++++++++++ .../alibaba/nacos/common/utils/IoUtils.java | 6 ++--- 6 files changed, 20 insertions(+), 32 deletions(-) diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java index e6a7eeca093..04918837171 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/AbstractResponseHandler.java @@ -16,16 +16,12 @@ package com.alibaba.nacos.common.http.client.handler; -import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.http.HttpRestResult; import com.alibaba.nacos.common.http.client.response.HttpClientResponse; import com.alibaba.nacos.common.http.param.Header; import com.alibaba.nacos.common.utils.IoUtils; import org.apache.http.HttpStatus; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; import java.lang.reflect.Type; /** @@ -37,8 +33,6 @@ public abstract class AbstractResponseHandler implements ResponseHandler { private Type responseType; - private static final String CONTENT_ENCODING = "gzip"; - @Override public final void setResponseType(Type responseType) { this.responseType = responseType; @@ -58,26 +52,6 @@ private HttpRestResult handleError(HttpClientResponse response) throws Except return new HttpRestResult(headers, response.getStatusCode(), null, message); } - /** - * Used to process http content_encoding, when content_encoding is GZIP, use GZIPInputStream. - * - * @param response HttpClientResponse - * @return InputStream - * @throws Exception Exception - */ - protected InputStream getBody(HttpClientResponse response) throws Exception { - final Header headers = response.getHeaders(); - final String contentEncoding = headers.getValue(HttpHeaderConsts.CONTENT_ENCODING); - if (CONTENT_ENCODING.equals(contentEncoding)) { - byte[] bytes = IoUtils.tryDecompress(response.getBody()); - if (bytes == null) { - throw new IOException("decompress http response error"); - } - return new ByteArrayInputStream(bytes); - } - return response.getBody(); - } - /** * Abstract convertResult method, Different types of converters for expansion. * diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java index 8b454bdc3d0..70c531534c6 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/BeanResponseHandler.java @@ -35,7 +35,7 @@ public class BeanResponseHandler extends AbstractResponseHandler { @Override public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - InputStream body = getBody(response); + InputStream body = response.getBody(); T extractBody = JacksonUtils.toObj(body, responseType); return new HttpRestResult(headers, response.getStatusCode(), extractBody, null); } diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java index 5aa7ef6b5b7..ec83b6aec55 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/RestResultResponseHandler.java @@ -36,7 +36,7 @@ public class RestResultResponseHandler extends AbstractResponseHandler { @SuppressWarnings("unchecked") public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - InputStream body = getBody(response); + InputStream body = response.getBody(); T extractBody = JacksonUtils.toObj(body, responseType); HttpRestResult httpRestResult = convert((RestResult) extractBody); httpRestResult.setHeader(headers); diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java index d3117dbaf98..43ca2cb44c8 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/handler/StringResponseHandler.java @@ -33,7 +33,7 @@ public class StringResponseHandler extends AbstractResponseHandler { @Override public HttpRestResult convertResult(HttpClientResponse response, Type responseType) throws Exception { final Header headers = response.getHeaders(); - String extractBody = IoUtils.toString(getBody(response), headers.getCharset()); + String extractBody = IoUtils.toString(response.getBody(), headers.getCharset()); return new HttpRestResult(headers, response.getStatusCode(), extractBody, null); } } diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java b/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java index f4ad0794db3..7d479050118 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java @@ -16,9 +16,11 @@ package com.alibaba.nacos.common.http.client.response; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.http.param.Header; import com.alibaba.nacos.common.utils.IoUtils; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -36,6 +38,8 @@ public class JdkHttpClientResponse implements HttpClientResponse { private Header responseHeader; + private static final String CONTENT_ENCODING = "gzip"; + public JdkHttpClientResponse(HttpURLConnection conn) { this.conn = conn; } @@ -51,8 +55,18 @@ public Header getHeaders() { @Override public InputStream getBody() throws IOException { + Header headers = getHeaders(); InputStream errorStream = this.conn.getErrorStream(); this.responseStream = (errorStream != null ? errorStream : this.conn.getInputStream()); + String contentEncoding = headers.getValue(HttpHeaderConsts.CONTENT_ENCODING); + // Used to process http content_encoding, when content_encoding is GZIP, use GZIPInputStream + if (CONTENT_ENCODING.equals(contentEncoding)) { + byte[] bytes = IoUtils.tryDecompress(responseStream); + if (bytes == null) { + throw new IOException("decompress http response error"); + } + return new ByteArrayInputStream(bytes); + } return this.responseStream; } diff --git a/common/src/main/java/com/alibaba/nacos/common/utils/IoUtils.java b/common/src/main/java/com/alibaba/nacos/common/utils/IoUtils.java index 0f949ba425f..c38de6dad3b 100644 --- a/common/src/main/java/com/alibaba/nacos/common/utils/IoUtils.java +++ b/common/src/main/java/com/alibaba/nacos/common/utils/IoUtils.java @@ -50,9 +50,9 @@ public class IoUtils { * * @param raw compress stream * @return byte array after decompress - * @throws Exception exception + * @throws IOException exception */ - public static byte[] tryDecompress(InputStream raw) throws Exception { + public static byte[] tryDecompress(InputStream raw) throws IOException { GZIPInputStream gis = null; ByteArrayOutputStream out = null; try { @@ -60,7 +60,7 @@ public static byte[] tryDecompress(InputStream raw) throws Exception { out = new ByteArrayOutputStream(); copy(gis, out); return out.toByteArray(); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { From e83dbba62c1d50ebc188c0ce6cca16edae22260a Mon Sep 17 00:00:00 2001 From: "mai.jh" Date: Wed, 9 Sep 2020 16:23:29 +0800 Subject: [PATCH 3/3] bug: fix issue #3790, Supplement http response Content-Encoding processing. --- .../common/http/client/response/JdkHttpClientResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java b/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java index 7d479050118..90fef344589 100644 --- a/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java +++ b/common/src/main/java/com/alibaba/nacos/common/http/client/response/JdkHttpClientResponse.java @@ -61,7 +61,7 @@ public InputStream getBody() throws IOException { String contentEncoding = headers.getValue(HttpHeaderConsts.CONTENT_ENCODING); // Used to process http content_encoding, when content_encoding is GZIP, use GZIPInputStream if (CONTENT_ENCODING.equals(contentEncoding)) { - byte[] bytes = IoUtils.tryDecompress(responseStream); + byte[] bytes = IoUtils.tryDecompress(this.responseStream); if (bytes == null) { throw new IOException("decompress http response error"); }