[ 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)