提交 52a34174 编写于 作者: 糕冷羊's avatar 糕冷羊

update 网络库优化

上级 ce3f68e2
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
import android.support.annotation.NonNull;
import android.util.Log;
import android.util.Pair;
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.inspector.URLConnectionInspectorRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector.URLConnectionInspectorResponse;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpRequest;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpRequestChain;
......@@ -21,55 +22,51 @@ import com.didichuxing.doraemonkit.kit.network.utils.StreamUtil;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.ArrayList;
/**
* @desc: 监听HttpUrlConnection数据的拦截器
*/
public class HttpMonitorInterceptor implements DKInterceptor<HttpRequest, HttpResponse> {
private static final String TAG = "HeaderParseInterceptor";
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 = request.getId();
int requestId = mId;
if (NetworkManager.get().getRecord(requestId) != null) {
chain.process(request);
return;
}
HttpURLConnection connection = request.getURLConnection();
ArrayList<Pair<String, String>> header;
// connect参数不知道什么会被置为true,以防崩溃,这里直接try-catch住
try {
header = StreamUtil.convertHeaders(connection.getRequestProperties());
} catch (Exception e) {
Log.e(TAG, "get head exception", e);
header = new ArrayList<>();
}
ArrayList<Pair<String, String>> header = StreamUtil.convertHeaders(request.getHeaders());
URLConnectionInspectorRequest inspectorRequest = new URLConnectionInspectorRequest(
requestId,
header,
connection);
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 = response.getId();
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(
response.getId(),
response.getURLConnection(),
mId,
header,
response.getUrl(),
response.getStatusCode());
mInterpreter.fetchResponseInfo(record, urlConnectionInspectorResponse);
chain.process(response);
......@@ -77,21 +74,27 @@ public class HttpMonitorInterceptor implements DKInterceptor<HttpRequest, HttpRe
@Override
public void intercept(@NonNull HttpRequestStreamChain chain, @NonNull HttpRequest request) throws IOException {
OutputStreamProxy outputStream = new HttpOutputStreamProxy(request.getOutputStream(), request.getId(), mInterpreter);
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 = response.getId();
int id = mId;
NetworkRecord record = NetworkManager.get().getRecord(id);
if (record == null) {
chain.process(response);
return;
}
HttpURLConnection connection = response.getURLConnection();
InputStream responseStream = mInterpreter.interpretResponseStream(
connection.getHeaderField("Content-Type"),
response.getHeaderField("Content-Type"),
response.getInputStream(),
new DefaultResponseHandler(mInterpreter, id, record));
response.setInputStream(responseStream);
......
......@@ -7,7 +7,7 @@
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import android.util.Pair;
......@@ -16,35 +16,35 @@ 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);
}
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;
}
return null;
}
}
......@@ -7,7 +7,7 @@
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import android.support.annotation.Nullable;
import android.util.Pair;
......@@ -15,7 +15,6 @@ import android.util.Pair;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
......@@ -29,11 +28,12 @@ public class URLConnectionInspectorRequest
public URLConnectionInspectorRequest(
int requestId,
ArrayList<Pair<String, String>> header,
HttpURLConnection configuredRequest) {
String url,
String method) {
super(header);
mRequestId = requestId;
mUrl = configuredRequest.getURL().toString();
mMethod = configuredRequest.getRequestMethod();
mUrl = url;
mMethod = method;
}
......@@ -55,6 +55,6 @@ public class URLConnectionInspectorRequest
@Nullable
@Override
public byte[] body() throws IOException {
return null;
return null;
}
}
......@@ -7,13 +7,13 @@
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.inspector;
import android.util.Pair;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import com.didichuxing.doraemonkit.kit.network.utils.StreamUtil;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
public class URLConnectionInspectorResponse
extends URLConnectionInspectorHeaders
......@@ -22,10 +22,10 @@ public class URLConnectionInspectorResponse
private final String mUrl;
private final int mStatusCode;
public URLConnectionInspectorResponse(int requestId, HttpURLConnection conn, int statusCode) throws IOException {
super(StreamUtil.convertHeaders(conn.getHeaderFields()));
public URLConnectionInspectorResponse(int requestId, ArrayList<Pair<String, String>> header, String url, int statusCode) {
super(header);
mRequestId = requestId;
mUrl = conn.getURL().toString();
mUrl = url;
mStatusCode = statusCode;
}
......@@ -43,5 +43,4 @@ public class URLConnectionInspectorResponse
public int statusCode() {
return mStatusCode;
}
}
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor;
import android.util.Log;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Map;
/**
* @date: 2019/3/12
* @desc: 请求结构体
*/
public class HttpRequest {
private final int mId;
private static final String TAG = "HttpRequest";
private final HttpURLConnection mURLConnection;
private OutputStream mOutputStream;
public HttpRequest(int id, HttpURLConnection urlConnection) {
public HttpRequest(HttpURLConnection urlConnection) {
mURLConnection = urlConnection;
mId = id;
}
public HttpURLConnection getURLConnection() {
return mURLConnection;
public String getUrl(){
return mURLConnection.getURL().toString();
}
public int getId() {
return mId;
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.interceptor;
import android.util.Log;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Map;
/**
* @date: 2019/3/12
* @desc: 响应体
*/
public class HttpResponse {
private final int mId;
private final String TAG = "HttpResponse";
private final HttpURLConnection mURLConnection;
private int mStatusCode;
private InputStream mInputStream;
public HttpResponse(int id, HttpURLConnection urlConnection) {
public HttpResponse(HttpURLConnection urlConnection) {
mURLConnection = urlConnection;
mId = id;
}
public HttpURLConnection getURLConnection() {
return mURLConnection;
}
public int getId() {
return mId;
}
public int getStatusCode() {
......@@ -41,4 +36,29 @@ public class HttpResponse {
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;
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.proxy;
import android.util.Log;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpMonitorInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpChainFacade;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpRequest;
......@@ -37,11 +37,10 @@ public class HttpUrlConnectionProxy extends HttpURLConnection {
mSourceConnection = con;
mInterceptors.add(new HttpMonitorInterceptor());
// mInterceptors.add(new LargePictureInterceptor());
NetworkInterpreter mInterpreter = NetworkInterpreter.get();
int requestId = mInterpreter.nextRequestId();
mHttpRequest = new HttpRequest(requestId, con);
mHttpResponse = new HttpResponse(requestId, con);
mHttpRequest = new HttpRequest(con);
mHttpResponse = new HttpResponse(con);
mHttpChainFacade = new HttpChainFacade(mInterceptors);
}
......@@ -229,7 +228,7 @@ public class HttpUrlConnectionProxy extends HttpURLConnection {
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Map<String, List<String>> getHeaderFields() {
return mSourceConnection.getHeaderFields();
return mSourceConnection.getRequestProperties();
}
@Override
......
package com.didichuxing.doraemonkit.kit.network.httpurlconnection;
package com.didichuxing.doraemonkit.kit.network.httpurlconnection.proxy;
import android.util.Log;
import com.didichuxing.doraemonkit.kit.network.core.NetworkInterpreter;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.HttpMonitorInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.DKInterceptor;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpChainFacade;
import com.didichuxing.doraemonkit.kit.network.httpurlconnection.interceptor.HttpRequest;
......@@ -41,10 +41,8 @@ public class HttpsUrlConnectionProxy extends HttpsURLConnection {
mInterceptors.add(new HttpMonitorInterceptor());
NetworkInterpreter mInterpreter = NetworkInterpreter.get();
int requestId = mInterpreter.nextRequestId();
mHttpRequest = new HttpRequest(requestId, con);
mHttpResponse = new HttpResponse(requestId, con);
mHttpRequest = new HttpRequest(con);
mHttpResponse = new HttpResponse(con);
mHttpChainFacade = new HttpChainFacade(mInterceptors);
}
......
......@@ -21,39 +21,42 @@ import java.util.Map;
public class StreamUtil {
public static void copy(InputStream input, OutputStream output, byte[] buffer)
throws IOException {
int n;
while ((n = input.read(buffer)) != -1) {
output.write(buffer, 0, n);
public static void copy(InputStream input, OutputStream output, byte[] buffer)
throws IOException {
int n;
while ((n = input.read(buffer)) != -1) {
output.write(buffer, 0, n);
}
}
}
public static void close(Closeable closeable, boolean hideException) throws IOException {
if (closeable != null) {
if (hideException) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
public static void close(Closeable closeable, boolean hideException) throws IOException {
if (closeable != null) {
if (hideException) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
closeable.close();
}
}
} else {
closeable.close();
}
}
}
public static ArrayList<Pair<String, String>> convertHeaders(Map<String, List<String>> map) {
ArrayList<Pair<String, String>> array = new ArrayList<Pair<String, String>>();
for (Map.Entry<String, List<String>> mapEntry : map.entrySet()) {
for (String mapEntryValue : mapEntry.getValue()) {
// HttpURLConnection puts a weird null entry in the header map that corresponds to
// the HTTP response line (for instance, HTTP/1.1 200 OK). Ignore that weirdness...
if (mapEntry.getKey() != null) {
array.add(Pair.create(mapEntry.getKey(), mapEntryValue));
public static ArrayList<Pair<String, String>> convertHeaders(Map<String, List<String>> map) {
ArrayList<Pair<String, String>> array = new ArrayList<Pair<String, String>>();
if (map == null) {
return array;
}
for (Map.Entry<String, List<String>> mapEntry : map.entrySet()) {
for (String mapEntryValue : mapEntry.getValue()) {
// HttpURLConnection puts a weird null entry in the header map that corresponds to
// the HTTP response line (for instance, HTTP/1.1 200 OK). Ignore that weirdness...
if (mapEntry.getKey() != null) {
array.add(Pair.create(mapEntry.getKey(), mapEntryValue));
}
}
}
}
return array;
}
return array;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册