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](db833d36e9/android/src/main/java/com/facebook/flipper/plugins/network/FlipperOkhttpInterceptor.java (L94)) threw an exception, the body would be closed, and then [this](db833d36e9/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
This commit is contained in:
Eric Cochran
2018-11-01 09:33:09 -07:00
committed by Facebook Github Bot
parent 1dd5a72ab6
commit c6aed22a25

View File

@@ -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<NetworkReporter.Header> 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<NetworkReporter.Header> 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;
}