From 52a341741921b32706cf0e8058a150958a202138 Mon Sep 17 00:00:00 2001 From: wanglikun7342 Date: Fri, 9 Aug 2019 17:59:22 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=BD=91=E7=BB=9C=E5=BA=93=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HttpMonitorInterceptor.java | 45 +++++++------- .../URLConnectionInspectorHeaders.java | 50 ---------------- .../URLConnectionInspectorHeaders.java | 50 ++++++++++++++++ .../URLConnectionInspectorRequest.java | 12 ++-- .../URLConnectionInspectorResponse.java | 15 +++-- .../interceptor/HttpRequest.java | 27 ++++++--- .../interceptor/HttpResponse.java | 42 +++++++++---- .../{ => proxy}/HttpUrlConnectionProxy.java | 13 ++-- .../{ => proxy}/HttpsUrlConnectionProxy.java | 10 ++-- .../kit/network/utils/StreamUtil.java | 59 ++++++++++--------- 10 files changed, 179 insertions(+), 144 deletions(-) delete mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorHeaders.java create mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorHeaders.java rename Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/{ => inspector}/URLConnectionInspectorRequest.java (85%) rename Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/{ => inspector}/URLConnectionInspectorResponse.java (73%) rename Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/{ => proxy}/HttpUrlConnectionProxy.java (96%) rename Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/{ => proxy}/HttpsUrlConnectionProxy.java (96%) diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpMonitorInterceptor.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpMonitorInterceptor.java index 8f5602a1..e64a97f5 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpMonitorInterceptor.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpMonitorInterceptor.java @@ -1,13 +1,14 @@ 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 { - 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> 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> 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> 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> mHeaders; - - public URLConnectionInspectorHeaders(ArrayList> 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; - } -} diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorHeaders.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorHeaders.java new file mode 100644 index 00000000..4789d927 --- /dev/null +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorHeaders.java @@ -0,0 +1,50 @@ +/* + * 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> mHeaders; + + public URLConnectionInspectorHeaders(ArrayList> 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; + } +} diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorRequest.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorRequest.java similarity index 85% rename from Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorRequest.java rename to Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorRequest.java index 1cfd07c9..e9af53b1 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorRequest.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorRequest.java @@ -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> 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; } } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorResponse.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorResponse.java similarity index 73% rename from Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorResponse.java rename to Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorResponse.java index b70765f0..349267d6 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/URLConnectionInspectorResponse.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/inspector/URLConnectionInspectorResponse.java @@ -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> 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; } - } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpRequest.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpRequest.java index 0bb7c9e9..d89c0d67 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpRequest.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpRequest.java @@ -1,34 +1,47 @@ 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> 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; } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpResponse.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpResponse.java index c805ed7b..0d56f62b 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpResponse.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/interceptor/HttpResponse.java @@ -1,29 +1,24 @@ 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> getHeaders() { + try { + return mURLConnection.getHeaderFields(); + } catch (Exception e) { + Log.d(TAG, "get head exception", e); + return null; + } + } + + public String getHeaderField(String key) { + Map> map = getHeaders(); + if (map == null) { + return null; + } + List fields = map.get(key); + if (fields == null || fields.size() == 0) { + return null; + } + return fields.get(fields.size() - 1); + } } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpUrlConnectionProxy.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpUrlConnectionProxy.java similarity index 96% rename from Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpUrlConnectionProxy.java rename to Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpUrlConnectionProxy.java index 8967f7f0..8f2d13c5 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpUrlConnectionProxy.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpUrlConnectionProxy.java @@ -1,8 +1,8 @@ -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> getHeaderFields() { - return mSourceConnection.getHeaderFields(); + return mSourceConnection.getRequestProperties(); } @Override diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpsUrlConnectionProxy.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpsUrlConnectionProxy.java similarity index 96% rename from Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpsUrlConnectionProxy.java rename to Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpsUrlConnectionProxy.java index e7b9627e..237181e1 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/HttpsUrlConnectionProxy.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/httpurlconnection/proxy/HttpsUrlConnectionProxy.java @@ -1,8 +1,8 @@ -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); } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/utils/StreamUtil.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/utils/StreamUtil.java index 2882b4c7..73c101ee 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/utils/StreamUtil.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/network/utils/StreamUtil.java @@ -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> convertHeaders(Map> map) { - ArrayList> array = new ArrayList>(); - for (Map.Entry> 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> convertHeaders(Map> map) { + ArrayList> array = new ArrayList>(); + if (map == null) { + return array; + } + for (Map.Entry> 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; - } } -- GitLab