Skip to content

Commit 6b25e64

Browse files
authored
fix okhttpclient response body leak bug (#600)
1 parent 9346aeb commit 6b25e64

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

client/src/main/fbthrift/com/facebook/thrift/transport/THttp2Client.java

+17-10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package com.facebook.thrift.transport;
77

88
import com.facebook.thrift.utils.Logger;
9+
import java.io.ByteArrayInputStream;
910
import java.io.ByteArrayOutputStream;
1011
import javax.net.ssl.SSLSocketFactory;
1112
import javax.net.ssl.TrustManager;
@@ -16,14 +17,16 @@
1617
import okhttp3.Response;
1718
import okhttp3.ResponseBody;
1819
import java.io.IOException;
20+
import java.io.InputStream;
1921
import java.util.HashMap;
2022
import java.util.Map;
2123

2224
public class THttp2Client extends TTransport {
2325
private static final Logger LOGGER = Logger.getLogger(THttp2Client.class.getName());
2426

2527
private final ByteArrayOutputStream requestBuffer = new ByteArrayOutputStream();
26-
private ResponseBody responseBody = null;
28+
29+
private InputStream inputStream = null;
2730
private Map<String, String> customHeaders = null;
2831
private static final Map<String, String> defaultHeaders = getDefaultHeaders();
2932

@@ -75,12 +78,8 @@ public void open() {
7578

7679
public void close() {
7780
try {
78-
if (responseBody != null) {
79-
responseBody.close();
80-
responseBody = null;
81-
}
82-
8381
requestBuffer.close();
82+
inputStream.close();
8483
} catch (IOException e) {
8584
LOGGER.warn(e.getMessage());
8685
}
@@ -92,11 +91,11 @@ public boolean isOpen() {
9291
}
9392

9493
public int read(byte[] buf, int off, int len) throws TTransportException {
95-
if (responseBody == null) {
94+
if (inputStream == null) {
9695
throw new TTransportException("Response buffer is empty, no request.");
9796
}
9897
try {
99-
int ret = responseBody.byteStream().read(buf, off, len);
98+
int ret = inputStream.read(buf, off, len);
10099
if (ret == -1) {
101100
throw new TTransportException("No more data available.");
102101
}
@@ -118,6 +117,7 @@ public void flush() throws TTransportException {
118117
// Extract request and reset buffer
119118
byte[] data = requestBuffer.toByteArray();
120119
requestBuffer.reset();
120+
Response response = null;
121121
try {
122122

123123
// Create request object
@@ -133,15 +133,22 @@ public void flush() throws TTransportException {
133133
Request request = requestBuilder.build();
134134

135135
// Make the request
136-
Response response = client.newCall(request).execute();
136+
response = client.newCall(request).execute();
137137
if (!response.isSuccessful()) {
138138
throw new TTransportException("HTTP Response code: " + response.code());
139139
}
140140

141+
if (response.body() == null) {
142+
throw new TTransportException("response body is null");
143+
}
141144
// Read the response
142-
responseBody = response.body();
145+
inputStream = new ByteArrayInputStream(response.body().bytes());
143146
} catch (IOException iox) {
144147
throw new TTransportException(iox);
148+
} finally {
149+
if (response != null) {
150+
response.close();
151+
}
145152
}
146153
}
147154

0 commit comments

Comments
 (0)