diff --git a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultInvocationBuilder.java b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultInvocationBuilder.java index c63daf42d..c7525279c 100644 --- a/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultInvocationBuilder.java +++ b/docker-java-core/src/main/java/com/github/dockerjava/core/DefaultInvocationBuilder.java @@ -17,7 +17,6 @@ import com.github.dockerjava.transport.DockerHttpClient; import org.apache.commons.io.IOUtils; -import java.io.ByteArrayInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; @@ -97,7 +96,7 @@ public InputStream post(Object entity) { DockerHttpClient.Request request = requestBuilder .method(DockerHttpClient.Request.Method.POST) .putHeader("content-type", "application/json") - .body(encode(entity)) + .bodyBytes(encode(entity)) .build(); DockerHttpClient.Response response = execute(request); @@ -119,7 +118,7 @@ public T post(Object entity, TypeReference typeReference) { DockerHttpClient.Request request = requestBuilder .method(DockerHttpClient.Request.Method.POST) .putHeader("content-type", "application/json") - .body(new ByteArrayInputStream(objectMapper.writeValueAsBytes(entity))) + .bodyBytes(encode(entity)) .build(); try (DockerHttpClient.Response response = execute(request)) { @@ -132,11 +131,17 @@ public T post(Object entity, TypeReference typeReference) { @Override public void post(Object entity, TypeReference typeReference, ResultCallback resultCallback) { - try { - post(typeReference, resultCallback, new ByteArrayInputStream(objectMapper.writeValueAsBytes(entity))); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + DockerHttpClient.Request request = requestBuilder + .method(DockerHttpClient.Request.Method.POST) + .putHeader("content-type", "application/json") + .bodyBytes(encode(entity)) + .build(); + + executeAndStream( + request, + resultCallback, + new JsonSink<>(typeReference, resultCallback) + ); } @Override @@ -150,17 +155,12 @@ public T post(TypeReference typeReference, InputStream body) { @Override public void post(Object entity, InputStream stdin, ResultCallback resultCallback) { - final DockerHttpClient.Request request; - try { - request = requestBuilder - .method(DockerHttpClient.Request.Method.POST) - .putHeader("content-type", "application/json") - .body(new ByteArrayInputStream(objectMapper.writeValueAsBytes(entity))) - .hijackedInput(stdin) - .build(); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } + DockerHttpClient.Request request = requestBuilder + .method(DockerHttpClient.Request.Method.POST) + .putHeader("content-type", "application/json") + .bodyBytes(encode(entity)) + .hijackedInput(stdin) + .build(); executeAndStream( request, @@ -283,13 +283,13 @@ protected void executeAndStream( thread.start(); } - private InputStream encode(Object entity) { + private byte[] encode(Object entity) { if (entity == null) { return null; } try { - return new ByteArrayInputStream(objectMapper.writeValueAsBytes(entity)); + return objectMapper.writeValueAsBytes(entity); } catch (JsonProcessingException e) { throw new RuntimeException(e); } diff --git a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java index d06bd81ab..d8f17af66 100644 --- a/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java +++ b/docker-java-transport-httpclient5/src/main/java/com/github/dockerjava/httpclient5/ApacheDockerHttpClientImpl.java @@ -21,6 +21,7 @@ import org.apache.hc.core5.http.config.RegistryBuilder; import org.apache.hc.core5.http.impl.DefaultContentLengthStrategy; import org.apache.hc.core5.http.impl.io.EmptyInputStream; +import org.apache.hc.core5.http.io.entity.ByteArrayEntity; import org.apache.hc.core5.http.io.entity.InputStreamEntity; import org.apache.hc.core5.http.protocol.BasicHttpContext; import org.apache.hc.core5.http.protocol.HttpContext; @@ -134,9 +135,14 @@ public Response execute(Request request) { request.headers().forEach(httpUriRequest::addHeader); - InputStream body = request.body(); - if (body != null) { - httpUriRequest.setEntity(new InputStreamEntity(body, null)); + byte[] bodyBytes = request.bodyBytes(); + if (bodyBytes != null) { + httpUriRequest.setEntity(new ByteArrayEntity(bodyBytes, null)); + } else { + InputStream body = request.body(); + if (body != null) { + httpUriRequest.setEntity(new InputStreamEntity(body, null)); + } } if (request.hijackedInput() != null) { diff --git a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java index b6c723f5d..15c91745e 100644 --- a/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java +++ b/docker-java-transport-jersey/src/main/java/com/github/dockerjava/jaxrs/JerseyDockerHttpClient.java @@ -304,7 +304,11 @@ public Response execute(Request request) { } } - private Entity toEntity(Request request) { + private Entity toEntity(Request request) { + byte[] bodyBytes = request.bodyBytes(); + if (bodyBytes != null) { + return Entity.json(bodyBytes); + } InputStream body = request.body(); if (body != null) { return Entity.entity(body, MediaType.APPLICATION_JSON_TYPE); diff --git a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java index 5bb943bef..3778d8bb4 100644 --- a/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java +++ b/docker-java-transport-okhttp/src/main/java/com/github/dockerjava/okhttp/OkDockerHttpClient.java @@ -177,6 +177,11 @@ private OkDockerHttpClient( } private RequestBody toRequestBody(Request request) { + byte[] bodyBytes = request.bodyBytes(); + if (bodyBytes != null) { + return RequestBody.create(null, bodyBytes); + } + InputStream body = request.body(); if (body != null) { return new RequestBody() { diff --git a/docker-java-transport/src/main/java/com/github/dockerjava/transport/DockerHttpClient.java b/docker-java-transport/src/main/java/com/github/dockerjava/transport/DockerHttpClient.java index 8c3fa580d..7b780cb06 100644 --- a/docker-java-transport/src/main/java/com/github/dockerjava/transport/DockerHttpClient.java +++ b/docker-java-transport/src/main/java/com/github/dockerjava/transport/DockerHttpClient.java @@ -4,6 +4,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.io.ByteArrayInputStream; import java.io.Closeable; import java.io.InputStream; import java.util.List; @@ -70,7 +71,16 @@ public static Builder builder() { public abstract String path(); @Nullable - public abstract InputStream body(); + @Value.Default + public InputStream body() { + byte[] bodyBytes = bodyBytes(); + return bodyBytes != null + ? new ByteArrayInputStream(bodyBytes) + : null; + } + + @Nullable + public abstract byte[] bodyBytes(); @Nullable public abstract InputStream hijackedInput();