diff --git a/api/src/main/java/io/minio/MinioClient.java b/api/src/main/java/io/minio/MinioClient.java index 8777b9681..c8d454d9a 100755 --- a/api/src/main/java/io/minio/MinioClient.java +++ b/api/src/main/java/io/minio/MinioClient.java @@ -2636,7 +2636,6 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) List sources = args.sources(); for (int i = 0; i < sources.size(); i++) { ComposeSource src = sources.get(i); - src.validateSse(this.baseUrl); ObjectStat stat = statObject( StatObjectArgs.builder() @@ -2719,7 +2718,7 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) ComposeSource src = sources.get(0); Multimap headers = HashMultimap.create(); headers.putAll(args.extraHeaders()); - headers.putAll(args.headers); + headers.putAll(args.headers()); if (src.offset() == null && src.length() == null) { return copyObject( CopyObjectArgs.builder() @@ -2739,15 +2738,21 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) } } - Multimap sseHeaders = HashMultimap.create(); - Multimap headerMap = HashMultimap.create(); - if (args.sse() != null) { - sseHeaders.putAll(Multimaps.forMap(args.sse().headers())); - headerMap.putAll(args.extraHeaders()); - headerMap.putAll(args.headers); - } + Multimap headersCreateMultiPart = HashMultimap.create(); + headersCreateMultiPart.putAll(args.extraHeaders()); + headersCreateMultiPart.putAll(args.genHeaders()); + String uploadId = + createMultipartUpload( + args.bucket(), + args.region(), + args.object(), + headersCreateMultiPart, + args.extraQueryParams()); - String uploadId = createMultipartUpload(args.bucket(), null, args.object(), headerMap, null); + Multimap ssecHeaders = HashMultimap.create(); + if (args.sse() != null && args.sse().type() == ServerSideEncryption.Type.SSE_C) { + ssecHeaders.putAll(Multimaps.forMap(args.sse().headers())); + } int partNumber = 0; Part[] totalParts = new Part[partsCount]; @@ -2777,8 +2782,8 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) } else if (src.offset() != null) { headers.put("x-amz-copy-source-range", "bytes=" + offset + "-" + (offset + size - 1)); } - if (sseHeaders != null) { - headers.putAll(sseHeaders); + if (ssecHeaders != null) { + headers.putAll(ssecHeaders); } String eTag = uploadPartCopy(args.bucket(), args.object(), uploadId, partNumber, headers); @@ -2797,13 +2802,11 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) Multimap headers = src.headers(); headers.put("x-amz-copy-source-range", "bytes=" + startBytes + "-" + endBytes); - if (sseHeaders != null) { - headers.putAll(sseHeaders); + if (ssecHeaders != null) { + headers.putAll(ssecHeaders); } String eTag = uploadPartCopy(args.bucket(), args.object(), uploadId, partNumber, headers); - totalParts[partNumber - 1] = new Part(partNumber, eTag); - offset = startBytes; size -= (endBytes - startBytes); } @@ -2812,10 +2815,18 @@ public ObjectWriteResponse composeObject(ComposeObjectArgs args) return completeMultipartUpload( args.bucket(), getRegion(args.bucket()), args.object(), uploadId, totalParts, null, null); } catch (RuntimeException e) { - abortMultipartUpload(args.bucket(), args.object(), uploadId); + if (!(args.sources().size() == 1 + && args.sources().get(0).offset() == null + && args.sources().get(0).length() == null)) { + abortMultipartUpload(args.bucket(), args.object(), uploadId); + } throw e; } catch (Exception e) { - abortMultipartUpload(args.bucket(), args.object(), uploadId); + if (!(args.sources().size() == 1 + && args.sources().get(0).offset() == null + && args.sources().get(0).length() == null)) { + abortMultipartUpload(args.bucket(), args.object(), uploadId); + } throw e; } }