Skip to content

Commit 91e8a5f

Browse files
authored
Merge pull request #633 from alvince/issue/network-monitor-gzip
Fix: handle decoding gzip from response for network-record
2 parents b6d088b + c107f6c commit 91e8a5f

File tree

7 files changed

+86
-53
lines changed

7 files changed

+86
-53
lines changed

Android/java/app/src/debug/java/com/didichuxing/doraemondemo/MainDebugActivity.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
7171
private var mTencentLocationManager: TencentLocationManager? = null
7272
private val UPDATE_UI = 100
7373

74+
private val retrofit = Retrofit.Builder()
75+
.baseUrl("https://api.github.com/")
76+
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
77+
.addConverterFactory(GsonConverterFactory.create())
78+
.build()
79+
7480
/**
7581
* github 接口
7682
*/
@@ -145,11 +151,6 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
145151
.build()
146152
ImageLoader.getInstance().init(config)
147153

148-
val retrofit = Retrofit.Builder()
149-
.baseUrl("https://api.github.com/")
150-
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
151-
.addConverterFactory(GsonConverterFactory.create())
152-
.build()
153154
githubService = retrofit.create(GithubService::class.java)
154155

155156
AopTest().test()
@@ -343,11 +344,12 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
343344
//requestByGet("https://gank.io/api/today?a=哈哈&b=bb");
344345
requestByGet("https://www.v2ex.com/api/topics/hot.json")
345346
R.id.btn_retrofit_mock -> {
346-
val githubUserInfo = githubService?.githubUserInfo("jtsky")
347-
githubUserInfo?.subscribeOn(Schedulers.io())?.subscribe {
348-
Log.i(TAG, "githubUserInfo===>${it.login}")
349-
}
350-
347+
githubService?.githubUserInfo("jtsky")
348+
?.subscribeOn(Schedulers.io())
349+
?.subscribe(
350+
{ Log.i(TAG, "githubUserInfo===>${it.login}") },
351+
{ Log.e(TAG, "Request failed by retrofit mock", it) }
352+
)
351353
}
352354
R.id.btn_test_crash -> testCrash()!!.length
353355
R.id.btn_show_hide_icon -> if (DoraemonKit.isShow) {

Android/java/app/src/main/java/com/didichuxing/doraemondemo/retrofit/GithubService.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.didichuxing.doraemondemo.retrofit
22

33
import io.reactivex.Observable
4-
import retrofit2.Call
54
import retrofit2.http.GET
65
import retrofit2.http.Path
76

Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/core/DefaultResponseHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public DefaultResponseHandler(NetworkInterpreter networkInterpreter, int request
2929

3030
@Override
3131
public void onEOF(ByteArrayOutputStream outputStream) {
32-
mNetworkInterpreter.responseReadFinished(mRequestId,mRecord,outputStream);
32+
mNetworkInterpreter.responseReadFinished(mRequestId, mRecord, outputStream);
3333
}
3434

3535
@Override

Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/core/NetworkInterpreter.java

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.didichuxing.doraemonkit.kit.network.core;
22

3-
import androidx.annotation.Nullable;
43
import android.text.TextUtils;
5-
import android.util.Log;
4+
5+
import androidx.annotation.Nullable;
66

77
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
88
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
@@ -21,10 +21,20 @@
2121
* @desc: 网络请求解析类
2222
*/
2323
public class NetworkInterpreter {
24+
25+
private static class Holder {
26+
private static NetworkInterpreter INSTANCE = new NetworkInterpreter();
27+
}
28+
2429
public static final String TAG = "NetworkInterpreter";
30+
2531
private final AtomicInteger mNextRequestId = new AtomicInteger(0);
2632
private ResourceTypeHelper mResourceTypeHelper;
2733

34+
public static NetworkInterpreter get() {
35+
return NetworkInterpreter.Holder.INSTANCE;
36+
}
37+
2838
public void httpExchangeFailed(int requestId, String s) {
2939
//LogHelper.i(TAG, "[httpExchangeFailed] requestId: " + requestId + " error: " + s);
3040
}
@@ -39,46 +49,33 @@ public void responseReadFinished(int requestId, NetworkRecord record, ByteArrayO
3949
}
4050
}
4151

42-
4352
public void responseReadFailed(int requestId, String s) {
4453
LogHelper.i(TAG, "[responseReadFailed] requestId: " + requestId + " error: " + s);
4554
}
4655

47-
48-
private static class Holder {
49-
private static NetworkInterpreter INSTANCE = new NetworkInterpreter();
50-
}
51-
52-
public static NetworkInterpreter get() {
53-
return NetworkInterpreter.Holder.INSTANCE;
54-
}
55-
5656
public int nextRequestId() {
5757
return mNextRequestId.getAndIncrement();
5858
}
5959

6060
public InputStream interpretResponseStream(
6161
String contentType,
6262
@Nullable InputStream availableInputStream,
63-
ResponseHandler responseHandler) {
63+
ResponseHandler responseHandler
64+
) {
6465
if (availableInputStream == null) {
6566
responseHandler.onEOF(null);
6667
return null;
6768
}
68-
ResourceType resourceType =
69-
contentType != null ?
70-
getResourceTypeHelper().determineResourceType(contentType) :
71-
null;
69+
ResourceType resourceType = contentType != null
70+
? getResourceTypeHelper().determineResourceType(contentType)
71+
: null;
7272
if (resourceType != ResourceType.DOCUMENT && resourceType != ResourceType.XHR) {
7373
responseHandler.onEOF(null);
7474
return availableInputStream;
7575
}
76-
return new InputStreamProxy(
77-
availableInputStream,
78-
responseHandler);
76+
return new InputStreamProxy(availableInputStream, responseHandler);
7977
}
8078

81-
8279
public NetworkRecord createRecord(int requestId, NetworkInterpreter.InspectorRequest request) {
8380
NetworkRecord record = new NetworkRecord();
8481
record.mRequestId = requestId;
@@ -117,10 +114,8 @@ public void fetchResponseBody(NetworkRecord record, String body) {
117114
record.responseLength = body.getBytes().length;
118115
record.mResponseBody = body;
119116
}
120-
121117
}
122118

123-
124119
public void fetchResponseInfo(NetworkRecord record, NetworkInterpreter.InspectorResponse response) {
125120
Response responseJSON = new Response();
126121
responseJSON.url = response.url();
@@ -156,8 +151,7 @@ private String formatHeadersAsString(NetworkInterpreter.InspectorHeaders headers
156151
return builder.toString();
157152
}
158153

159-
private String readBodyAsString(
160-
NetworkInterpreter.InspectorRequest request) {
154+
private String readBodyAsString(NetworkInterpreter.InspectorRequest request) {
161155
try {
162156
byte[] body = request.body();
163157
if (body != null) {
@@ -168,8 +162,7 @@ private String readBodyAsString(
168162
return null;
169163
}
170164

171-
private String readBodyAsString(
172-
byte[] body) {
165+
private String readBodyAsString(byte[] body) {
173166
try {
174167
if (body != null) {
175168
return new String(body, Utf8Charset.INSTANCE);
@@ -179,8 +172,7 @@ private String readBodyAsString(
179172
return null;
180173
}
181174

182-
private long readBodyLength(
183-
NetworkInterpreter.InspectorRequest request) {
175+
private long readBodyLength(NetworkInterpreter.InspectorRequest request) {
184176
try {
185177
byte[] body = request.body();
186178
if (body != null) {
@@ -191,8 +183,7 @@ private long readBodyLength(
191183
return 0;
192184
}
193185

194-
private long readBodyLength(
195-
byte[] body) {
186+
private long readBodyLength(byte[] body) {
196187
try {
197188
if (body != null) {
198189
return body.length;
@@ -237,15 +228,13 @@ public interface InspectorResponse extends InspectorResponseCommon {
237228
String url();
238229
}
239230

240-
241231
public interface InspectorRequestCommon extends InspectorHeaders {
242232
/**
243233
* Unique identifier for this request. This identifier must be used in all other network
244234
* events corresponding to this request. Identifiers may be re-used for HTTP requests or
245235
* WebSockets that have exhuasted the state machine to its final closed/finished state.
246236
*/
247237
int id();
248-
249238
}
250239

251240
public interface InspectorResponseCommon extends InspectorHeaders {
@@ -255,7 +244,6 @@ public interface InspectorResponseCommon extends InspectorHeaders {
255244
int requestId();
256245

257246
int statusCode();
258-
259247
}
260248

261249
public interface InspectorHeaders {

Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/okhttp/interceptor/DoraemonInterceptor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
package com.didichuxing.doraemonkit.kit.network.okhttp.interceptor;
22

3-
43
import android.text.TextUtils;
54

5+
import androidx.annotation.NonNull;
6+
67
import com.didichuxing.doraemonkit.constant.DokitConstant;
78
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
89
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
910
import com.didichuxing.doraemonkit.kit.network.bean.WhiteHostBean;
1011
import com.didichuxing.doraemonkit.kit.network.core.DefaultResponseHandler;
1112
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
1213
import com.didichuxing.doraemonkit.kit.network.core.RequestBodyHelper;
13-
import com.didichuxing.doraemonkit.kit.network.core.ResourceType;
14-
import com.didichuxing.doraemonkit.kit.network.core.ResourceTypeHelper;
1514
import com.didichuxing.doraemonkit.kit.network.okhttp.ForwardingResponseBody;
1615
import com.didichuxing.doraemonkit.kit.network.okhttp.InterceptorUtil;
1716
import com.didichuxing.doraemonkit.kit.network.okhttp.OkHttpInspectorRequest;
1817
import com.didichuxing.doraemonkit.kit.network.okhttp.OkHttpInspectorResponse;
18+
import com.didichuxing.doraemonkit.kit.network.utils.OkHttpResponseKt;
1919
import com.didichuxing.doraemonkit.util.LogHelper;
2020

21-
import org.jetbrains.annotations.NotNull;
22-
2321
import java.io.IOException;
2422
import java.io.InputStream;
2523
import java.util.List;
@@ -39,9 +37,9 @@ public class DoraemonInterceptor implements Interceptor {
3937

4038
private final NetworkInterpreter mNetworkInterpreter = NetworkInterpreter.get();
4139

42-
@NotNull
40+
@NonNull
4341
@Override
44-
public Response intercept(Chain chain) throws IOException {
42+
public Response intercept(@NonNull Chain chain) throws IOException {
4543
if (!NetworkManager.isActive()) {
4644
Request request = chain.request();
4745
try {
@@ -110,6 +108,9 @@ public Response intercept(Chain chain) throws IOException {
110108
contentType != null ? contentType.toString() : null,
111109
responseStream,
112110
new DefaultResponseHandler(mNetworkInterpreter, requestId, record));
111+
record.mResponseBody = OkHttpResponseKt.bodyContent(response);
112+
LogHelper.d("http-monitor", "response body >>>\n" + record.mResponseBody);
113+
113114
if (responseStream != null) {
114115
response = response.newBuilder()
115116
.body(new ForwardingResponseBody(body, responseStream))
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
@file:RestrictTo(RestrictTo.Scope.LIBRARY)
2+
3+
package com.didichuxing.doraemonkit.kit.network.utils
4+
5+
import androidx.annotation.RestrictTo
6+
import okhttp3.Response
7+
import okio.Buffer
8+
import okio.GzipSource
9+
import java.nio.charset.Charset
10+
11+
internal fun Response.encoding() =
12+
this.header("content-encoding") ?: this.header("Content-Encoding")
13+
14+
internal fun Response.charset(): Charset {
15+
this.encoding()
16+
?.takeIf { Charset.isSupported(it) }
17+
?.also {
18+
return Charset.forName(it)
19+
}
20+
return body()?.contentType()?.charset() ?: Charset.defaultCharset()
21+
}
22+
23+
internal fun Response.bodyContent(): String = body()
24+
?.let { body ->
25+
val source = body.source()
26+
.apply {
27+
request(Long.MAX_VALUE)
28+
}
29+
var buffer = source.buffer
30+
val encoding = encoding()
31+
if ("gzip".equals(encoding, true)) {
32+
GzipSource(buffer.clone()).use { gzippedBody ->
33+
buffer = Buffer().also { it.writeAll(gzippedBody) }
34+
}
35+
}
36+
buffer
37+
}
38+
?.clone()
39+
?.readString(charset())
40+
?: ""

Android/java/gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ android.debug.obsoleteApi=true
1616
android.useAndroidX=true
1717
android.enableJetifier=true
1818
android.injected.testOnly=false
19+
20+
kotlin.code.style=official
21+
1922
#dokit全局配置
2023
#dokit 慢函数开关
2124
DOKIT_METHOD_SWITCH=true

0 commit comments

Comments
 (0)