未验证 提交 91e8a5f5 编写于 作者: 金台 提交者: GitHub

Merge pull request #633 from alvince/issue/network-monitor-gzip

Fix: handle decoding gzip from response for network-record
......@@ -71,6 +71,12 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
private var mTencentLocationManager: TencentLocationManager? = null
private val UPDATE_UI = 100
private val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
/**
* github 接口
*/
......@@ -145,11 +151,6 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
.build()
ImageLoader.getInstance().init(config)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
githubService = retrofit.create(GithubService::class.java)
AopTest().test()
......@@ -343,11 +344,12 @@ class MainDebugActivity : BaseActivity(), View.OnClickListener {
//requestByGet("https://gank.io/api/today?a=哈哈&b=bb");
requestByGet("https://www.v2ex.com/api/topics/hot.json")
R.id.btn_retrofit_mock -> {
val githubUserInfo = githubService?.githubUserInfo("jtsky")
githubUserInfo?.subscribeOn(Schedulers.io())?.subscribe {
Log.i(TAG, "githubUserInfo===>${it.login}")
}
githubService?.githubUserInfo("jtsky")
?.subscribeOn(Schedulers.io())
?.subscribe(
{ Log.i(TAG, "githubUserInfo===>${it.login}") },
{ Log.e(TAG, "Request failed by retrofit mock", it) }
)
}
R.id.btn_test_crash -> testCrash()!!.length
R.id.btn_show_hide_icon -> if (DoraemonKit.isShow) {
......
package com.didichuxing.doraemondemo.retrofit
import io.reactivex.Observable
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
......
......@@ -29,7 +29,7 @@ public class DefaultResponseHandler implements ResponseHandler {
@Override
public void onEOF(ByteArrayOutputStream outputStream) {
mNetworkInterpreter.responseReadFinished(mRequestId,mRecord,outputStream);
mNetworkInterpreter.responseReadFinished(mRequestId, mRecord, outputStream);
}
@Override
......
package com.didichuxing.doraemonkit.kit.network.core;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
......@@ -21,10 +21,20 @@ import java.util.concurrent.atomic.AtomicInteger;
* @desc: 网络请求解析类
*/
public class NetworkInterpreter {
private static class Holder {
private static NetworkInterpreter INSTANCE = new NetworkInterpreter();
}
public static final String TAG = "NetworkInterpreter";
private final AtomicInteger mNextRequestId = new AtomicInteger(0);
private ResourceTypeHelper mResourceTypeHelper;
public static NetworkInterpreter get() {
return NetworkInterpreter.Holder.INSTANCE;
}
public void httpExchangeFailed(int requestId, String s) {
//LogHelper.i(TAG, "[httpExchangeFailed] requestId: " + requestId + " error: " + s);
}
......@@ -39,20 +49,10 @@ public class NetworkInterpreter {
}
}
public void responseReadFailed(int requestId, String s) {
LogHelper.i(TAG, "[responseReadFailed] requestId: " + requestId + " error: " + s);
}
private static class Holder {
private static NetworkInterpreter INSTANCE = new NetworkInterpreter();
}
public static NetworkInterpreter get() {
return NetworkInterpreter.Holder.INSTANCE;
}
public int nextRequestId() {
return mNextRequestId.getAndIncrement();
}
......@@ -60,25 +60,22 @@ public class NetworkInterpreter {
public InputStream interpretResponseStream(
String contentType,
@Nullable InputStream availableInputStream,
ResponseHandler responseHandler) {
ResponseHandler responseHandler
) {
if (availableInputStream == null) {
responseHandler.onEOF(null);
return null;
}
ResourceType resourceType =
contentType != null ?
getResourceTypeHelper().determineResourceType(contentType) :
null;
ResourceType resourceType = contentType != null
? getResourceTypeHelper().determineResourceType(contentType)
: null;
if (resourceType != ResourceType.DOCUMENT && resourceType != ResourceType.XHR) {
responseHandler.onEOF(null);
return availableInputStream;
}
return new InputStreamProxy(
availableInputStream,
responseHandler);
return new InputStreamProxy(availableInputStream, responseHandler);
}
public NetworkRecord createRecord(int requestId, NetworkInterpreter.InspectorRequest request) {
NetworkRecord record = new NetworkRecord();
record.mRequestId = requestId;
......@@ -117,10 +114,8 @@ public class NetworkInterpreter {
record.responseLength = body.getBytes().length;
record.mResponseBody = body;
}
}
public void fetchResponseInfo(NetworkRecord record, NetworkInterpreter.InspectorResponse response) {
Response responseJSON = new Response();
responseJSON.url = response.url();
......@@ -156,8 +151,7 @@ public class NetworkInterpreter {
return builder.toString();
}
private String readBodyAsString(
NetworkInterpreter.InspectorRequest request) {
private String readBodyAsString(NetworkInterpreter.InspectorRequest request) {
try {
byte[] body = request.body();
if (body != null) {
......@@ -168,8 +162,7 @@ public class NetworkInterpreter {
return null;
}
private String readBodyAsString(
byte[] body) {
private String readBodyAsString(byte[] body) {
try {
if (body != null) {
return new String(body, Utf8Charset.INSTANCE);
......@@ -179,8 +172,7 @@ public class NetworkInterpreter {
return null;
}
private long readBodyLength(
NetworkInterpreter.InspectorRequest request) {
private long readBodyLength(NetworkInterpreter.InspectorRequest request) {
try {
byte[] body = request.body();
if (body != null) {
......@@ -191,8 +183,7 @@ public class NetworkInterpreter {
return 0;
}
private long readBodyLength(
byte[] body) {
private long readBodyLength(byte[] body) {
try {
if (body != null) {
return body.length;
......@@ -237,7 +228,6 @@ public class NetworkInterpreter {
String url();
}
public interface InspectorRequestCommon extends InspectorHeaders {
/**
* Unique identifier for this request. This identifier must be used in all other network
......@@ -245,7 +235,6 @@ public class NetworkInterpreter {
* WebSockets that have exhuasted the state machine to its final closed/finished state.
*/
int id();
}
public interface InspectorResponseCommon extends InspectorHeaders {
......@@ -255,7 +244,6 @@ public class NetworkInterpreter {
int requestId();
int statusCode();
}
public interface InspectorHeaders {
......
package com.didichuxing.doraemonkit.kit.network.okhttp.interceptor;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
......@@ -10,16 +11,13 @@ import com.didichuxing.doraemonkit.kit.network.bean.WhiteHostBean;
import com.didichuxing.doraemonkit.kit.network.core.DefaultResponseHandler;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import com.didichuxing.doraemonkit.kit.network.core.RequestBodyHelper;
import com.didichuxing.doraemonkit.kit.network.core.ResourceType;
import com.didichuxing.doraemonkit.kit.network.core.ResourceTypeHelper;
import com.didichuxing.doraemonkit.kit.network.okhttp.ForwardingResponseBody;
import com.didichuxing.doraemonkit.kit.network.okhttp.InterceptorUtil;
import com.didichuxing.doraemonkit.kit.network.okhttp.OkHttpInspectorRequest;
import com.didichuxing.doraemonkit.kit.network.okhttp.OkHttpInspectorResponse;
import com.didichuxing.doraemonkit.kit.network.utils.OkHttpResponseKt;
import com.didichuxing.doraemonkit.util.LogHelper;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
......@@ -39,9 +37,9 @@ public class DoraemonInterceptor implements Interceptor {
private final NetworkInterpreter mNetworkInterpreter = NetworkInterpreter.get();
@NotNull
@NonNull
@Override
public Response intercept(Chain chain) throws IOException {
public Response intercept(@NonNull Chain chain) throws IOException {
if (!NetworkManager.isActive()) {
Request request = chain.request();
try {
......@@ -110,6 +108,9 @@ public class DoraemonInterceptor implements Interceptor {
contentType != null ? contentType.toString() : null,
responseStream,
new DefaultResponseHandler(mNetworkInterpreter, requestId, record));
record.mResponseBody = OkHttpResponseKt.bodyContent(response);
LogHelper.d("http-monitor", "response body >>>\n" + record.mResponseBody);
if (responseStream != null) {
response = response.newBuilder()
.body(new ForwardingResponseBody(body, responseStream))
......
@file:RestrictTo(RestrictTo.Scope.LIBRARY)
package com.didichuxing.doraemonkit.kit.network.utils
import androidx.annotation.RestrictTo
import okhttp3.Response
import okio.Buffer
import okio.GzipSource
import java.nio.charset.Charset
internal fun Response.encoding() =
this.header("content-encoding") ?: this.header("Content-Encoding")
internal fun Response.charset(): Charset {
this.encoding()
?.takeIf { Charset.isSupported(it) }
?.also {
return Charset.forName(it)
}
return body()?.contentType()?.charset() ?: Charset.defaultCharset()
}
internal fun Response.bodyContent(): String = body()
?.let { body ->
val source = body.source()
.apply {
request(Long.MAX_VALUE)
}
var buffer = source.buffer
val encoding = encoding()
if ("gzip".equals(encoding, true)) {
GzipSource(buffer.clone()).use { gzippedBody ->
buffer = Buffer().also { it.writeAll(gzippedBody) }
}
}
buffer
}
?.clone()
?.readString(charset())
?: ""
......@@ -16,6 +16,9 @@ android.debug.obsoleteApi=true
android.useAndroidX=true
android.enableJetifier=true
android.injected.testOnly=false
kotlin.code.style=official
#dokit全局配置
#dokit 慢函数开关
DOKIT_METHOD_SWITCH=true
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册