diff --git a/api/src/main/java/io/minio/MinioAsyncClient.java b/api/src/main/java/io/minio/MinioAsyncClient.java index c3bb1f691..c9c105f81 100644 --- a/api/src/main/java/io/minio/MinioAsyncClient.java +++ b/api/src/main/java/io/minio/MinioAsyncClient.java @@ -3223,6 +3223,7 @@ public static final class Builder { private String region; private Provider provider; private OkHttpClient httpClient; + private boolean closeHttpClient; private void setAwsInfo(String host, boolean https) { this.awsS3Prefix = null; @@ -3329,6 +3330,13 @@ public Builder httpClient(OkHttpClient httpClient) { return this; } + public Builder httpClient(OkHttpClient httpClient, boolean close) { + HttpUtils.validateNotNull(httpClient, "http client"); + this.httpClient = httpClient; + this.closeHttpClient = close; + return this; + } + public MinioAsyncClient build() { HttpUtils.validateNotNull(this.baseUrl, "endpoint"); @@ -3340,12 +3348,11 @@ public MinioAsyncClient build() { "Region missing in Amazon S3 China endpoint " + this.baseUrl); } - boolean closeHttpClient = false; if (this.httpClient == null) { + this.closeHttpClient = true; this.httpClient = HttpUtils.newDefaultHttpClient( DEFAULT_CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT); - closeHttpClient = true; } return new MinioAsyncClient( diff --git a/api/src/main/java/io/minio/MinioClient.java b/api/src/main/java/io/minio/MinioClient.java index 5795c1180..09867dab5 100644 --- a/api/src/main/java/io/minio/MinioClient.java +++ b/api/src/main/java/io/minio/MinioClient.java @@ -2509,6 +2509,11 @@ public Builder httpClient(OkHttpClient httpClient) { return this; } + public Builder httpClient(OkHttpClient httpClient, boolean close) { + asyncClientBuilder.httpClient(httpClient, close); + return this; + } + public MinioClient build() { MinioAsyncClient asyncClient = asyncClientBuilder.build(); return new MinioClient(asyncClient); diff --git a/api/src/test/java/io/minio/MinioClientTest.java b/api/src/test/java/io/minio/MinioClientTest.java index b3ee86764..bc97d607b 100644 --- a/api/src/test/java/io/minio/MinioClientTest.java +++ b/api/src/test/java/io/minio/MinioClientTest.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.Map; import javax.crypto.KeyGenerator; +import okhttp3.OkHttpClient; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okio.Buffer; @@ -362,6 +363,25 @@ public void testAwsEndpoints() "https://s3-accelerate.dualstack.amazonaws.com.cn/mybucket/myobject", url.split("\\?")[0]); } + @Test + public void testCustomHttpClientClose() throws Exception { + OkHttpClient httpClient = new OkHttpClient().newBuilder().build(); + Assert.assertFalse(httpClient.dispatcher().executorService().isShutdown()); + + MinioClient clientThatDoesntCloseHttpClient = + MinioClient.builder().endpoint("https://s3.amazonaws.com").httpClient(httpClient).build(); + clientThatDoesntCloseHttpClient.close(); + Assert.assertFalse(httpClient.dispatcher().executorService().isShutdown()); + + MinioClient clientThatClosesHttpClient = + MinioClient.builder() + .endpoint("https://s3.amazonaws.com") + .httpClient(httpClient, true) + .build(); + clientThatClosesHttpClient.close(); + Assert.assertTrue(httpClient.dispatcher().executorService().isShutdown()); + } + @Test(expected = IllegalArgumentException.class) public void testBucketName1() throws NoSuchAlgorithmException, IOException, InvalidKeyException, MinioException {