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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user