JCLOUDS-565: Fixes a bug with swift where the metadata is updated, but the content-type is reset to application/x-www-form-urlencoded.
Workaround: send an empty Content-Type header, only for the updateMetadata call. Re-commit of ac117fc with correct issue number. Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/0ab7dcbf Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/0ab7dcbf Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/0ab7dcbf Branch: refs/heads/1.7.x Commit: 0ab7dcbf76b37828ca10b080d587f7a2defab72a Parents: aae382f Author: Zack Shoylev <[email protected]> Authored: Mon May 12 23:15:08 2014 -0500 Committer: Andrew Phillips <[email protected]> Committed: Wed May 14 08:57:34 2014 -0400 ---------------------------------------------------------------------- .../openstack/swift/v1/features/ObjectApi.java | 2 ++ .../swift/v1/features/ObjectApiMockTest.java | 27 ++++++++++++++++++++ 2 files changed, 29 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/0ab7dcbf/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java index e56de7d..4c442fd 100644 --- a/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java +++ b/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/features/ObjectApi.java @@ -30,6 +30,7 @@ import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import org.jclouds.Fallbacks.FalseOnNotFoundOr404; import org.jclouds.Fallbacks.NullOnNotFoundOr404; @@ -173,6 +174,7 @@ public interface ObjectApi { @POST @Fallback(FalseOnNotFoundOr404.class) @Path("/{objectName}") + @Produces("") boolean updateMetadata(@PathParam("objectName") String objectName, @BinderParam(BindObjectMetadataToHeaders.class) Map<String, String> metadata); http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/0ab7dcbf/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java ---------------------------------------------------------------------- diff --git a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java index 7fe10b7..276a5e0 100644 --- a/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java +++ b/openstack-swift/src/test/java/org/jclouds/openstack/swift/v1/features/ObjectApiMockTest.java @@ -256,6 +256,33 @@ public class ObjectApiMockTest extends BaseOpenStackMockTest<SwiftApi> { } } + public void testUpdateMetadataContentType() throws Exception { + MockWebServer server = mockOpenStackServer(); + server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json")))); + server.enqueue(addCommonHeaders(objectResponse() + .addHeader(OBJECT_METADATA_PREFIX + "ApiName", "swift") + .addHeader(OBJECT_METADATA_PREFIX + "ApiVersion", "v1.1"))); + + try { + SwiftApi api = api(server.getUrl("/").toString(), "openstack-swift"); + assertTrue(api.objectApiInRegionForContainer("DFW", "myContainer").updateMetadata("myObject", metadata)); + + assertEquals(server.getRequestCount(), 2); + assertEquals(server.takeRequest().getRequestLine(), "POST /tokens HTTP/1.1"); + RecordedRequest replaceRequest = server.takeRequest(); + assertEquals(replaceRequest.getHeaders("Content-Type").get(0), "", "updateMetadata should send an empty content-type header, but sent " + + replaceRequest.getHeaders("Content-Type").get(0).toString()); + + assertEquals(replaceRequest.getRequestLine(), + "POST /v1/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9/myContainer/myObject HTTP/1.1"); + for (Entry<String, String> entry : metadata.entrySet()) { + assertEquals(replaceRequest.getHeader(OBJECT_METADATA_PREFIX + entry.getKey().toLowerCase()), entry.getValue()); + } + } finally { + server.shutdown(); + } + } + public void deleteMetadata() throws Exception { MockWebServer server = mockOpenStackServer(); server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
