A PR would be much appreciated :) It is also easier to discuss
impl/design things there.
Thanks!

On 11 March 2015 at 22:47, Veit Guna <veit.g...@gmx.de> wrote:
> Hi Ignasi.
>
> In fact, in the "patch" I provided for the other issue (S3 upload
> performance), I already
> removed the hashing lines and simply took the provided MD5 hash from the
> ContentMetadata.
> And that worked. But I wasn't sure about the intention of the additional
> hashing,
> so I thought I better ask for more insight here ;).
>
> So no changes were needed for [1] and [2]. If it makes sense, I can
> create a PR so someone
> can review the changes.
>
> Thanks,
> Veit
>
>
> Am 11.03.2015 um 22:23 schrieb Ignasi Barrera:
>> Looking at the code I would say it is an issue, but at some point that
>> should be intentional. The Apache HC driver explicitly excludes the
>> Content-MD5 header when converting the jclouds request to its request
>> object (see [1]).
>>
>> By looking at the other drivers (the default Java one and OkHttp),
>> both use that method to populate the Content-MD5 header (here you can
>> see what it does [2]) which does pretty much the same than what the
>> ApacheHC does *after*, by computing the hash again.
>>
>> Could you try removing the lines that rehash the stream and populate
>> the Content-MD5 header from the Apache HC driver, and add the
>> Content-MD5 header to the list of "allowed headers" in the first link?
>> I'm pretty sure that would work. And if that works, mind opening a
>> pull request with the fix?
>>
>>
>> HTH!
>>
>> I.
>>
>>
>> [1] 
>> https://github.com/jclouds/jclouds/blob/master/drivers/apachehc/src/main/java/org/jclouds/http/apachehc/ApacheHCUtils.java#L155-L162
>> [2] 
>> https://github.com/jclouds/jclouds/blob/master/core/src/main/java/org/jclouds/io/ContentMetadataCodec.java#L98-L99
>>
>> On 11 March 2015 at 17:22, Veit Guna <veit.g...@gmx.de> wrote:
>>> Hi.
>>>
>>> I have a problem with the ApacheHC driver using jclouds 1.8.1. I'm using it 
>>> to upload files
>>> to an S3 bucket. For the payload I'm using an InputStream that is not 
>>> resettable nor "rereadable".
>>> When I try to send the file via:
>>>
>>>         PayloadBlobBuilder blobBuilder = blobStore.blobBuilder("test")
>>>                 .payload(inputStream)
>>>                 .contentDisposition("attachment; filename=test")
>>>                 .contentType("application/octet-stream")
>>>                 .contentMD5(hash)
>>>                 .contentLength(file.length()
>>>                         );
>>>
>>> It dies with the exception below.
>>>
>>> A quick look at ApacheHCHttpCommandExecutorService shows:
>>>
>>>
>>>    @Override
>>>    protected HttpUriRequest convert(HttpRequest request) throws IOException 
>>> {
>>>       HttpUriRequest returnVal = 
>>> apacheHCUtils.convertToApacheRequest(request);
>>>       if (request.getPayload() != null && 
>>> request.getPayload().getContentMetadata().getContentMD5() != null) {
>>>          String md5 = 
>>> base64().encode(ByteStreams2.hashAndClose(request.getPayload().openStream(),
>>>  md5()).asBytes());
>>>          returnVal.addHeader("Content-MD5", md5);
>>>       }
>>>       return returnVal;
>>>    }
>>>
>>> That means, that if an MD5 is specified, it reads the whole(!) stream to 
>>> create his own MD5. Why is that? The "client" already
>>> supplied an MD5. So why hashing it again?
>>>
>>> Does that mean, using Md5 together with ApacheHC and non "rereadable" 
>>> streams isn't working at all? Is that by design?
>>> The normal JavaUrlHttp driver works like a charm though.
>>>
>>> Maybe someone could shed some light on this :)?
>>>
>>> Thanks!
>>> Veit
>>>
>>>
>>>
>>> Exception in thread "main" org.jclouds.http.HttpResponseException: null 
>>> connecting to PUT https://mybucket.s3-eu-west-1.amazonaws.com/test HTTP/1.1
>>>     at 
>>> org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:110)
>>>     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.rest.internal.DelegatesToInvocationFunction.handle(DelegatesToInvocationFunction.java:156)
>>>     at 
>>> org.jclouds.rest.internal.DelegatesToInvocationFunction.invoke(DelegatesToInvocationFunction.java:123)
>>>     at com.sun.proxy.$Proxy42.putObject(Unknown Source)
>>>     at org.jclouds.s3.blobstore.S3BlobStore.putBlob(S3BlobStore.java:235)
>>>     at 
>>> org.jclouds.aws.s3.blobstore.AWSS3BlobStore.putBlob(AWSS3BlobStore.java:95)
>>>     at org.jclouds.s3.blobstore.S3BlobStore.putBlob(S3BlobStore.java:213)
>>>     at org.jclouds.test.S3UploadTest.performUpload(S3UploadTest.java:71)
>>>     at org.jclouds.test.S3UploadTest.main(S3UploadTest.java:36)
>>> Caused by: org.apache.http.client.ClientProtocolException
>>>     at 
>>> org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:867)
>>>     at 
>>> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:115)
>>>     at 
>>> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
>>>     at 
>>> org.jclouds.http.apachehc.ApacheHCHttpCommandExecutorService.executeRequest(ApacheHCHttpCommandExecutorService.java:109)
>>>     at 
>>> org.jclouds.http.apachehc.ApacheHCHttpCommandExecutorService.invoke(ApacheHCHttpCommandExecutorService.java:78)
>>>     at 
>>> org.jclouds.http.apachehc.ApacheHCHttpCommandExecutorService.invoke(ApacheHCHttpCommandExecutorService.java:52)
>>>     at 
>>> org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:89)
>>>     ... 11 more
>>> Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot 
>>> retry request with a non-repeatable request entity.  The cause lists the 
>>> reason the original request failed.
>>>     at 
>>> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:659)
>>>     at 
>>> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:487)
>>>     at 
>>> org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
>>>     ... 17 more
>>> Caused by: java.io.IOException: Stream Closed
>>>     at java.io.FileInputStream.readBytes(Native Method)
>>>     at java.io.FileInputStream.read(FileInputStream.java:272)
>>>     at 
>>> org.apache.http.entity.InputStreamEntity.writeTo(InputStreamEntity.java:138)
>>>     at 
>>> org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:89)
>>>     at 
>>> org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
>>>     at 
>>> org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:117)
>>>     at 
>>> org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:265)
>>>     at 
>>> org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:231)
>>>     at 
>>> org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:236)
>>>     at 
>>> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121)
>>>     at 
>>> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:685)
>>>     ... 19 more
>>>
>>>
>>>
>>>
>
>

Reply via email to