You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@jclouds.apache.org by "Erik Ebert (Jira)" <ji...@apache.org> on 2021/06/18 05:29:00 UTC

[jira] [Created] (JCLOUDS-1580) BlobStore.blobMetadata().getUserMetadata() returns empty Map when cloud provider returns lowercase metadata headers

Erik Ebert created JCLOUDS-1580:
-----------------------------------

             Summary: BlobStore.blobMetadata().getUserMetadata() returns empty Map when cloud provider returns lowercase metadata headers
                 Key: JCLOUDS-1580
                 URL: https://issues.apache.org/jira/browse/JCLOUDS-1580
             Project: jclouds
          Issue Type: Bug
          Components: jclouds-blobstore
    Affects Versions: 2.3.0
            Reporter: Erik Ebert


I believe this is happening because jclouds/swift is specifically looking for user metadata with the prefix "X-Object-Meta-", case SENSITIVE:

X-Object-Meta-foo

 

But since header names are case-INSENSITIVE. per RFC 2616, this fails if the cloud provider returns header names in lower case: 

x-object-meta-foo

 

I discovered this while using "openstack-swift" to access SAP's Converged Cloud, but it would affect any cloud provider that returns lower-case header names.   

 

In my case, this is an example of what is returned by Converged Cloud:

curl <object url> --head -H "X-Auth-Token:<token>"

HTTP/1.1 200 OK
 content-type: application/octet-stream
 *x-object-meta-original-created-time*: 1623984822180
 *x-object-meta-content-md5*: rREHajOaHzUiU8DQoap9NA==
 etag: xxxxx
 last-modified: Fri, 18 Jun 2021 02:53:53 GMT
 x-timestamp: 1623984832.86825
 accept-ranges: bytes
 content-length: 12
 x-trans-id: xxxx
 x-openstack-request-id: xxxxx
 date: Fri, 18 Jun 2021 03:16:46 GMT

 

Sample jclouds code:

 
{code:java}
BlobStoreContext blobStoreContext =
 ContextBuilder.newBuilder(PROVIDER)
 .endpoint(ENDPOINT)
 .credentials(INDENTITY, CREDENTIAL)
 .overrides(overrides)
 .buildApi(BlobStoreContext.class);

BlobStore blobStore = blobStoreContext.getBlobStore();

BlobMetadata blobMetadata = blobStore.blobMetadata(CONTAINER, PATH);

Map<String, String> userMetadata = blobMetadata.getUserMetadata()

System.out.println(userMetadata.toString())
 
{code}
 

blobMetadata.getUserMetadata() SHOULD return something like:

*original-created-time*: 1623984822180
 *content-md5*: rREHajOaHzUiU8DQoap9NA==

(or similar), but instead it returns an empty Map object.

 

Stepping through the code, I believe the source of the problem is line 41 of  EntriesWithoutMetaPrefix.java:

[https://github.com/apache/jclouds/blob/0b89ee0825d45de1193090cdd5efc5f1135fa200/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/functions/EntriesWithoutMetaPrefix.java]

 

Partial stack trace from the code example above:
{code:java}
    at org.jclouds.openstack.swift.v1.functions.EntriesWithoutMetaPrefix.apply(EntriesWithoutMetaPrefix.java:41)
   at org.jclouds.openstack.swift.v1.functions.ParseObjectFromResponse.apply(ParseObjectFromResponse.java:81)
   at org.jclouds.openstack.swift.v1.functions.ParseObjectFromResponse.apply(ParseObjectFromResponse.java:41)
   at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:91)
   at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:74)
   at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:45)
   at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
   at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:86)
   at com.sun.proxy.$Proxy199.getWithoutBody(Unknown Source:-1)

{code}
 

I believe the fix would be to change line 41 of EntriesWithoutMetaPrefix.java from

int index = header.getKey().indexOf("-Meta-");

to something like:

int index = header.getKey()*.toLowerCase()*.indexOf("*-meta-*");

 
{code:java}
 41c41
<       int index = header.getKey().indexOf("-Meta-");
---
>       int index = header.getKey().toLowerCase().indexOf("-meta-");
{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)