Skip to content

Commit b835acc

Browse files
committed
Avoid leaking okhttp connections
1 parent 75aa2dd commit b835acc

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

java/client/src/org/openqa/selenium/remote/http/okhttp/OkMessages.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,32 @@
1717

1818
package org.openqa.selenium.remote.http.okhttp;
1919

20-
import static org.openqa.selenium.remote.http.Contents.bytes;
21-
import static org.openqa.selenium.remote.http.Contents.empty;
22-
23-
import org.openqa.selenium.remote.http.Contents;
24-
import org.openqa.selenium.remote.http.HttpRequest;
25-
import org.openqa.selenium.remote.http.HttpResponse;
26-
20+
import com.google.common.io.ByteStreams;
2721
import okhttp3.HttpUrl;
2822
import okhttp3.MediaType;
2923
import okhttp3.Request;
3024
import okhttp3.RequestBody;
3125
import okhttp3.Response;
26+
import org.openqa.selenium.remote.http.Contents;
27+
import org.openqa.selenium.remote.http.HttpRequest;
28+
import org.openqa.selenium.remote.http.HttpResponse;
3229

3330
import java.io.IOException;
3431
import java.io.InputStream;
3532
import java.io.UncheckedIOException;
3633
import java.net.URI;
3734
import java.util.Optional;
3835

36+
import static org.openqa.selenium.remote.http.Contents.bytes;
37+
import static org.openqa.selenium.remote.http.Contents.empty;
38+
3939
class OkMessages {
4040

4141
private OkMessages() {
4242
// Utility classes.
4343
}
4444

45-
protected static Request toOkHttpRequest(URI baseUrl, HttpRequest request) {
45+
static Request toOkHttpRequest(URI baseUrl, HttpRequest request) {
4646
Request.Builder builder = new Request.Builder();
4747

4848
HttpUrl.Builder url;
@@ -88,7 +88,7 @@ protected static Request toOkHttpRequest(URI baseUrl, HttpRequest request) {
8888
String rawType = Optional.ofNullable(request.getHeader("Content-Type"))
8989
.orElse("application/json; charset=utf-8");
9090
MediaType type = MediaType.parse(rawType);
91-
RequestBody body = RequestBody.create(type, bytes(request.getContent()));
91+
RequestBody body = RequestBody.create(bytes(request.getContent()), type);
9292
builder.post(body);
9393
break;
9494

@@ -98,7 +98,7 @@ protected static Request toOkHttpRequest(URI baseUrl, HttpRequest request) {
9898
return builder.build();
9999
}
100100

101-
public static HttpResponse toSeleniumResponse(Response response) {
101+
static HttpResponse toSeleniumResponse(Response response) {
102102
HttpResponse toReturn = new HttpResponse();
103103

104104
toReturn.setStatus(response.code());
@@ -122,6 +122,17 @@ public void close() throws IOException {
122122
response.headers().names().forEach(
123123
name -> response.headers(name).forEach(value -> toReturn.addHeader(name, value)));
124124

125+
// We need to close the okhttp body in order to avoid leaking connections,
126+
// however if we do this then we can't read the contents any more. We're
127+
// already memoising the result, so read everything to be safe.
128+
try {
129+
ByteStreams.copy(toReturn.getContent().get(), ByteStreams.nullOutputStream());
130+
} catch (IOException e) {
131+
throw new UncheckedIOException(e);
132+
} finally {
133+
response.close();
134+
}
135+
125136
return toReturn;
126137
}
127138
}

0 commit comments

Comments
 (0)