Skip to content

Commit a9b9641

Browse files
authored
chore: prevent Content-Type header duplication in multipart uploads with MultipartUploadClient (#3454)
1 parent e6dc0b0 commit a9b9641

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

java-storage/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ CreateMultipartUploadResponse sendCreateMultipartUploadRequest(
8383

8484
HttpRequest httpRequest =
8585
requestFactory.buildPostRequest(
86-
new GenericUrl(createUri), new ByteArrayContent(request.contentType(), new byte[0]));
86+
new GenericUrl(createUri), new ByteArrayContent(null, new byte[0]));
8787
httpRequest.getHeaders().putAll(headerProvider.getHeaders());
8888
addHeadersForCreateMultipartUpload(request, httpRequest.getHeaders());
8989
httpRequest.setParser(objectParser);

java-storage/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,71 @@ public void sendCreateMultipartUploadRequest_withUserProject() throws Exception
581581
}
582582
}
583583

584+
@Test
585+
public void sendCreateMultipartUploadRequest_withContentType() throws Exception {
586+
HttpRequestHandler handler =
587+
req -> {
588+
assertThat(req.headers().getAll("Content-Type")).containsExactly("audio/mp4");
589+
590+
CreateMultipartUploadResponse response =
591+
CreateMultipartUploadResponse.builder()
592+
.bucket("test-bucket")
593+
.key("test-key")
594+
.uploadId("test-upload-id")
595+
.build();
596+
ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response));
597+
598+
DefaultFullHttpResponse resp =
599+
new DefaultFullHttpResponse(req.protocolVersion(), OK, buf);
600+
resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8");
601+
return resp;
602+
};
603+
604+
try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) {
605+
MultipartUploadHttpRequestManager multipartUploadHttpRequestManager =
606+
MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions());
607+
CreateMultipartUploadRequest request =
608+
CreateMultipartUploadRequest.builder()
609+
.bucket("test-bucket")
610+
.key("test-key")
611+
.contentType("audio/mp4")
612+
.build();
613+
614+
multipartUploadHttpRequestManager.sendCreateMultipartUploadRequest(request);
615+
}
616+
}
617+
618+
@Test
619+
public void sendCreateMultipartUploadRequest_sendsContentLength() throws Exception {
620+
HttpRequestHandler handler =
621+
req -> {
622+
// See https://docs.cloud.google.com/storage/docs/xml-api/reference-headers#contentlength
623+
assertThat(req.headers().get("Content-Length")).isEqualTo("0");
624+
625+
CreateMultipartUploadResponse response =
626+
CreateMultipartUploadResponse.builder()
627+
.bucket("test-bucket")
628+
.key("test-key")
629+
.uploadId("test-upload-id")
630+
.build();
631+
ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response));
632+
633+
DefaultFullHttpResponse resp =
634+
new DefaultFullHttpResponse(req.protocolVersion(), OK, buf);
635+
resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8");
636+
return resp;
637+
};
638+
639+
try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) {
640+
MultipartUploadHttpRequestManager multipartUploadHttpRequestManager =
641+
MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions());
642+
CreateMultipartUploadRequest request =
643+
CreateMultipartUploadRequest.builder().bucket("test-bucket").key("test-key").build();
644+
645+
multipartUploadHttpRequestManager.sendCreateMultipartUploadRequest(request);
646+
}
647+
}
648+
584649
@Test
585650
public void sendListPartsRequest_success() throws Exception {
586651
HttpRequestHandler handler =

0 commit comments

Comments
 (0)