aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidAsync/AndroidAsync-AndroidAsync.iml18
-rw-r--r--AndroidAsync/build.gradle2
-rw-r--r--AndroidAsyncStetho/.classpath9
-rw-r--r--AndroidAsyncStetho/.project33
-rw-r--r--AndroidAsyncStetho/AndroidAsyncStetho.iml95
-rw-r--r--AndroidAsyncStetho/AndroidManifest.xml11
-rw-r--r--AndroidAsyncStetho/build.gradle42
-rw-r--r--AndroidAsyncStetho/res/.gitignore0
-rw-r--r--AndroidAsyncStetho/src/com/koushikdutta/async/stetho/NetworkEventReporterWrapper.java149
-rw-r--r--AndroidAsyncStetho/src/com/koushikdutta/async/stetho/StethoMiddleware.java196
10 files changed, 545 insertions, 10 deletions
diff --git a/AndroidAsync/AndroidAsync-AndroidAsync.iml b/AndroidAsync/AndroidAsync-AndroidAsync.iml
index d1b73c2..e9527e9 100644
--- a/AndroidAsync/AndroidAsync-AndroidAsync.iml
+++ b/AndroidAsync/AndroidAsync-AndroidAsync.iml
@@ -12,9 +12,9 @@
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
- <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
+ <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
- <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugAndroidTestSources" />
+ <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="" />
@@ -25,7 +25,7 @@
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
- <output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
+ <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
@@ -34,12 +34,12 @@
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
- <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/androidTest/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
diff --git a/AndroidAsync/build.gradle b/AndroidAsync/build.gradle
index a97f964..1be4d51 100644
--- a/AndroidAsync/build.gradle
+++ b/AndroidAsync/build.gradle
@@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:+'
+ classpath 'com.android.tools.build:gradle:1.0.1'
}
}
apply plugin: 'com.android.library'
diff --git a/AndroidAsyncStetho/.classpath b/AndroidAsyncStetho/.classpath
new file mode 100644
index 0000000..5176974
--- /dev/null
+++ b/AndroidAsyncStetho/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
diff --git a/AndroidAsyncStetho/.project b/AndroidAsyncStetho/.project
new file mode 100644
index 0000000..4e6d9d1
--- /dev/null
+++ b/AndroidAsyncStetho/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>AndroidAsync</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/AndroidAsyncStetho/AndroidAsyncStetho.iml b/AndroidAsyncStetho/AndroidAsyncStetho.iml
new file mode 100644
index 0000000..3bad7bc
--- /dev/null
+++ b/AndroidAsyncStetho/AndroidAsyncStetho.iml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="Gradle.AndroidAsync" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="android-gradle" name="Android-Gradle">
+ <configuration>
+ <option name="GRADLE_PROJECT_PATH" value=":AndroidAsync:AndroidAsyncStetho" />
+ </configuration>
+ </facet>
+ <facet type="android" name="Android">
+ <configuration>
+ <option name="SELECTED_BUILD_VARIANT" value="debug" />
+ <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
+ <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+ <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
+ <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
+ <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
+ <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
+ <option name="ALLOW_USER_CONFIGURATION" value="false" />
+ <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+ <option name="RES_FOLDERS_RELATIVE_PATH" value="" />
+ <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+ <option name="LIBRARY_PROJECT" value="true" />
+ </configuration>
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
+ <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
+ <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+ <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+ </content>
+ <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="library" exported="" name="jsr305-2.0.1" level="project" />
+ <orderEntry type="library" exported="" name="commons-cli-1.2" level="project" />
+ <orderEntry type="library" exported="" name="stetho-1.0.0" level="project" />
+ <orderEntry type="module" module-name="AndroidAsync-AndroidAsync" exported="" />
+ </component>
+</module>
+
diff --git a/AndroidAsyncStetho/AndroidManifest.xml b/AndroidAsyncStetho/AndroidManifest.xml
new file mode 100644
index 0000000..691994e
--- /dev/null
+++ b/AndroidAsyncStetho/AndroidManifest.xml
@@ -0,0 +1,11 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.koushikdutta.async.stetho"
+ android:versionCode="206"
+ android:versionName="2.0.6">
+
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application>
+ </application>
+
+</manifest>
diff --git a/AndroidAsyncStetho/build.gradle b/AndroidAsyncStetho/build.gradle
new file mode 100644
index 0000000..a68fcee
--- /dev/null
+++ b/AndroidAsyncStetho/build.gradle
@@ -0,0 +1,42 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.0.1'
+ }
+}
+apply plugin: 'com.android.library'
+
+dependencies {
+ compile project(':AndroidAsync:AndroidAsync')
+ compile "com.facebook.stetho:stetho:+"
+}
+
+android {
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java {
+ srcDir 'src/'
+ }
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+
+ defaultConfig {
+ targetSdkVersion 21
+ minSdkVersion 9
+ }
+
+ compileSdkVersion 21
+ buildToolsVersion '21.1.2'
+}
+
+// upload to maven task
+if (System.getenv().I_AM_KOUSH == 'true') {
+ apply from: 'https://raw.githubusercontent.com/koush/mvn-repo/master/maven.gradle'
+}
diff --git a/AndroidAsyncStetho/res/.gitignore b/AndroidAsyncStetho/res/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/AndroidAsyncStetho/res/.gitignore
diff --git a/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/NetworkEventReporterWrapper.java b/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/NetworkEventReporterWrapper.java
new file mode 100644
index 0000000..b1c7e58
--- /dev/null
+++ b/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/NetworkEventReporterWrapper.java
@@ -0,0 +1,149 @@
+// Copyright 2004-present Facebook. All Rights Reserved.
+
+package com.koushikdutta.async.stetho;
+
+import com.facebook.stetho.inspector.network.NetworkEventReporter;
+import com.facebook.stetho.inspector.network.NetworkPeerManager;
+import com.facebook.stetho.inspector.network.ResponseHandler;
+import com.koushikdutta.async.ByteBufferList;
+import com.koushikdutta.async.DataEmitter;
+import com.koushikdutta.async.FilteredDataEmitter;
+import com.koushikdutta.async.util.StreamUtility;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+import javax.annotation.Nullable;
+
+/**
+ * Implementation of {@link NetworkEventReporter} which allows callers to inform the Stetho
+ * system of network traffic. Callers can safely eagerly access this class and store a
+ * reference if they wish. When WebKit Inspector clients are connected, the internal
+ * implementation will be automatically wired up to them.
+ */
+class NetworkEventReporterWrapper implements NetworkEventReporter {
+ NetworkEventReporter wrapped = com.facebook.stetho.inspector.network.NetworkEventReporterImpl.get();
+
+ private static NetworkEventReporterWrapper instance;
+ public synchronized static NetworkEventReporterWrapper get() {
+ if (instance == null)
+ instance = new NetworkEventReporterWrapper();
+ return instance;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return wrapped.isEnabled();
+ }
+
+ @Override
+ public void requestWillBeSent(InspectorRequest inspectorRequest) {
+ wrapped.requestWillBeSent(inspectorRequest);
+ }
+
+ @Override
+ public void responseHeadersReceived(InspectorResponse inspectorResponse) {
+ wrapped.responseHeadersReceived(inspectorResponse);
+ }
+
+ @Override
+ public void httpExchangeFailed(String s, String s2) {
+ wrapped.httpExchangeFailed(s, s2);
+ }
+
+ @Nullable
+ @Override
+ public InputStream interpretResponseStream(
+ String requestId,
+ @Nullable String contentType,
+ @Nullable String contentEncoding,
+ @Nullable InputStream availableInputStream,
+ ResponseHandler responseHandler) {
+ return null;
+ }
+
+ @Nullable
+ private NetworkPeerManager getPeerManagerIfEnabled() {
+ NetworkPeerManager peerManager = NetworkPeerManager.getInstanceOrNull();
+ if (peerManager != null && peerManager.hasRegisteredPeers()) {
+ return peerManager;
+ }
+ return null;
+ }
+
+ public DataEmitter interpretResponseEmitter(
+ final String requestId,
+ @Nullable DataEmitter body
+ ) {
+ final NetworkPeerManager peerManager = getPeerManagerIfEnabled();
+ if (peerManager == null)
+ return null;
+
+ final FileChannel channel;
+ try {
+ channel = ((FileOutputStream)peerManager.getResponseBodyFileManager().openResponseBodyFile(requestId, false)).getChannel();
+ }
+ catch (IOException e) {
+ return null;
+ }
+
+ FilteredDataEmitter ret = new FilteredDataEmitter() {
+ ByteBufferList pending = new ByteBufferList();
+
+ @Override
+ protected void report(Exception e) {
+ super.report(e);
+ StreamUtility.closeQuietly(channel);
+ if (e == null)
+ responseReadFinished(requestId);
+ else
+ responseReadFailed(requestId, e.toString());
+ }
+
+ @Override
+ public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
+ int amount = bb.remaining();
+ ByteBuffer[] original = bb.getAllArray();
+ ByteBuffer[] copy = new ByteBuffer[original.length];
+ for (int i = 0; i < original.length; i++) {
+ copy[i] = original[i].duplicate();
+ }
+ try {
+ channel.write(copy);
+ }
+ catch (IOException ignored) {
+ StreamUtility.closeQuietly(channel);
+ }
+ pending.addAll(original);
+ dataReceived(requestId, amount, amount);
+ super.onDataAvailable(emitter, pending);
+ }
+ };
+ ret.setDataEmitter(body);
+ return ret;
+ }
+
+
+ @Override
+ public void responseReadFailed(String s, String s2) {
+ wrapped.responseReadFailed(s, s2);
+ }
+
+ @Override
+ public void responseReadFinished(String s) {
+ wrapped.responseReadFinished(s);
+ }
+
+ @Override
+ public void dataSent(String s, int i, int i2) {
+ wrapped.dataSent(s, i, i2);
+ }
+
+ @Override
+ public void dataReceived(String s, int i, int i2) {
+ wrapped.dataReceived(s, i, i2);
+ }
+}
diff --git a/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/StethoMiddleware.java b/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/StethoMiddleware.java
new file mode 100644
index 0000000..14ec31c
--- /dev/null
+++ b/AndroidAsyncStetho/src/com/koushikdutta/async/stetho/StethoMiddleware.java
@@ -0,0 +1,196 @@
+package com.koushikdutta.async.stetho;
+
+import com.facebook.stetho.inspector.network.NetworkEventReporter;
+import com.koushikdutta.async.DataEmitter;
+import com.koushikdutta.async.http.AsyncHttpRequest;
+import com.koushikdutta.async.http.SimpleMiddleware;
+
+import org.apache.http.Header;
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicHeader;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+/**
+ * Created by koush on 2/18/15.
+ */
+public class StethoMiddleware extends SimpleMiddleware {
+ private final NetworkEventReporterWrapper eventReporter = NetworkEventReporterWrapper.get();
+
+ private static class AsyncInspectorRequest implements NetworkEventReporter.InspectorRequest {
+ AsyncHttpRequest request;
+ String id = UUID.randomUUID().toString();
+ Header[] headers;
+ AsyncInspectorResponse response;
+
+ public AsyncInspectorRequest(AsyncHttpRequest request) {
+ this.request = request;
+ headers = request.asHttpRequest().getAllHeaders();
+ }
+
+ @Override
+ public String id() {
+ return id;
+ }
+
+ @Override
+ public String friendlyName() {
+ return request.getLogTag() != null ? request.getLogTag() : id;
+ }
+
+ @Nullable
+ @Override
+ public Integer friendlyNameExtra() {
+ return null;
+ }
+
+ @Override
+ public String url() {
+ return request.getUri().toString();
+ }
+
+ @Override
+ public String method() {
+ return request.getMethod();
+ }
+
+ @Nullable
+ @Override
+ public byte[] body() throws IOException {
+ return null;
+ }
+
+ @Override
+ public int headerCount() {
+ return headers.length;
+ }
+
+ @Override
+ public String headerName(int i) {
+ return headers[i].getName();
+ }
+
+ @Override
+ public String headerValue(int i) {
+ return headers[i].getValue();
+ }
+
+ @Nullable
+ @Override
+ public String firstHeaderValue(String s) {
+ return request.getHeaders().get(s);
+ }
+ }
+
+ private static class AsyncInspectorResponse implements NetworkEventReporter.InspectorResponse {
+ ResponseHead head;
+ AsyncInspectorRequest request;
+ Header[] headers;
+
+ public AsyncInspectorResponse(ResponseHead head, AsyncInspectorRequest request) {
+ this.request = request;
+ this.head = head;
+ ArrayList<Header> a = new ArrayList<Header>();
+ for (NameValuePair nvp: head.headers().getMultiMap()) {
+ a.add(new BasicHeader(nvp.getName(), nvp.getValue()));
+ }
+ headers = a.toArray(new Header[a.size()]);
+ }
+
+ @Override
+ public String requestId() {
+ return request.id();
+ }
+
+ @Override
+ public int statusCode() {
+ return head.code();
+ }
+
+ @Override
+ public String reasonPhrase() {
+ return head.message();
+ }
+
+ @Override
+ public boolean connectionReused() {
+ return false;
+ }
+
+ @Override
+ public int connectionId() {
+ return 0;
+ }
+
+ @Override
+ public boolean fromDiskCache() {
+ return false;
+ }
+
+ @Override
+ public String url() {
+ return request.url();
+ }
+
+ @Override
+ public int headerCount() {
+ return headers.length;
+ }
+
+ @Override
+ public String headerName(int i) {
+ return headers[i].getName();
+ }
+
+ @Override
+ public String headerValue(int i) {
+ return headers[i].getValue();
+ }
+
+ @Nullable
+ @Override
+ public String firstHeaderValue(String s) {
+ return head.headers().get(s);
+ }
+ }
+
+ @Override
+ public void onRequest(OnRequestData data) {
+ super.onRequest(data);
+
+ if (!data.request.getUri().getScheme().startsWith("http"))
+ return;
+
+ AsyncInspectorRequest inspect = new AsyncInspectorRequest(data.request);
+ data.state.put("inspect", inspect);
+ eventReporter.requestWillBeSent(inspect);
+ }
+
+ @Override
+ public void onHeadersReceived(OnHeadersReceivedDataOnRequestSentData data) {
+ super.onHeadersReceived(data);
+ AsyncInspectorRequest inspect = data.state.get("inspect");
+ if (inspect == null)
+ return;
+
+ inspect.response = new AsyncInspectorResponse(data.response, inspect);
+ eventReporter.responseHeadersReceived(inspect.response);
+ }
+
+ @Override
+ public void onBodyDecoder(OnBodyDataOnRequestSentData data) {
+ super.onBodyDecoder(data);
+
+ AsyncInspectorRequest inspect = data.state.get("inspect");
+ if (inspect == null)
+ return;
+
+ DataEmitter emitter = eventReporter.interpretResponseEmitter(inspect.id(), data.bodyEmitter);
+ if (emitter != null)
+ data.bodyEmitter = emitter;
+ }
+}