diff options
-rw-r--r-- | AndroidAsync/AndroidAsync-AndroidAsync.iml | 18 | ||||
-rw-r--r-- | AndroidAsync/build.gradle | 2 | ||||
-rw-r--r-- | AndroidAsyncStetho/.classpath | 9 | ||||
-rw-r--r-- | AndroidAsyncStetho/.project | 33 | ||||
-rw-r--r-- | AndroidAsyncStetho/AndroidAsyncStetho.iml | 95 | ||||
-rw-r--r-- | AndroidAsyncStetho/AndroidManifest.xml | 11 | ||||
-rw-r--r-- | AndroidAsyncStetho/build.gradle | 42 | ||||
-rw-r--r-- | AndroidAsyncStetho/res/.gitignore | 0 | ||||
-rw-r--r-- | AndroidAsyncStetho/src/com/koushikdutta/async/stetho/NetworkEventReporterWrapper.java | 149 | ||||
-rw-r--r-- | AndroidAsyncStetho/src/com/koushikdutta/async/stetho/StethoMiddleware.java | 196 |
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; + } +} |