[ 
https://issues.apache.org/jira/browse/JCLOUDS-1264?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andrew Gaul resolved JCLOUDS-1264.
----------------------------------
       Resolution: Fixed
         Assignee: Andrew Gaul
    Fix Version/s: 2.1.0

> Multipart SLO uploads fail if key contains multibyte Unicode characters
> -----------------------------------------------------------------------
>
>                 Key: JCLOUDS-1264
>                 URL: https://issues.apache.org/jira/browse/JCLOUDS-1264
>             Project: jclouds
>          Issue Type: Bug
>          Components: jclouds-blobstore
>    Affects Versions: 2.0.1
>         Environment: Devstack on Ubuntu 14.04
>            Reporter: Mat Mannion
>            Assignee: Andrew Gaul
>             Fix For: 2.1.0
>
>
> If a large object is PUT to a key that contains multibyte Unicode characters, 
> the manifest upload fails because the {{Content-Length}} header sent is 
> incorrect.
> A small project that reproduces the issue against the latest Devstack Swift 
> can be found here: 
> https://github.com/UniversityofWarwick/jclouds-highbyte-slo-bug
> In short:
> {noformat}
> >> "[{"path":"slo-test/Ni[0xc5][0x9f]an.rar/slo/1491214092.299000/38547913/0/00000001","etag":"58f06dd588d8ffb3beb46ada6309436b","size_bytes":33554432},{"path":"slo-test/Ni[0xc5][0x9f]an.rar/slo/1491214092.299000/38547913/0/00000002","etag":"2b4b81733d0a2e4abe89516639627408","size_bytes":4993481}]"
> >> PUT 
> >> http://137.205.194.8:8080/v1/AUTH_c7a3e66567ec442080a360d6d23f2dbe/slo-test/Ni%C5%9Fan.rar?multipart-manifest=put
> >>  HTTP/1.1
> >> Content-Length: 272
> 14657 ERROR org.jclouds.http.internal.JavaUrlHttpCommandExecutorService error 
> after writing 0/272 bytes to 
> http://137.205.194.8:8080/v1/AUTH_c7a3e66567ec442080a360d6d23f2dbe/slo-test/Ni%C5%9Fan.rar?multipart-manifest=put
> java.io.IOException: too many bytes written
>       at 
> sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3505)
>       at 
> com.google.common.io.CountingOutputStream.write(CountingOutputStream.java:53)
>       at com.google.common.io.ByteStreams.copy(ByteStreams.java:179)
>       at 
> org.jclouds.http.internal.JavaUrlHttpCommandExecutorService.writePayloadToConnection(JavaUrlHttpCommandExecutorService.java:298)
>       at 
> org.jclouds.http.internal.JavaUrlHttpCommandExecutorService.convert(JavaUrlHttpCommandExecutorService.java:171)
>       at 
> org.jclouds.http.internal.JavaUrlHttpCommandExecutorService.convert(JavaUrlHttpCommandExecutorService.java:65)
>       at 
> org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:99)
>       at 
> org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
>       at 
> org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
>       at 
> org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
>       at 
> org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
>       at 
> com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
>       at com.sun.proxy.$Proxy77.replaceManifest(Unknown Source)
>       at 
> org.jclouds.openstack.swift.v1.blobstore.RegionScopedSwiftBlobStore.completeMultipartUpload(RegionScopedSwiftBlobStore.java:522)
>       at 
> uk.ac.warwick.slo.AbstractJCloudsSLOTest.putSLO(AbstractJCloudsSLOTest.java:70)
>       at 
> uk.ac.warwick.slo.AbstractJCloudsSLOTest.assertCanPutAndGetSLO(AbstractJCloudsSLOTest.java:74)
>       at 
> uk.ac.warwick.slo.AbstractJCloudsSLOTest.sloWithHighByteChars(AbstractJCloudsSLOTest.java:91)
>       at 
> uk.ac.warwick.slo.SwiftJCloudsSLOTest.sloWithHighByteChars(SwiftJCloudsSLOTest.java:7)
> {noformat}
> The cause of this is 
> {{org.jclouds.openstack.swift.v1.binders.BindManifestToJsonPayload:61}}, 
> where the ContentLength is set to the length of the JSON String in Java, 
> which is not the same as the String byte length. This is actually 
> unnecessary, as {{request.setPayload(String)}} creates a {{StringPayload}}, 
> and the constructor here sets the content length to the correct byte length - 
> so I think this code is left-over from a previous version where this isn't 
> the case.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to