[
https://issues.apache.org/jira/browse/JCLOUDS-1400?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrew Gaul resolved JCLOUDS-1400.
----------------------------------
Resolution: Fixed
Fix Version/s: 2.1.1
2.2.0
> GCS's presigned url requires blank Content-Type
> -----------------------------------------------
>
> Key: JCLOUDS-1400
> URL: https://issues.apache.org/jira/browse/JCLOUDS-1400
> Project: jclouds
> Issue Type: Bug
> Components: jclouds-blobstore
> Affects Versions: 2.1.0
> Reporter: Ivan Orlov
> Assignee: Andrew Gaul
> Priority: Major
> Fix For: 2.2.0, 2.1.1
>
>
> I am trying to signPutBlob for google cloud storage.
> 1)
> {code:java}
> BlobStoreContext context = ContextBuilder.newBuilder("google-cloud-storage")
> .credentials(GOOGLE_ACCESS_KEY, GOOGLE_SECRET_KEY)
> .buildView(BlobStoreContext.class);
> BlobStore blobStore = context.getBlobStore();
> Blob blob = blobStore
> .blobBuilder("3.png")
> .forSigning()
> .contentLength(20493)
> .contentType(MediaType.PNG) // setting contentType
> .build();
> HttpRequest httpRequest = context
> .getSigner()
> .signPutBlob("cs-29337eeb-27c1-4dbc-805c-f01ba1744eb1", blob, 3600);
> {code}
> 2)
> {code:java}
> PUT
> http://storage.googleapis.com/cs-29337eeb-27c1-4dbc-805c-f01ba1744eb1/3.png?Expires=1523454042&GoogleAccessId=access-s3%40storage-app-199609.iam.gserviceaccount.com&Signature=Aoam8qw0NYIDGDKBW4PpJXPklchTndaFwk4syrw0/K4c50hrDZFKG/oARWn1nSEKqRZlBuh2BBQtRSRNNH7Ol6Qhybo%2BX1hst7PxkaUue2iQwR%2B/t8p4izl%2BTGEJ99x2KdYsZb3Q7CmJvWkPlJ27KUGdVyJf/tTDGYwtE2uekXFxMu9r355N5RsBWBftW8kKnOaZBFsjO/q25bYs%2BAa/gQ01HfoQdDSPCYZ5QZST5G1vXYLuRcxYs3Hb33N3s5hq07/Nnopoai7CtrPKR1iSm766fzMaqZaSihXAQzCge5F25esML0kUkKvK%2BQBdFESD433Y1%2B33vg%2BZ9xvVlV3UlA%3D%3D
> HTTP/1.1
> Headers:
> Content-Type: image/png{code}
>
> Response:
> {code:java}
> <?xml version='1.0' encoding='UTF-8'?>
> <Error>
> <Code>SignatureDoesNotMatch</Code>
> <Message>The request signature we calculated does not match the signature you
> provided. Check your Google secret key and signing method.</Message>
> <StringToSign>PUT
> image/png
> 1523454042
> /cs-29337eeb-27c1-4dbc-805c-f01ba1744eb1/3.png</StringToSign>
> </Error>
> {code}
>
> 3) With no passed content-type it becomes text/plain
> {code:java}
> <?xml version='1.0' encoding='UTF-8'?>
> <Error>
> <Code>SignatureDoesNotMatch</Code>
> <Message>The request signature we calculated does not match the signature you
> provided. Check your Google secret key and signing method.</Message>
> <StringToSign>PUT
> text/plain
> 1523454042
> /cs-29337eeb-27c1-4dbc-805c-f01ba1744eb1/3.png</StringToSign>
> </Error>
> {code}
>
>
> 4) And with passed _Content-Type: ""_ it's okay.
>
> 5) GoogleCloudStorageBlobRequestSigner.java
> {code:java}
> @Override
> public HttpRequest signPutBlob(String container, Blob blob, long
> timeInSeconds) {
> return sign("PUT", container, blob.getMetadata().getName(),
> GetOptions.NONE, timestamp.get() + timeInSeconds, null);
> }
> private HttpRequest sign(String method, String container, String name,
> GetOptions options, long expires, String contentType) {
> checkNotNull(container, "container");
> checkNotNull(name, "name");
> ...
> }
> {code}
> Why is the last parameter "contentType" always null? We could read it from
> the blob, from
> {code:java}
> blob.getMetadata().getContentMetadata().getContentType();{code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)