Skip to content

Commit b8d5e37

Browse files
authored
Fix Netty leaks (docker-java#1397)
1 parent 37ddf09 commit b8d5e37

File tree

1 file changed

+46
-38
lines changed

1 file changed

+46
-38
lines changed

docker-java-transport-netty/src/main/java/com/github/dockerjava/netty/NettyInvocationBuilder.java

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -111,17 +111,20 @@ public void delete() {
111111

112112
HttpRequestProvider requestProvider = httpDeleteRequestProvider();
113113

114-
ResponseCallback<Void> callback = new ResponseCallback<>();
114+
try (ResponseCallback<Void> callback = new ResponseCallback<>()) {
115115

116-
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback);
116+
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, callback);
117117

118-
Channel channel = getChannel();
118+
Channel channel = getChannel();
119119

120-
channel.pipeline().addLast(responseHandler);
120+
channel.pipeline().addLast(responseHandler);
121121

122-
sendRequest(requestProvider, channel);
122+
sendRequest(requestProvider, channel);
123123

124-
callback.awaitResult();
124+
callback.awaitResult();
125+
} catch (IOException e) {
126+
throw new RuntimeException(e);
127+
}
125128
}
126129

127130
public void get(ResultCallback<Frame> resultCallback) {
@@ -141,12 +144,13 @@ public void get(ResultCallback<Frame> resultCallback) {
141144
}
142145

143146
public <T> T get(TypeReference<T> typeReference) {
147+
try (ResponseCallback<T> callback = new ResponseCallback<>()) {
148+
get(typeReference, callback);
144149

145-
ResponseCallback<T> callback = new ResponseCallback<>();
146-
147-
get(typeReference, callback);
148-
149-
return callback.awaitResult();
150+
return callback.awaitResult();
151+
} catch (IOException e) {
152+
throw new RuntimeException(e);
153+
}
150154
}
151155

152156
public <T> void get(TypeReference<T> typeReference, ResultCallback<T> resultCallback) {
@@ -267,12 +271,13 @@ public void run() {
267271
}
268272

269273
public <T> T post(final Object entity, TypeReference<T> typeReference) {
274+
try (ResponseCallback<T> callback = new ResponseCallback<>()) {
275+
post(entity, typeReference, callback);
270276

271-
ResponseCallback<T> callback = new ResponseCallback<>();
272-
273-
post(entity, typeReference, callback);
274-
275-
return callback.awaitResult();
277+
return callback.awaitResult();
278+
} catch (IOException e) {
279+
throw new RuntimeException(e);
280+
}
276281
}
277282

278283
public <T> void post(final Object entity, TypeReference<T> typeReference, final ResultCallback<T> resultCallback) {
@@ -372,12 +377,13 @@ private void setDefaultHeaders(HttpRequest request) {
372377
}
373378

374379
public <T> T post(TypeReference<T> typeReference, InputStream body) {
380+
try (ResponseCallback<T> callback = new ResponseCallback<>()) {
381+
post(typeReference, callback, body);
375382

376-
ResponseCallback<T> callback = new ResponseCallback<>();
377-
378-
post(typeReference, callback, body);
379-
380-
return callback.awaitResult();
383+
return callback.awaitResult();
384+
} catch (IOException e) {
385+
throw new RuntimeException(e);
386+
}
381387
}
382388

383389
public <T> void post(TypeReference<T> typeReference, ResultCallback<T> resultCallback, InputStream body) {
@@ -464,28 +470,30 @@ public void put(InputStream body, com.github.dockerjava.core.MediaType mediaType
464470

465471
Channel channel = getChannel();
466472

467-
ResponseCallback<Void> resultCallback = new ResponseCallback<>();
473+
try (ResponseCallback<Void> resultCallback = new ResponseCallback<>()) {
474+
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback);
468475

469-
HttpResponseHandler responseHandler = new HttpResponseHandler(requestProvider, resultCallback);
476+
channel.pipeline().addLast(new ChunkedWriteHandler());
477+
channel.pipeline().addLast(responseHandler);
470478

471-
channel.pipeline().addLast(new ChunkedWriteHandler());
472-
channel.pipeline().addLast(responseHandler);
473-
474-
HttpRequest request = requestProvider.getHttpRequest(resource);
479+
HttpRequest request = requestProvider.getHttpRequest(resource);
475480

476-
// don't accept FullHttpRequest here
477-
if (request instanceof FullHttpRequest) {
478-
throw new DockerClientException("fatal: request is instance of FullHttpRequest");
479-
}
481+
// don't accept FullHttpRequest here
482+
if (request instanceof FullHttpRequest) {
483+
throw new DockerClientException("fatal: request is instance of FullHttpRequest");
484+
}
480485

481-
request.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
482-
request.headers().remove(HttpHeaderNames.CONTENT_LENGTH);
483-
request.headers().set(HttpHeaderNames.CONTENT_TYPE, mediaType.getMediaType());
486+
request.headers().set(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
487+
request.headers().remove(HttpHeaderNames.CONTENT_LENGTH);
488+
request.headers().set(HttpHeaderNames.CONTENT_TYPE, mediaType.getMediaType());
484489

485-
channel.write(request);
486-
channel.write(new ChunkedStream(new BufferedInputStream(body, 1024 * 1024)));
487-
channel.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
490+
channel.write(request);
491+
channel.write(new ChunkedStream(new BufferedInputStream(body, 1024 * 1024)));
492+
channel.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
488493

489-
resultCallback.awaitResult();
494+
resultCallback.awaitResult();
495+
} catch (IOException e) {
496+
throw new RuntimeException(e);
497+
}
490498
}
491499
}

0 commit comments

Comments
 (0)