Uploaded image for project: 'jclouds'
  1. jclouds
  2. JCLOUDS-1633

Google cloud storage handles content-encoding incorrectly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 2.5.0
    • None
    • jclouds-blobstore
    • None

    Description

      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

      @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;
      } 

      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.

       

      Attachments

        Activity

          People

            Unassigned Unassigned
            hmaksim Maksim Hadalau
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: