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.Uri = new Uri("http://httpbin.org/get");
|
||||||
client.Headers.Add("X-Test-Header","TEST");
|
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();
|
var responseTask = client.SendAsync();
|
||||||
|
|
||||||
responseTask.Wait();
|
responseTask.Wait();
|
||||||
var response = responseTask.Result;
|
var response = responseTask.Result;
|
||||||
|
|
||||||
Assert.IsNotNull(response);
|
Assert.IsNotNull(response);
|
||||||
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
|
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ namespace OpenStack.Test.Storage
|
|||||||
public void ProcessMetaDataFromHeaders(IDictionary<string, string> headers)
|
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-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)
|
public void LoadContent(Stream content)
|
||||||
|
|||||||
@@ -490,10 +490,10 @@ namespace OpenStack.Test.Storage
|
|||||||
Assert.AreEqual(HttpStatusCode.Created, resp.StatusCode);
|
Assert.AreEqual(HttpStatusCode.Created, resp.StatusCode);
|
||||||
Assert.IsTrue(this.simulator.Containers.ContainsKey(containerName));
|
Assert.IsTrue(this.simulator.Containers.ContainsKey(containerName));
|
||||||
|
|
||||||
Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Object-Meta-Test1"));
|
Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Container-Meta-Test1"));
|
||||||
Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Object-Meta-Test2"));
|
Assert.IsTrue(this.simulator.Headers.ContainsKey("X-Container-Meta-Test2"));
|
||||||
Assert.AreEqual("Test1", this.simulator.Headers["X-Object-Meta-Test1"]);
|
Assert.AreEqual("Test1", this.simulator.Headers["X-Container-Meta-Test1"]);
|
||||||
Assert.AreEqual("Test2", this.simulator.Headers["X-Object-Meta-Test2"]);
|
Assert.AreEqual("Test2", this.simulator.Headers["X-Container-Meta-Test2"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@@ -515,7 +515,7 @@ namespace OpenStack.Test.Storage
|
|||||||
|
|
||||||
Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode);
|
Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode);
|
||||||
Assert.IsTrue(this.simulator.Containers.ContainsKey(containerName));
|
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
|
#endregion
|
||||||
@@ -979,11 +979,12 @@ namespace OpenStack.Test.Storage
|
|||||||
Assert.AreEqual(HttpStatusCode.NotFound, resp.StatusCode);
|
Assert.AreEqual(HttpStatusCode.NotFound, resp.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
public async Task CanUpdateAStorageContainer()
|
public async Task CanUpdateAStorageContainer()
|
||||||
{
|
{
|
||||||
var containerName = "newContainer";
|
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 });
|
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 metadata = new Dictionary<string, string> { { "Test2", "Test2" } };
|
||||||
|
|
||||||
var resp = await client.UpdateContainer(containerName, metadata);
|
var resp = await client.UpdateContainer(containerName, metadata);
|
||||||
|
|
||||||
Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode);
|
Assert.AreEqual(HttpStatusCode.Accepted, resp.StatusCode);
|
||||||
|
|
||||||
Assert.IsTrue(resp.Headers.Any(kvp => kvp.Key == "X-Object-Meta-Test2"));
|
resp = await client.GetContainer(containerName);
|
||||||
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());
|
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
|
#endregion
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ namespace OpenStack.Storage
|
|||||||
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName);
|
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName);
|
||||||
client.Method = HttpMethod.Put;
|
client.Method = HttpMethod.Put;
|
||||||
|
|
||||||
this.AddItemMetadata(metadata, client);
|
this.AddObjectMetadata(metadata, client);
|
||||||
|
|
||||||
client.Content = content;
|
client.Content = content;
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ namespace OpenStack.Storage
|
|||||||
client.Content = new MemoryStream();
|
client.Content = new MemoryStream();
|
||||||
|
|
||||||
client.Headers.Add("X-Object-Manifest", segmentsPath);
|
client.Headers.Add("X-Object-Manifest", segmentsPath);
|
||||||
this.AddItemMetadata(metadata, client);
|
this.AddObjectMetadata(metadata, client);
|
||||||
|
|
||||||
return await client.SendAsync();
|
return await client.SendAsync();
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ namespace OpenStack.Storage
|
|||||||
client.Method = HttpMethod.Put;
|
client.Method = HttpMethod.Put;
|
||||||
client.Content = content;
|
client.Content = content;
|
||||||
|
|
||||||
this.AddItemMetadata(metadata, client);
|
this.AddObjectMetadata(metadata, client);
|
||||||
|
|
||||||
return await client.SendAsync();
|
return await client.SendAsync();
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ namespace OpenStack.Storage
|
|||||||
client.Method = HttpMethod.Put;
|
client.Method = HttpMethod.Put;
|
||||||
client.Content = new MemoryStream();
|
client.Content = new MemoryStream();
|
||||||
|
|
||||||
this.AddItemMetadata(metadata, client);
|
this.AddContainerMetadata(metadata, client);
|
||||||
|
|
||||||
return await client.SendAsync();
|
return await client.SendAsync();
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ namespace OpenStack.Storage
|
|||||||
|
|
||||||
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName);
|
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName, objectName);
|
||||||
client.Method = HttpMethod.Post;
|
client.Method = HttpMethod.Post;
|
||||||
AddItemMetadata(metadata,client);
|
AddObjectMetadata(metadata,client);
|
||||||
|
|
||||||
return await client.SendAsync();
|
return await client.SendAsync();
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@ namespace OpenStack.Storage
|
|||||||
|
|
||||||
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName);
|
client.Uri = CreateRequestUri(this.Context.PublicEndpoint, containerName);
|
||||||
client.Method = HttpMethod.Post;
|
client.Method = HttpMethod.Post;
|
||||||
AddItemMetadata(metadata, client);
|
AddContainerMetadata(metadata, client);
|
||||||
|
|
||||||
return await client.SendAsync();
|
return await client.SendAsync();
|
||||||
}
|
}
|
||||||
@@ -282,18 +282,39 @@ namespace OpenStack.Storage
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// </summary>
|
||||||
|
/// <param name="headerPrefix">The prefix for the header.</param>
|
||||||
/// <param name="metadata">The items metadata.</param>
|
/// <param name="metadata">The items metadata.</param>
|
||||||
/// <param name="client">The http client.</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)
|
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>
|
/// <summary>
|
||||||
/// Asserts that the given container name is valid.
|
/// Asserts that the given container name is valid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user