This is an automated email from the ASF dual-hosted git repository.

gaul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git


The following commit(s) were added to refs/heads/master by this push:
     new b379c17156 JCLOUDS-1632: GCP BlobStore fails to put a blob if blob 
name contains non ASCII characters
b379c17156 is described below

commit b379c17156237de96cedbb19d82bc86168fe83af
Author: Aliaksandr Stsiapanay <aliaksandr_stsiapa...@epam.com>
AuthorDate: Wed Mar 20 11:37:11 2024 +0300

    JCLOUDS-1632: GCP BlobStore fails to put a blob if blob name contains non 
ASCII characters
---
 .../org/jclouds/io/payloads/MultipartForm.java     |  2 +-
 .../org/jclouds/io/payloads/MultipartFormTest.java | 32 ++++++++++++++++------
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/core/src/main/java/org/jclouds/io/payloads/MultipartForm.java 
b/core/src/main/java/org/jclouds/io/payloads/MultipartForm.java
index 94d4112cf4..c148de402b 100644
--- a/core/src/main/java/org/jclouds/io/payloads/MultipartForm.java
+++ b/core/src/main/java/org/jclouds/io/payloads/MultipartForm.java
@@ -50,7 +50,7 @@ public class MultipartForm extends BasePayload<Iterable<? 
extends Part>> {
          if (!part.isRepeatable())
             isRepeatable = false;
          contentLength += part.getContentMetadata().getContentLength()
-            + createHeaders(boundaryrn, part).length()
+            + createHeaders(boundaryrn, part).getBytes().length
             + createRn().length();
       }
       contentLength += createFooter(boundary).length();
diff --git a/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java 
b/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
index 3a673e4712..9f90d06a41 100644
--- a/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
+++ b/core/src/test/java/org/jclouds/io/payloads/MultipartFormTest.java
@@ -41,17 +41,31 @@ public class MultipartFormTest {
    public void testSinglePart() throws IOException {
 
       StringBuilder builder = new StringBuilder();
-      addData(boundary, "hello", builder);
+      addData(boundary, "file", "hello", builder);
       builder.append("--").append(boundary).append("--").append("\r\n");
       String expects = builder.toString();
       assertEquals(expects.length(), 199);
 
-      MultipartForm multipartForm = new MultipartForm(boundary, 
newPart("hello"));
+      MultipartForm multipartForm = new MultipartForm(boundary, 
newPart("file", "hello"));
 
       assertEquals(Strings2.toStringAndClose(multipartForm.openStream()), 
expects);
       assertEquals(multipartForm.getContentMetadata().getContentLength(), 
Long.valueOf(199));
    }
 
+   public void testLengthIsCorrectPerUTF8() throws IOException {
+
+      StringBuilder builder = new StringBuilder();
+      addData(boundary, "unic₪de", "hello", builder);
+      builder.append("--").append(boundary).append("--").append("\r\n");
+      String expects = builder.toString();
+      assertEquals(expects.getBytes().length, 204);
+
+      MultipartForm multipartForm = new MultipartForm(boundary, 
newPart("unic₪de", "hello"));
+
+      assertEquals(Strings2.toStringAndClose(multipartForm.openStream()), 
expects);
+      assertEquals(multipartForm.getContentMetadata().getContentLength(), 
Long.valueOf(204));
+   }
+
    public static class MockFilePayload extends FilePayload {
 
       private final StringPayload realPayload;
@@ -81,14 +95,14 @@ public class MultipartFormTest {
       }
    }
 
-   private Part newPart(String data) {
-      return Part.create("file", new MockFilePayload(data),
+   private Part newPart(String name, String data) {
+      return Part.create(name, new MockFilePayload(data),
             new 
PartOptions().contentType(PLAIN_TEXT_UTF_8.withoutParameters().toString()));
    }
 
-   private void addData(String boundary, String data, StringBuilder builder) {
+   private void addData(String boundary, String name, String data, 
StringBuilder builder) {
       builder.append("--").append(boundary).append("\r\n");
-      builder.append("Content-Disposition").append(": ").append("form-data; 
name=\"file\"; filename=\"testfile.txt\"")
+      builder.append("Content-Disposition").append(": ").append("form-data; 
name=\"").append(name).append("\"; filename=\"testfile.txt\"")
                .append("\r\n");
       builder.append("Content-Type").append(": 
").append("text/plain").append("\r\n");
       builder.append("\r\n");
@@ -98,15 +112,15 @@ public class MultipartFormTest {
    public void testMultipleParts() throws IOException {
 
       StringBuilder builder = new StringBuilder();
-      addData(boundary, "hello", builder);
-      addData(boundary, "goodbye", builder);
+      addData(boundary, "file", "hello", builder);
+      addData(boundary, "file", "goodbye", builder);
 
       builder.append("--").append(boundary).append("--").append("\r\n");
       String expects = builder.toString();
 
       assertEquals(expects.length(), 352);
 
-      MultipartForm multipartForm = new MultipartForm(boundary, 
newPart("hello"), newPart("goodbye"));
+      MultipartForm multipartForm = new MultipartForm(boundary, 
newPart("file", "hello"), newPart("file", "goodbye"));
 
       assertEquals(Strings2.toStringAndClose(multipartForm.openStream()), 
expects);
 

Reply via email to