From c6aed22a25f0f67b72963bf54669683e318618b6 Mon Sep 17 00:00:00 2001 From: Eric Cochran Date: Thu, 1 Nov 2018 09:33:09 -0700 Subject: [PATCH] Fix OkHttp Interceptor closing response on IOException. (#313) Summary: The returned response body should not be closed, so that users can read the response body. Before, when [this call](https://github.com/facebook/flipper/blob/db833d36e9e318252e01f9a7d4608702634e673c/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java#L94) threw an exception, the body would be closed, and then [this](https://github.com/facebook/flipper/blob/db833d36e9e318252e01f9a7d4608702634e673c/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java#L54) would return a closed response. Pull Request resolved: https://github.com/facebook/flipper/pull/313 Reviewed By: jknoxville Differential Revision: D12881111 Pulled By: passy fbshipit-source-id: e76a732af6bdb527be6b90bbb02b3a5f45a1ec10 --- .../network/FlipperOkhttpInterceptor.java | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java b/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java index ac1b46ff1..def3d7ef9 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java @@ -7,7 +7,6 @@ */ package com.facebook.flipper.plugins.network; -import android.util.Log; import com.facebook.flipper.plugins.network.NetworkReporter.RequestInfo; import com.facebook.flipper.plugins.network.NetworkReporter.ResponseInfo; import java.io.IOException; @@ -22,6 +21,7 @@ import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okio.Buffer; +import okio.BufferedSource; public class FlipperOkhttpInterceptor implements Interceptor { @@ -44,30 +44,16 @@ public class FlipperOkhttpInterceptor implements Interceptor { ResponseBody body = response.body(); ResponseInfo responseInfo = convertResponse(response, body, identifier); plugin.reportResponse(responseInfo); - // Creating new response as can't used response.body() more than once - if (responseInfo.body != null) { - return response - .newBuilder() - .body(ResponseBody.create(body.contentType(), responseInfo.body)) - .build(); - } else { - return response; - } + return response; } - private static byte[] bodyToByteArray(final Request request) { - - try { - final Request copy = request.newBuilder().build(); - final Buffer buffer = new Buffer(); - copy.body().writeTo(buffer); - return buffer.readByteArray(); - } catch (final IOException e) { - return e.getMessage().getBytes(); - } + private static byte[] bodyToByteArray(final Request request) throws IOException { + final Buffer buffer = new Buffer(); + request.body().writeTo(buffer); + return buffer.readByteArray(); } - private RequestInfo convertRequest(Request request, String identifier) { + private RequestInfo convertRequest(Request request, String identifier) throws IOException { List headers = convertHeader(request.headers()); RequestInfo info = new RequestInfo(); info.requestId = identifier; @@ -82,19 +68,18 @@ public class FlipperOkhttpInterceptor implements Interceptor { return info; } - private ResponseInfo convertResponse(Response response, ResponseBody body, String identifier) { - + private ResponseInfo convertResponse(Response response, ResponseBody body, String identifier) + throws IOException { List headers = convertHeader(response.headers()); ResponseInfo info = new ResponseInfo(); info.requestId = identifier; info.timeStamp = response.receivedResponseAtMillis(); info.statusCode = response.code(); info.headers = headers; - try { - info.body = body.bytes(); - } catch (IOException e) { - Log.e("Flipper", e.toString()); - } + BufferedSource source = body.source(); + source.request(Long.MAX_VALUE); + Buffer buffer = source.buffer().clone(); + info.body = buffer.readByteArray(); return info; }