diff --git a/OpenStack/OpenStack.Test/HttpAbstraction/HttpAbstractionClientTests.cs b/OpenStack/OpenStack.Test/HttpAbstraction/HttpAbstractionClientTests.cs index e56b485..114bb83 100644 --- a/OpenStack/OpenStack.Test/HttpAbstraction/HttpAbstractionClientTests.cs +++ b/OpenStack/OpenStack.Test/HttpAbstraction/HttpAbstractionClientTests.cs @@ -284,10 +284,13 @@ namespace OpenStack.Test.HttpAbstraction client.Uri = new Uri("http://httpbin.org/get"); client.Headers.Add("X-Test-Header","TEST"); + //Added in order to force httpbin not to cache the responses from any prior get requests/unit tests. + client.Headers.Add("Cache-Control", "max-age=0"); + var responseTask = client.SendAsync(); + responseTask.Wait(); var response = responseTask.Result; - Assert.IsNotNull(response); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); diff --git a/OpenStack/OpenStack.Test/Storage/StorageRestSimulator.cs b/OpenStack/OpenStack.Test/Storage/StorageRestSimulator.cs index dc23c60..e461cc8 100644 --- a/OpenStack/OpenStack.Test/Storage/StorageRestSimulator.cs +++ b/OpenStack/OpenStack.Test/Storage/StorageRestSimulator.cs @@ -51,6 +51,7 @@ namespace OpenStack.Test.Storage public void ProcessMetaDataFromHeaders(IDictionary headers) { headers.Keys.Where(k => k.ToLowerInvariant().StartsWith("x-object-meta-")).ToList().ForEach(i => this.MetaData.Add(i, headers[i])); + headers.Keys.Where(k => k.ToLowerInvariant().StartsWith("x-container-meta-")).ToList().ForEach(i => this.MetaData.Add(i, headers[i])); } public void LoadContent(Stream content) diff --git a/OpenStack/OpenStack.Test/Storage/StorageServiceRestClientTests.cs b/OpenStack/OpenStack.Test/Storage/StorageServiceRestClientTests.cs index 7bf1948..6e7468f 100644 --- a/OpenStack/OpenStack.Test/Storage/StorageServiceRestClientTests.cs +++ b/OpenStack/OpenStack.Test/Storage/StorageServiceRestClientTests.cs @@ -490,10 +490,10 @@ namespace OpenStack.Test.Storage Assert.AreEqual(HttpStatusCode.Created, resp.StatusCode); Assert.IsTrue(this.simulator.Containers.ContainsKey(containerName)); - Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Object-Meta-Test1")); - Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Object-Meta-Test2")); - Assert.AreEqual("Test1", this.simulator.Headers["X-Object-Meta-Test1"]); - Assert.AreEqual("Test2", this.simulator.Headers["X-Object-Meta-Test2"]); + Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Container-Meta-Test1")); + Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Container-Meta-Test2")); + Assert.AreEqual("Test1", this.simulator.Headers["X-Container-Meta-Test1"]); + Assert.AreEqual("Test2", this.simulator.Headers["X-Container-Meta-Test2"]); } [TestMethod] @@ -515,7 +515,7 @@ namespace OpenStack.Test.Storage Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode); Assert.IsTrue(this.simulator.Containers.ContainsKey(containerName)); - Assert.IsTrue(this.simulator.Containers[containerName].MetaData.ContainsKey("X-Object-Meta-Test1")); + Assert.IsTrue(this.simulator.Containers[containerName].MetaData.ContainsKey("X-Container-Meta-Test1")); } #endregion @@ -979,11 +979,12 @@ namespace OpenStack.Test.Storage Assert.AreEqual(HttpStatusCode.NotFound, resp.StatusCode); } + [TestMethod] public async Task CanUpdateAStorageContainer() { var containerName = "newContainer"; - var origMetaData = new Dictionary { { "X-Object-Meta-Test1", "Test1" } }; + var origMetaData = new Dictionary { { "X-Container-Meta-Test1", "Test1" } }; this.simulator.Containers.Add(containerName, new StorageRestSimulator.StorageItem(containerName) { MetaData = origMetaData }); @@ -993,12 +994,13 @@ namespace OpenStack.Test.Storage var metadata = new Dictionary { { "Test2", "Test2" } }; var resp = await client.UpdateContainer(containerName, metadata); - Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode); - Assert.IsTrue(resp.Headers.Any(kvp => kvp.Key == "X-Object-Meta-Test2")); - Assert.IsFalse(resp.Headers.Any(kvp => kvp.Key == "X-Object-Meta-Test1")); - Assert.AreEqual("Test2", resp.Headers.First(kvp => kvp.Key == "X-Object-Meta-Test2").Value.First()); + resp = await client.GetContainer(containerName); + + Assert.IsTrue(resp.Headers.Any(kvp => kvp.Key == "X-Container-Meta-Test2")); + Assert.IsFalse(resp.Headers.Any(kvp => kvp.Key == "X-Container-Meta-Test1")); + Assert.AreEqual("Test2", resp.Headers.First(kvp => kvp.Key == "X-Container-Meta-Test2").Value.First()); } #endregion diff --git a/OpenStack/OpenStack/Storage/StorageServiceRestClient.cs b/OpenStack/OpenStack/Storage/StorageServiceRestClient.cs index 35474b3..0024bb5 100644 --- a/OpenStack/OpenStack/Storage/StorageServiceRestClient.cs +++ b/OpenStack/OpenStack/Storage/StorageServiceRestClient.cs @@ -51,7 +51,7 @@ namespace OpenStack.Storage client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName); client.Method = HttpMethod.Put; - this.AddItemMetadata(metadata, client); + this.AddObjectMetadata(metadata, client); client.Content = content; @@ -73,7 +73,7 @@ namespace OpenStack.Storage client.Content = new MemoryStream(); client.Headers.Add("X-Object-Manifest", segmentsPath); - this.AddItemMetadata(metadata, client); + this.AddObjectMetadata(metadata, client); return await client.SendAsync(); } @@ -93,7 +93,7 @@ namespace OpenStack.Storage client.Method = HttpMethod.Put; client.Content = content; - this.AddItemMetadata(metadata, client); + this.AddObjectMetadata(metadata, client); return await client.SendAsync(); } @@ -109,7 +109,7 @@ namespace OpenStack.Storage client.Method = HttpMethod.Put; client.Content = new MemoryStream(); - this.AddItemMetadata(metadata, client); + this.AddContainerMetadata(metadata, client); return await client.SendAsync(); } @@ -194,7 +194,7 @@ namespace OpenStack.Storage client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName); client.Method = HttpMethod.Post; - AddItemMetadata(metadata,client); + AddObjectMetadata(metadata,client); return await client.SendAsync(); } @@ -208,7 +208,7 @@ namespace OpenStack.Storage client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName); client.Method = HttpMethod.Post; - AddItemMetadata(metadata, client); + AddContainerMetadata(metadata, client); return await client.SendAsync(); } @@ -282,18 +282,39 @@ namespace OpenStack.Storage } /// - /// Adds the appropriate heads to the Http client for the given items metadata. + /// Adds the appropriate headers to the Http client for the given items metadata. /// + /// The prefix for the header. /// The items metadata. /// The http client. - internal void AddItemMetadata( IDictionary metadata, IHttpAbstractionClient client) + internal void AddItemMetadata(string headerPrefix, IDictionary metadata, IHttpAbstractionClient client) { foreach (var header in metadata) { - client.Headers.Add(string.Format("X-Object-Meta-{0}", header.Key), header.Value); + client.Headers.Add(string.Format("{0}-{1}", headerPrefix, header.Key), header.Value); } } + /// + /// Adds the appropriate headers to the Http client for the given objects metadata. + /// + /// The items metadata. + /// The http client. + internal void AddObjectMetadata(IDictionary metadata, IHttpAbstractionClient client) + { + AddItemMetadata("X-Object-Meta", metadata, client); + } + + /// + /// Adds the appropriate headers to the Http client for the given containers metadata. + /// + /// The items metadata. + /// The http client. + internal void AddContainerMetadata(IDictionary metadata, IHttpAbstractionClient client) + { + AddItemMetadata("X-Container-Meta", metadata, client); + } + /// /// Asserts that the given container name is valid. ///