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

Andrew Gaul updated JCLOUDS-1633:
---------------------------------
    Labels: google-cloud-storage  (was: )

> Google cloud storage handles content-encoding incorrectly
> ---------------------------------------------------------
>
>                 Key: JCLOUDS-1633
>                 URL: https://issues.apache.org/jira/browse/JCLOUDS-1633
>             Project: jclouds
>          Issue Type: Bug
>          Components: jclouds-blobstore
>    Affects Versions: 2.5.0
>            Reporter: Maksim Hadalau
>            Priority: Major
>              Labels: google-cloud-storage
>
> Steps to reproduce:
> 1. upload blob with Content-Encoding: gzip (content must be compressed on 
> user side)
> 2. verify that both getBlobMetadata and GCS UI shows correct object (stored 
> size == compressed size) and metadata returns Content-Encoding: gzip
> 3. Download blob using getBlob() and try to decompress payload
> As result - decompression - failed because payload is not GZIP
> Problem location
> GoogleCloudStorageBlobStore.java
> {code:java}
> @Override
> public Blob getBlob(String container, String name, GetOptions options) {
>    GoogleCloudStorageObject gcsObject = 
> api.getObjectApi().getObject(container, Strings2.urlEncode(name));
> // here metadata contains a correct value for Content-Encoding: gzip
>    if (gcsObject == null) {
>       return null;
>    }
>    org.jclouds.http.options.GetOptions httpOptions = 
> blob2ObjectGetOptions.apply(options);
>    MutableBlobMetadata metadata = objectToBlobMetadata.apply(gcsObject);
>    Blob blob = new BlobImpl(metadata);
>    // TODO: Does getObject not get the payload?!
>    // Payload metadata returns Content-Encoding: null, due to google cloud 
> storage API, by default they do auto-decompression. If user want to download 
> compressed content - we should provide Accept-Encoding: gzip header. Which is 
> not possible right now (see GetOptions.class)
>    Payload payload = api.getObjectApi().download(container, 
> Strings2.urlEncode(name), httpOptions).getPayload();
>    // replacing payload metadata with object metadata is incorrect
>    // metadata contains Content-Encoding:gzip, but without providing 
> Accept-Encoding header payload metadata returned in decompressed form 
> (Content-Encoding: null)
>    payload.setContentMetadata(metadata.getContentMetadata()); // Doing this 
> first retains it on setPayload.
>    blob.setPayload(payload);
>    return blob;
> } {code}
> How to fix?
> We should not replace payload metadata with object metadata(content encoding 
> at least) and extend GetOptions class with ability to provide 
> headers(Accept-Encoding in my case), or write a logic that will add 
> Accept-Encoding header if object metadata contains Content-Encoding header.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to