Fix for Bug#1342913

Updated the REST client to send the correct "X-Container-Meta" header instead of using "X-Object-Meta".
Updated related unit tests, and rest simulator to use the right header values.
Updated the http abstraction unit tests to ensure that httpbin does not cache it's response headers.

Closes-Bug: #1342913
Change-Id: I020b21313da1ba77b37bbbe0cffb8c4f320f8ce6
This commit is contained in:
Wayne Foley
2014-07-25 14:40:20 -07:00
parent 2675cd745b
commit ae3b0fbe19
4 changed files with 47 additions and 20 deletions

View File

@@ -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);

View File

@@ -51,6 +51,7 @@ namespace OpenStack.Test.Storage
public void ProcessMetaDataFromHeaders(IDictionary<string, string> 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)

View File

@@ -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<string, string> { { "X-Object-Meta-Test1", "Test1" } };
var origMetaData = new Dictionary<string, string> { { "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<string, string> { { "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

View File

@@ -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
}
/// <summary>
/// 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.
/// </summary>
/// <param name="headerPrefix">The prefix for the header.</param>
/// <param name="metadata">The items metadata.</param>
/// <param name="client">The http client.</param>
internal void AddItemMetadata( IDictionary<string, string> metadata, IHttpAbstractionClient client)
internal void AddItemMetadata(string headerPrefix, IDictionary<string, string> 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);
}
}
/// <summary>
/// Adds the appropriate headers to the Http client for the given objects metadata.
/// </summary>
/// <param name="metadata">The items metadata.</param>
/// <param name="client">The http client.</param>
internal void AddObjectMetadata(IDictionary<string, string> metadata, IHttpAbstractionClient client)
{
AddItemMetadata("X-Object-Meta", metadata, client);
}
/// <summary>
/// Adds the appropriate headers to the Http client for the given containers metadata.
/// </summary>
/// <param name="metadata">The items metadata.</param>
/// <param name="client">The http client.</param>
internal void AddContainerMetadata(IDictionary<string, string> metadata, IHttpAbstractionClient client)
{
AddItemMetadata("X-Container-Meta", metadata, client);
}
/// <summary>
/// Asserts that the given container name is valid.
/// </summary>