提交 e1d41994 编写于 作者: J jackjintai

modify:

1、解决retrfit 在某些场景下会报错的问题
上级 41b9108f
......@@ -51,9 +51,6 @@ public class LargePictureManager {
private static LargePictureManager INSTANCE = new LargePictureManager();
}
private LargePictureManager() {
}
/**
* @param url
......
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import java.io.IOException;
import java.util.List;
/**
* 2019/3/14
* @desc: 对几个处理链的包装
*/
public class HttpChainFacade {
private final HttpRequestChain mHttpRequestChain;
private final HttpResponseChain mHttpResponseChain;
private final HttpRequestStreamChain mHttpRequestStreamChain;
private final HttpResponseStreamChain mHttpResponseStreamChain;
public HttpChainFacade(List<DKInterceptor> interceptors) {
mHttpRequestChain = new HttpRequestChain(interceptors);
mHttpResponseChain = new HttpResponseChain(interceptors);
mHttpRequestStreamChain = new HttpRequestStreamChain(interceptors);
mHttpResponseStreamChain = new HttpResponseStreamChain(interceptors);
}
public void process(HttpRequest request) throws IOException {
mHttpRequestChain.process(request);
}
public void process(HttpResponse response) throws IOException {
mHttpResponseChain.process(response);
}
public void processStream(HttpRequest request) throws IOException {
mHttpRequestStreamChain.process(request);
}
public void processStream(HttpResponse response) throws IOException {
mHttpResponseStreamChain.process(response);
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
import android.util.Log;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Map;
/**
* 2019/3/12
* @desc: 请求结构体
*/
public class HttpRequest {
private static final String TAG = "HttpRequest";
private final HttpURLConnection mURLConnection;
private OutputStream mOutputStream;
public HttpRequest(HttpURLConnection urlConnection) {
mURLConnection = urlConnection;
}
public String getUrl(){
return mURLConnection.getURL().toString();
}
public String getMethod(){
return mURLConnection.getRequestMethod();
}
public OutputStream getOutputStream() {
return mOutputStream;
}
public Map<String, List<String>> getHeaders() {
// connect参数不知道什么会被置为true,以防崩溃,这里直接try-catch住
try {
return mURLConnection.getRequestProperties();
} catch (Exception e) {
Log.d(TAG, "get head exception", e);
return null;
}
}
public void setOutputStream(OutputStream outputStream) {
mOutputStream = outputStream;
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
import android.util.Log;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Map;
/**
* 2019/3/12
* @desc: 响应体
*/
public class HttpResponse {
private final String TAG = "HttpResponse";
private final HttpURLConnection mURLConnection;
private int mStatusCode;
private InputStream mInputStream;
public HttpResponse(HttpURLConnection urlConnection) {
mURLConnection = urlConnection;
}
public int getStatusCode() {
return mStatusCode;
}
public void setStatusCode(int statusCode) {
mStatusCode = statusCode;
}
public InputStream getInputStream() {
return mInputStream;
}
public void setInputStream(InputStream inputStream) {
mInputStream = inputStream;
}
public String getUrl() {
return mURLConnection.getURL().toString();
}
public Map<String, List<String>> getHeaders() {
try {
return mURLConnection.getHeaderFields();
} catch (Exception e) {
Log.d(TAG, "get head exception", e);
return null;
}
}
public String getHeaderField(String key) {
Map<String, List<String>> map = getHeaders();
if (map == null) {
return null;
}
List<String> fields = map.get(key);
if (fields == null || fields.size() == 0) {
return null;
}
return fields.get(fields.size() - 1);
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import java.io.IOException;
import java.util.List;
/**
* 请求处理链
*/
public class HttpRequestChain extends InterceptorChain<HttpRequest, DKInterceptor> {
@Override
protected void processNext(HttpRequest source, List<DKInterceptor> interceptors, int index) throws IOException {
DKInterceptor interceptor = interceptors.get(index);
if (interceptor != null) {
index++;
interceptor.intercept(this, source);
}
}
public HttpRequestChain(List<DKInterceptor> interceptors) {
this(interceptors, 0);
}
public HttpRequestChain(List<DKInterceptor> interceptors,
int index) {
super(interceptors, index);
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import java.io.IOException;
import java.util.List;
/**
* 请求body处理链
*/
public class HttpRequestStreamChain extends InterceptorChain<HttpRequest, DKInterceptor> {
@Override
protected void processNext(HttpRequest source, List<DKInterceptor> interceptors, int index) throws IOException {
DKInterceptor interceptor = interceptors.get(index);
if (interceptor != null) {
index++;
interceptor.intercept(this, source);
}
}
public HttpRequestStreamChain(List<DKInterceptor> interceptors) {
this(interceptors, 0);
}
public HttpRequestStreamChain(List<DKInterceptor> interceptors,
int index) {
super(interceptors, index);
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import java.io.IOException;
import java.util.List;
/**
* 2019/3/11
* @desc: 响应处理链,不包含响应body
*/
public class HttpResponseChain extends InterceptorChain<HttpResponse, DKInterceptor> {
public HttpResponseChain(List<DKInterceptor> interceptors) {
super(interceptors);
}
public HttpResponseChain(List<DKInterceptor> interceptors, int index) {
super(interceptors, index);
}
@Override
protected void processNext(HttpResponse response, List<DKInterceptor> interceptors,
int index) throws IOException {
DKInterceptor interceptor = interceptors.get(index);
if (interceptor != null) {
index++;
interceptor.intercept(this, response);
}
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import java.io.IOException;
import java.util.List;
/**
* 2019/3/11
* @desc: 响应body处理链
*/
public class HttpResponseStreamChain extends InterceptorChain<HttpResponse, DKInterceptor> {
public HttpResponseStreamChain(List<DKInterceptor> interceptors) {
super(interceptors);
}
public HttpResponseStreamChain(List<DKInterceptor> interceptors, int index) {
super(interceptors, index);
}
@Override
protected void processNext(HttpResponse response, List<DKInterceptor> interceptors,
int index) throws IOException {
DKInterceptor interceptor = interceptors.get(index);
if (interceptor != null) {
index++;
interceptor.intercept(this, response);
}
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import java.io.IOException;
import java.util.List;
public abstract class InterceptorChain<T, I extends DKInterceptor> {
protected List<I> mInterceptors;
protected int mIndex;
protected abstract void processNext(T buffer, List<I> interceptors, int index)
throws IOException;
public InterceptorChain(List<I> interceptors) {
this(interceptors, 0);
}
public InterceptorChain(List<I> interceptors, int index) {
this.mInterceptors = interceptors;
this.mIndex = index;
}
public void processFinal(T source) throws IOException {
// mSource.process(buffer);
}
public void process(T source) throws IOException {
if (mIndex >= mInterceptors.size()) {
processFinal(source);
} else {
processNext(source, mInterceptors, mIndex++);
}
}
}
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import android.util.Pair;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import java.util.ArrayList;
public class URLConnectionInspectorHeaders implements NetworkInterpreter.InspectorHeaders {
private final ArrayList<Pair<String, String>> mHeaders;
public URLConnectionInspectorHeaders(ArrayList<Pair<String, String>> headers) {
mHeaders = headers;
}
@Override
public int headerCount() {
return mHeaders.size();
}
@Override
public String headerName(int index) {
return mHeaders.get(index).first;
}
@Override
public String headerValue(int index) {
return mHeaders.get(index).second;
}
@Override
public String firstHeaderValue(String name) {
int N = headerCount();
for (int i = 0; i < N; i++) {
if (name.equalsIgnoreCase(headerName(i))) {
return headerValue(i);
}
}
return null;
}
}
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import androidx.annotation.Nullable;
import android.util.Pair;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import java.io.IOException;
import java.util.ArrayList;
public class URLConnectionInspectorRequest
extends URLConnectionInspectorHeaders
implements NetworkInterpreter.InspectorRequest {
private final int mRequestId;
private final String mUrl;
private final String mMethod;
public URLConnectionInspectorRequest(
int requestId,
ArrayList<Pair<String, String>> header,
String url,
String method) {
super(header);
mRequestId = requestId;
mUrl = url;
mMethod = method;
}
@Override
public int id() {
return mRequestId;
}
@Override
public String url() {
return mUrl;
}
@Override
public String method() {
return mMethod;
}
@Nullable
@Override
public byte[] body() throws IOException {
return null;
}
}
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import android.util.Pair;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import java.util.ArrayList;
public class URLConnectionInspectorResponse
extends URLConnectionInspectorHeaders
implements NetworkInterpreter.InspectorResponse {
private final int mRequestId;
private final String mUrl;
private final int mStatusCode;
public URLConnectionInspectorResponse(int requestId, ArrayList<Pair<String, String>> header, String url, int statusCode) {
super(header);
mRequestId = requestId;
mUrl = url;
mStatusCode = statusCode;
}
@Override
public int requestId() {
return mRequestId;
}
@Override
public String url() {
return mUrl;
}
@Override
public int statusCode() {
return mStatusCode;
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseStreamChain;
import java.io.IOException;
/**
*/
public interface DKInterceptor<T, S> {
/**
* 拦截请求,处理header、method之类的信息
* @param chain
* @param request
* @throws IOException
*/
void intercept(@NonNull HttpRequestChain chain, @NonNull T request) throws IOException;
/**
* 拦截响应,处理header、statusCode之类的信息
* @param chain
* @param response
* @throws IOException
*/
void intercept(@NonNull HttpResponseChain chain, @NonNull S response) throws IOException;
/**
* 拦截请求流,用以对post body做处理
* @param chain
* @param request
* @throws IOException
*/
void intercept(@NonNull HttpRequestStreamChain chain, @NonNull T request) throws IOException;
/**
* 拦截响应流,用以对返回值做处理
* @param chain
* @param response
* @throws IOException
*/
void intercept(@NonNull HttpResponseStreamChain chain, @NonNull S response) throws IOException;
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor;
import android.util.Pair;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
import com.didichuxing.doraemonkit.kit.network.core.DefaultResponseHandler;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector.URLConnectionInspectorRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector.URLConnectionInspectorResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseStreamChain;
import com.didichuxing.doraemonkit.kit.network.stream.HttpOutputStreamProxy;
import com.didichuxing.doraemonkit.kit.network.stream.OutputStreamProxy;
import com.didichuxing.doraemonkit.kit.network.utils.StreamUtil;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
/**
* @desc: 监听HttpUrlConnection数据的拦截器
*/
public class HttpMonitorInterceptor implements DKInterceptor<HttpRequest, HttpResponse> {
private final NetworkInterpreter mInterpreter;
private final int mId;
public HttpMonitorInterceptor() {
mInterpreter = NetworkInterpreter.get();
mId = NetworkInterpreter.get().nextRequestId();
}
@Override
public void intercept(@NonNull HttpRequestChain chain, @NonNull HttpRequest request) throws IOException {
int requestId = mId;
if (NetworkManager.get().getRecord(requestId) != null) {
chain.process(request);
return;
}
ArrayList<Pair<String, String>> header = StreamUtil.convertHeaders(request.getHeaders());
URLConnectionInspectorRequest inspectorRequest = new URLConnectionInspectorRequest(
requestId,
header,
request.getUrl(),
request.getMethod());
mInterpreter.createRecord(requestId, inspectorRequest);
chain.process(request);
}
@Override
public void intercept(@NonNull HttpResponseChain chain, @NonNull HttpResponse response) throws IOException {
int id = mId;
NetworkRecord record = NetworkManager.get().getRecord(id);
if (record == null) {
chain.process(response);
return;
}
ArrayList<Pair<String, String>> header = StreamUtil.convertHeaders(response.getHeaders());
URLConnectionInspectorResponse urlConnectionInspectorResponse = new URLConnectionInspectorResponse(
mId,
header,
response.getUrl(),
response.getStatusCode());
mInterpreter.fetchResponseInfo(record, urlConnectionInspectorResponse);
chain.process(response);
}
@Override
public void intercept(@NonNull HttpRequestStreamChain chain, @NonNull HttpRequest request) throws IOException {
int id = mId;
NetworkRecord record = NetworkManager.get().getRecord(id);
if (record == null) {
chain.process(request);
return;
}
OutputStreamProxy outputStream = new HttpOutputStreamProxy(request.getOutputStream(), mId, mInterpreter);
request.setOutputStream(outputStream);
chain.process(request);
}
@Override
public void intercept(@NonNull HttpResponseStreamChain chain, @NonNull HttpResponse response) throws IOException {
int id = mId;
NetworkRecord record = NetworkManager.get().getRecord(id);
if (record == null) {
chain.process(response);
return;
}
InputStream responseStream = mInterpreter.interpretResponseStream(
response.getHeaderField("Content-Type"),
response.getInputStream(),
new DefaultResponseHandler(mInterpreter, id, record));
response.setInputStream(responseStream);
chain.process(response);
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor;
import androidx.annotation.NonNull;
import android.text.TextUtils;
import com.didichuxing.doraemonkit.kit.largepicture.LargePictureManager;
import com.didichuxing.doraemonkit.kit.network.core.ResourceType;
import com.didichuxing.doraemonkit.kit.network.core.ResourceTypeHelper;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseStreamChain;
import java.io.IOException;
/**
* @desc: 大图拦截器
*/
public class LargePictureInterceptor implements DKInterceptor<HttpRequest, HttpResponse> {
public static final String TAG = "LargePictureInterceptor";
public LargePictureInterceptor() {
}
private ResourceTypeHelper mResourceTypeHelper;
@Override
public void intercept(@NonNull HttpRequestChain chain, @NonNull HttpRequest request) throws IOException {
chain.process(request);
}
@Override
public void intercept(@NonNull HttpResponseChain chain, @NonNull HttpResponse response) throws IOException {
String contentType = response.getHeaderField("Content-Type");
ResourceType resourceType =
contentType != null ?
getResourceTypeHelper().determineResourceType(contentType) :
null;
if (resourceType == ResourceType.IMAGE) {
processResponse(response);
}
chain.process(response);
}
@Override
public void intercept(@NonNull HttpRequestStreamChain chain, @NonNull HttpRequest request) throws IOException {
chain.process(request);
}
@Override
public void intercept(@NonNull HttpResponseStreamChain chain, @NonNull HttpResponse response) throws IOException {
chain.process(response);
}
private ResourceTypeHelper getResourceTypeHelper() {
if (mResourceTypeHelper == null) {
mResourceTypeHelper = new ResourceTypeHelper();
}
return mResourceTypeHelper;
}
private void processResponse(HttpResponse response) {
String field = response.getHeaderField("Content-Length");
if (!TextUtils.isEmpty(field)) {
LargePictureManager.getInstance().process(response.getUrl(), Integer.parseInt(field));
}
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.kit.network.core.ResourceTypeHelper;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpRequestStreamChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseChain;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.chain.HttpResponseStreamChain;
import com.didichuxing.doraemonkit.okgo.DokitOkGo;
import java.io.IOException;
import okhttp3.HttpUrl;
/**
* @author jintai
* @desc: 接口mock拦截器
*/
public class MockInterceptor implements DKInterceptor<HttpRequest, HttpResponse> {
public static final String TAG = "MockInterceptor";
public MockInterceptor() {
}
private ResourceTypeHelper mResourceTypeHelper;
@Override
public void intercept(@NonNull HttpRequestChain chain, @NonNull HttpRequest oldRequest) throws IOException {
chain.process(oldRequest);
}
/**
* 命中拦截
*
* @param chain
* @param response
* @throws IOException
*/
@Override
public void intercept(@NonNull HttpResponseChain chain, @NonNull HttpResponse response) throws IOException {
try {
httpProxy(response);
} catch (Exception e) {
e.printStackTrace();
}
chain.process(response);
}
@Override
public void intercept(@NonNull HttpRequestStreamChain chain, @NonNull HttpRequest request) throws IOException {
chain.process(request);
}
@Override
public void intercept(@NonNull HttpResponseStreamChain chain, @NonNull HttpResponse response) throws IOException {
try {
httpProxy(response);
} catch (Exception e) {
e.printStackTrace();
}
chain.process(response);
}
/**
* 将HttpUrlConnection请求代理成OkHttp发送
*
* @param httpResponse
* @throws Exception
*/
private void httpProxy(HttpResponse httpResponse) throws Exception {
HttpUrl mockUrl = HttpUrl.parse(httpResponse.getUrl());
if (mockUrl != null) {
HttpUrl originUrl = HttpUrl.parse(mockUrl.queryParameter("originUrl"));
if (originUrl != null) {
//用okhttp代理发送
DokitOkGo.<String>get(originUrl.toString()).execute();
}
}
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.proxy;
import android.util.Log;
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpChainFacade;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpMonitorInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.LargePictureInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.MockInterceptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @desc: UrlConnection代理类,用以解析请求
*/
public class HttpUrlConnectionProxy extends HttpURLConnection {
private final String TAG = "HttpUrlConnectionProxy";
private final boolean DEBUG = true;
private final HttpURLConnection mSourceConnection;
private List<DKInterceptor> mInterceptors = new ArrayList<>();
private final HttpRequest mHttpRequest;
private final HttpResponse mHttpResponse;
private final HttpChainFacade mHttpChainFacade;
public HttpUrlConnectionProxy(HttpURLConnection con, boolean isMock) {
super(con.getURL());
mSourceConnection = con;
//mock
if (isMock) {
mInterceptors.add(new MockInterceptor());
}
if (NetworkManager.isActive()) {
mInterceptors.add(new HttpMonitorInterceptor());
//https的大图检测拦截器
mInterceptors.add(new LargePictureInterceptor());
}
mHttpRequest = new HttpRequest(con);
mHttpResponse = new HttpResponse(con);
mHttpChainFacade = new HttpChainFacade(mInterceptors);
}
@Override
public void addRequestProperty(String field, String newValue) {
mSourceConnection.addRequestProperty(field, newValue);
}
@Override
public void disconnect() {
if (DEBUG) {
Log.d(TAG, "disconnect. ");
}
mSourceConnection.disconnect();
}
@Override
public boolean usingProxy() {
return mSourceConnection.usingProxy();
}
@Override
public void connect() throws IOException {
preConnect();
try {
mSourceConnection.connect();
} catch (IOException e) {
throw e;
}
}
/**
*
*/
public void preConnect() throws IOException {
mHttpChainFacade.process(mHttpRequest);
}
public void postConnect(int statusCode) throws IOException {
mHttpResponse.setStatusCode(statusCode);
mHttpChainFacade.process(mHttpResponse);
}
@Override
public boolean getAllowUserInteraction() {
return mSourceConnection.getAllowUserInteraction();
}
@Override
public int getConnectTimeout() {
return mSourceConnection.getConnectTimeout();
}
@Override
public Object getContent() throws IOException {
return mSourceConnection.getContent();
}
@SuppressWarnings("rawtypes")
@Override
public Object getContent(Class[] types) throws IOException {
return mSourceConnection.getContent(types);
}
@Override
public String getContentEncoding() {
return mSourceConnection.getContentEncoding();
}
@Override
public int getContentLength() {
return mSourceConnection.getContentLength();
}
@Override
public String getContentType() {
return mSourceConnection.getContentType();
}
@Override
public long getDate() {
return mSourceConnection.getDate();
}
@Override
public InputStream getErrorStream() {
return mSourceConnection.getErrorStream();
}
@Override
public long getHeaderFieldDate(String field, long defaultValue) {
return mSourceConnection.getHeaderFieldDate(field, defaultValue);
}
@Override
public boolean getInstanceFollowRedirects() {
return mSourceConnection.getInstanceFollowRedirects();
}
@Override
public java.security.Permission getPermission() throws IOException {
return mSourceConnection.getPermission();
}
@Override
public String getRequestMethod() {
return mSourceConnection.getRequestMethod();
}
@Override
public int getResponseCode() throws IOException {
preConnect();
int code = mSourceConnection.getResponseCode();
postConnect(code);
return code;
}
@Override
public String getResponseMessage() throws IOException {
return mSourceConnection.getResponseMessage();
}
@Override
public void setChunkedStreamingMode(int chunkLength) {
mSourceConnection.setChunkedStreamingMode(chunkLength);
}
@Override
public void setFixedLengthStreamingMode(int contentLength) {
mSourceConnection.setFixedLengthStreamingMode(contentLength);
}
@Override
public void setInstanceFollowRedirects(boolean followRedirects) {
mSourceConnection.setInstanceFollowRedirects(followRedirects);
}
@Override
public void setRequestMethod(String method) throws ProtocolException {
mSourceConnection.setRequestMethod(method);
}
@Override
public boolean getDefaultUseCaches() {
return mSourceConnection.getDefaultUseCaches();
}
@Override
public boolean getDoInput() {
return mSourceConnection.getDoInput();
}
@Override
public boolean getDoOutput() {
return mSourceConnection.getDoOutput();
}
@Override
public long getExpiration() {
return mSourceConnection.getExpiration();
}
@Override
public String getHeaderField(int pos) {
return mSourceConnection.getHeaderField(pos);
}
@Override
public String getHeaderField(String key) {
return mSourceConnection.getHeaderField(key);
}
@Override
public int getHeaderFieldInt(String field, int defaultValue) {
return mSourceConnection.getHeaderFieldInt(field, defaultValue);
}
@Override
public String getHeaderFieldKey(int paramInt) {
return mSourceConnection.getHeaderFieldKey(paramInt);
}
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Map<String, List<String>> getHeaderFields() {
return mSourceConnection.getRequestProperties();
}
@Override
public long getIfModifiedSince() {
return mSourceConnection.getIfModifiedSince();
}
@Override
public InputStream getInputStream() throws IOException {
mHttpResponse.setInputStream(mSourceConnection.getInputStream());
mHttpChainFacade.processStream(mHttpResponse);
return mHttpResponse.getInputStream();
}
@Override
public long getLastModified() {
return mSourceConnection.getLastModified();
}
@Override
public OutputStream getOutputStream() throws IOException {
mHttpRequest.setOutputStream(mSourceConnection.getOutputStream());
mHttpChainFacade.processStream(mHttpRequest);
return mHttpRequest.getOutputStream();
}
@Override
public int getReadTimeout() {
return mSourceConnection.getReadTimeout();
}
@Override
public Map<String, List<String>> getRequestProperties() {
return mSourceConnection.getRequestProperties();
}
@Override
public String getRequestProperty(String field) {
return mSourceConnection.getRequestProperty(field);
}
@Override
public URL getURL() {
return mSourceConnection.getURL();
}
@Override
public boolean getUseCaches() {
return mSourceConnection.getUseCaches();
}
@Override
public void setAllowUserInteraction(boolean newValue) {
mSourceConnection.setAllowUserInteraction(newValue);
}
@Override
public void setConnectTimeout(int timeout) {
mSourceConnection.setConnectTimeout(timeout);
}
@Override
public void setDefaultUseCaches(boolean newValue) {
mSourceConnection.setDefaultUseCaches(newValue);
}
@Override
public void setDoInput(boolean newValue) {
mSourceConnection.setDoInput(newValue);
}
@Override
public void setDoOutput(boolean newValue) {
mSourceConnection.setDoOutput(newValue);
}
@Override
public void setIfModifiedSince(long newValue) {
mSourceConnection.setIfModifiedSince(newValue);
}
@Override
public void setReadTimeout(int timeout) {
mSourceConnection.setReadTimeout(timeout);
}
@Override
public void setRequestProperty(String field, String newValue) {
mSourceConnection.setRequestProperty(field, newValue);
}
@Override
public void setUseCaches(boolean newValue) {
mSourceConnection.setUseCaches(newValue);
}
@Override
public String toString() {
if (mSourceConnection == null) {
return "this connection object is null";
} else {
return mSourceConnection.toString();
}
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.proxy;
import android.util.Log;
import com.didichuxing.doraemonkit.kit.network.NetworkManager;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpMonitorInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.LargePictureInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpChainFacade;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.MockInterceptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ProtocolException;
import java.net.URL;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
/**
* @desc: UrlConnection代理类,用以解析请求
*/
public class HttpsUrlConnectionProxy extends HttpsURLConnection {
private final String TAG = "HttpUrlConnectionProxy";
private final boolean DEBUG = true;
private final HttpsURLConnection mSourceConnection;
private List<DKInterceptor> mInterceptors = new ArrayList<>();
private final HttpRequest mHttpRequest;
private final HttpResponse mHttpResponse;
private final HttpChainFacade mHttpChainFacade;
public HttpsUrlConnectionProxy(HttpsURLConnection con, boolean isMock) {
super(con.getURL());
mSourceConnection = con;
//mock
if (isMock) {
mInterceptors.add(new MockInterceptor());
}
if (NetworkManager.isActive()) {
mInterceptors.add(new HttpMonitorInterceptor());
//https的大图检测拦截器
mInterceptors.add(new LargePictureInterceptor());
}
mHttpRequest = new HttpRequest(con);
mHttpResponse = new HttpResponse(con);
mHttpChainFacade = new HttpChainFacade(mInterceptors);
}
@Override
public String getCipherSuite() {
return mSourceConnection.getCipherSuite();
}
@Override
public Certificate[] getLocalCertificates() {
return mSourceConnection.getLocalCertificates();
}
@Override
public Certificate[] getServerCertificates() throws SSLPeerUnverifiedException {
return mSourceConnection.getServerCertificates();
}
@Override
public void addRequestProperty(String field, String newValue) {
mSourceConnection.addRequestProperty(field, newValue);
}
@Override
public void disconnect() {
if (DEBUG) {
Log.d(TAG, "disconnect. ");
}
mSourceConnection.disconnect();
}
@Override
public boolean usingProxy() {
return mSourceConnection.usingProxy();
}
@Override
public void connect() throws IOException {
preConnect();
try {
mSourceConnection.connect();
} catch (IOException e) {
throw e;
}
}
/**
*
*/
public void preConnect() throws IOException {
mHttpChainFacade.process(mHttpRequest);
}
public void postConnect(int statusCode) throws IOException {
mHttpResponse.setStatusCode(statusCode);
mHttpChainFacade.process(mHttpResponse);
}
@Override
public boolean getAllowUserInteraction() {
return mSourceConnection.getAllowUserInteraction();
}
@Override
public int getConnectTimeout() {
return mSourceConnection.getConnectTimeout();
}
@Override
public Object getContent() throws IOException {
return mSourceConnection.getContent();
}
@SuppressWarnings("rawtypes")
@Override
public Object getContent(Class[] types) throws IOException {
return mSourceConnection.getContent(types);
}
@Override
public String getContentEncoding() {
return mSourceConnection.getContentEncoding();
}
@Override
public int getContentLength() {
return mSourceConnection.getContentLength();
}
@Override
public String getContentType() {
return mSourceConnection.getContentType();
}
@Override
public long getDate() {
return mSourceConnection.getDate();
}
@Override
public InputStream getErrorStream() {
return mSourceConnection.getErrorStream();
}
@Override
public long getHeaderFieldDate(String field, long defaultValue) {
return mSourceConnection.getHeaderFieldDate(field, defaultValue);
}
@Override
public boolean getInstanceFollowRedirects() {
return mSourceConnection.getInstanceFollowRedirects();
}
@Override
public java.security.Permission getPermission() throws IOException {
return mSourceConnection.getPermission();
}
@Override
public String getRequestMethod() {
return mSourceConnection.getRequestMethod();
}
@Override
public int getResponseCode() throws IOException {
preConnect();
int code = mSourceConnection.getResponseCode();
postConnect(code);
return code;
}
@Override
public String getResponseMessage() throws IOException {
return mSourceConnection.getResponseMessage();
}
@Override
public void setChunkedStreamingMode(int chunkLength) {
mSourceConnection.setChunkedStreamingMode(chunkLength);
}
@Override
public void setFixedLengthStreamingMode(int contentLength) {
mSourceConnection.setFixedLengthStreamingMode(contentLength);
}
@Override
public void setInstanceFollowRedirects(boolean followRedirects) {
mSourceConnection.setInstanceFollowRedirects(followRedirects);
}
@Override
public void setRequestMethod(String method) throws ProtocolException {
mSourceConnection.setRequestMethod(method);
}
@Override
public boolean getDefaultUseCaches() {
return mSourceConnection.getDefaultUseCaches();
}
@Override
public boolean getDoInput() {
return mSourceConnection.getDoInput();
}
@Override
public boolean getDoOutput() {
return mSourceConnection.getDoOutput();
}
@Override
public long getExpiration() {
return mSourceConnection.getExpiration();
}
@Override
public String getHeaderField(int pos) {
return mSourceConnection.getHeaderField(pos);
}
@Override
public String getHeaderField(String key) {
return mSourceConnection.getHeaderField(key);
}
@Override
public int getHeaderFieldInt(String field, int defaultValue) {
return mSourceConnection.getHeaderFieldInt(field, defaultValue);
}
@Override
public String getHeaderFieldKey(int paramInt) {
return mSourceConnection.getHeaderFieldKey(paramInt);
}
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Map<String, List<String>> getHeaderFields() {
return mSourceConnection.getHeaderFields();
}
@Override
public long getIfModifiedSince() {
return mSourceConnection.getIfModifiedSince();
}
@Override
public InputStream getInputStream() throws IOException {
mHttpResponse.setInputStream(mSourceConnection.getInputStream());
mHttpChainFacade.processStream(mHttpResponse);
return mHttpResponse.getInputStream();
}
@Override
public long getLastModified() {
return mSourceConnection.getLastModified();
}
@Override
public OutputStream getOutputStream() throws IOException {
mHttpRequest.setOutputStream(mSourceConnection.getOutputStream());
mHttpChainFacade.processStream(mHttpRequest);
return mHttpRequest.getOutputStream();
}
@Override
public int getReadTimeout() {
return mSourceConnection.getReadTimeout();
}
@Override
public Map<String, List<String>> getRequestProperties() {
return mSourceConnection.getRequestProperties();
}
@Override
public String getRequestProperty(String field) {
return mSourceConnection.getRequestProperty(field);
}
@Override
public URL getURL() {
return mSourceConnection.getURL();
}
@Override
public boolean getUseCaches() {
return mSourceConnection.getUseCaches();
}
@Override
public void setAllowUserInteraction(boolean newValue) {
mSourceConnection.setAllowUserInteraction(newValue);
}
@Override
public void setConnectTimeout(int timeout) {
mSourceConnection.setConnectTimeout(timeout);
}
@Override
public void setDefaultUseCaches(boolean newValue) {
mSourceConnection.setDefaultUseCaches(newValue);
}
@Override
public void setDoInput(boolean newValue) {
mSourceConnection.setDoInput(newValue);
}
@Override
public void setDoOutput(boolean newValue) {
mSourceConnection.setDoOutput(newValue);
}
@Override
public void setIfModifiedSince(long newValue) {
mSourceConnection.setIfModifiedSince(newValue);
}
@Override
public void setReadTimeout(int timeout) {
mSourceConnection.setReadTimeout(timeout);
}
@Override
public void setRequestProperty(String field, String newValue) {
mSourceConnection.setRequestProperty(field, newValue);
}
@Override
public void setUseCaches(boolean newValue) {
mSourceConnection.setUseCaches(newValue);
}
@Override
public String toString() {
if (mSourceConnection == null) {
return "this connection object is null";
} else {
return mSourceConnection.toString();
}
}
}
......@@ -3,6 +3,7 @@ package com.didichuxing.doraemonkit.kit.network.okhttp.interceptor;
import android.text.TextUtils;
import com.didichuxing.doraemonkit.config.PerformanceSpInfoConfig;
import com.didichuxing.doraemonkit.kit.largepicture.LargePictureManager;
import com.didichuxing.doraemonkit.kit.network.okhttp.InterceptorUtil;
......@@ -26,7 +27,9 @@ public class LargePictureInterceptor implements Interceptor {
String contentType = response.header("Content-Type");
if (InterceptorUtil.isImg(contentType)) {
processResponse(response);
if (PerformanceSpInfoConfig.isLargeImgOpen()) {
processResponse(response);
}
}
return response;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册