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

Google InputStream blob upload ignores MD5

    XMLWordPrintableJSON

    Details

      Description

      According to [GCS blob upload documentation|https://cloud.google.com/storage/docs/xml-api/put-object-upload], when Content-MD5 header is provided, Google uses it to verify data integrity of an uploaded blob. This feature is crucial for us. We have a file upload functionality that takes an input stream and uploads it to a cloud via JClouds. We want to be sure that file integrity is enforced.

       

      JClouds blob builder allows to specify content MD5, but this value is ignored with InputStream payload, it's simply is not propagated into Content-MD5 header.

      Here is the code snippet to reproduce the issue:

      BlobStoreContext context = ContextBuilder.newBuilder("google-cloud-storage")
          .credentials(clientEmail, privateKey)
          .buildView(BlobStoreContext.class);
      
      // generate MD5 hash for some bogus content
      MessageDigest md5 = MessageDigest.getInstance("MD5");
      md5.update("bogus".getBytes());
      
      InputStream inputStream = new ByteArrayInputStream("hi".getBytes());
      
      BlobStore blobStore = context.getBlobStore();
      blobStore.putBlob(myContainer,
          blobStore.blobBuilder("test.txt")
              .payload(inputStream)
              .contentLength(2)
              .contentType("text/plain")
              .contentMD5(HashCode.fromBytes(md5.digest()))
              .build()); 

      putBlob should have failed, because payload is "hi", but MD5 is calculated for "bogus" string.

       

        Attachments

          Activity

            People

            • Assignee:
              gaul Andrew Gaul
              Reporter:
              achernavin Alexander Chernavin
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: