diff --git a/src/corelib/Core/IObjectStoreProvider.cs b/src/corelib/Core/IObjectStoreProvider.cs index 68c7c43ef..33db880f8 100644 --- a/src/corelib/Core/IObjectStoreProvider.cs +++ b/src/corelib/Core/IObjectStoreProvider.cs @@ -32,6 +32,11 @@ public interface IObjectStoreProvider void AddContainerHeaders(CloudIdentity identity, string container, Dictionary headers, string region = null, bool useInternalUrl = false); void AddContainerCdnHeaders(CloudIdentity identity, string container, Dictionary headers, string region = null, bool useInternalUrl = false); + void EnableStaticWebOnContainer(string container, string index, string error, string css, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null); + void EnableStaticWebOnContainer(string container, string index, string error, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null); + void EnableStaticWebOnContainer(string container, string css, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null); + void EnableStaticWebOnContainer(string container, string index, string error, string region = null, bool useInternalUrl = false, CloudIdentity identity = null); + void DisableStaticWebOnContainer(string container, string region = null, bool useInternalUrl = false, CloudIdentity identity = null); #endregion #region Container Objects diff --git a/src/corelib/Providers/Rackspace/ObjectStoreProvider.cs b/src/corelib/Providers/Rackspace/ObjectStoreProvider.cs index 7f39bdbae..15544a486 100644 --- a/src/corelib/Providers/Rackspace/ObjectStoreProvider.cs +++ b/src/corelib/Providers/Rackspace/ObjectStoreProvider.cs @@ -95,13 +95,13 @@ public ObjectStore DeleteContainer(CloudIdentity identity, string container, str return ObjectStore.Unknown; } - + public Dictionary GetContainerHeader(CloudIdentity identity, string container, string region = null, bool useInternalUrl = false) { _objectStoreHelper.ValidateContainerName(container); var urlPath = new Uri(string.Format("{0}/{1}", GetServiceEndpointCloudFiles(identity, region), container)); - var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.HEAD); + var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.HEAD); var processedHeaders = _objectStoreHelper.ProcessMetadata(response.Headers); @@ -178,15 +178,7 @@ public void AddContainerCdnHeaders(CloudIdentity identity, string container, Dic throw new ArgumentNullException(); } - bool cdnEnabled = false; - - var cdnHeaders = GetContainerCDNHeader(identity, container); - if (cdnHeaders.ContainsKey(ObjectStoreConstants.CdnEnabled)) - { - cdnEnabled = bool.Parse(cdnHeaders.FirstOrDefault(x => x.Key.Equals(ObjectStoreConstants.CdnEnabled, StringComparison.InvariantCultureIgnoreCase)).Value); - } - - if (!cdnEnabled) + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) { throw new CDNNotEnabledException(); } @@ -197,6 +189,22 @@ public void AddContainerCdnHeaders(CloudIdentity identity, string container, Dic } } + private bool IsContainerCdnEnabled(CloudIdentity identity, string container, string region, bool useInternalUrl) + { + bool cdnEnabled = false; + + var cdnHeaders = GetContainerCDNHeader(identity, container, region, useInternalUrl); + if (cdnHeaders.ContainsKey(ObjectStoreConstants.CdnEnabled)) + { + cdnEnabled = + bool.Parse( + cdnHeaders.FirstOrDefault( + x => x.Key.Equals(ObjectStoreConstants.CdnEnabled, StringComparison.InvariantCultureIgnoreCase)). + Value); + } + return cdnEnabled; + } + public IEnumerable ListCDNContainers(CloudIdentity identity, int? limit = null, string marker = null, string markerEnd = null, bool cdnEnabled = false, string region = null) { var urlPath = new Uri(string.Format("{0}", GetServiceEndpointCloudFilesCDN(identity, region))); @@ -264,7 +272,7 @@ public Dictionary EnableCDNOnContainer(CloudIdentity identity, s public Dictionary DisableCDNOnContainer(CloudIdentity identity, string container, string region = null) { _objectStoreHelper.ValidateContainerName(container); - + var headers = new Dictionary { @@ -280,6 +288,105 @@ public Dictionary DisableCDNOnContainer(CloudIdentity identity, return response.Headers.ToDictionary(header => header.Key, header => header.Value); } + public void EnableStaticWebOnContainer(string container, string index, string error, string css, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null) + { + _objectStoreHelper.ValidateContainerName(container); + + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) + { + throw new CDNNotEnabledException(); + } + else + { + var headers = new Dictionary + { + {ObjectStoreConstants.WebIndex, index}, + {ObjectStoreConstants.WebError, error}, + {ObjectStoreConstants.WebListingsCSS, css}, + {ObjectStoreConstants.WebListings, listing.ToString()} + }; + AddContainerHeaders(identity, container, headers, region, useInternalUrl); + } + } + + public void EnableStaticWebOnContainer(string container, string index, string error, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null) + { + _objectStoreHelper.ValidateContainerName(container); + + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) + { + throw new CDNNotEnabledException(); + } + else + { + var headers = new Dictionary + { + {ObjectStoreConstants.WebIndex, index}, + {ObjectStoreConstants.WebError, error}, + {ObjectStoreConstants.WebListings, listing.ToString()} + }; + AddContainerHeaders(identity, container, headers, region, useInternalUrl); + } + } + + public void EnableStaticWebOnContainer(string container, string css, bool listing, string region = null, bool useInternalUrl = false, CloudIdentity identity = null) + { + _objectStoreHelper.ValidateContainerName(container); + + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) + { + throw new CDNNotEnabledException(); + } + else + { + var headers = new Dictionary + { + {ObjectStoreConstants.WebListingsCSS, css}, + {ObjectStoreConstants.WebListings, listing.ToString()} + }; + AddContainerHeaders(identity, container, headers, region, useInternalUrl); + } + } + + public void EnableStaticWebOnContainer(string container, string index, string error, string region = null, bool useInternalUrl = false, CloudIdentity identity = null) + { + _objectStoreHelper.ValidateContainerName(container); + + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) + { + throw new CDNNotEnabledException(); + } + else + { + var headers = new Dictionary + { + {ObjectStoreConstants.WebIndex, index}, + {ObjectStoreConstants.WebError, error} + }; + AddContainerHeaders(identity, container, headers, region, useInternalUrl); + } + } + + public void DisableStaticWebOnContainer(string container, string region = null, bool useInternalUrl = false, CloudIdentity identity = null) + { + _objectStoreHelper.ValidateContainerName(container); + + if (!IsContainerCdnEnabled(identity, container, region, useInternalUrl)) + { + throw new CDNNotEnabledException(); + } + else + { + var headers = new Dictionary + { + {ObjectStoreConstants.WebIndex, string.Empty}, + {ObjectStoreConstants.WebError, string.Empty}, + {ObjectStoreConstants.WebListingsCSS, string.Empty}, + {ObjectStoreConstants.WebListings, string.Empty} + }; + AddContainerHeaders(identity, container, headers, region, useInternalUrl); + } + } #endregion @@ -313,7 +420,7 @@ public IEnumerable GetObjects(CloudIdentity identity, string co return response.Data; } - public Dictionary GetObjectHeaders(CloudIdentity identity, string container, string objectName, string format = "json", string region = null) + public Dictionary GetObjectHeaders(CloudIdentity identity, string container, string objectName, string format = "json", string region = null) { _objectStoreHelper.ValidateContainerName(container); _objectStoreHelper.ValidateObjectName(objectName); @@ -404,7 +511,7 @@ public void GetObject(string container, string objectName, Stream outputStream, var convertedMd5 = sbuilder.ToString(); if (convertedMd5 != response.Headers.First(h => h.Key.Equals(ObjectStoreConstants.Etag, StringComparison.OrdinalIgnoreCase)).Value.ToLower()) { - + throw new InvalidETagException(); } } @@ -472,8 +579,8 @@ public ObjectStore CopyObject(CloudIdentity identity, string sourceContainer, st headers.Add(ObjectStoreConstants.ContentLength, contentLength); } - - headers.Add(ObjectStoreConstants.CopyFrom,string.Format("{0}/{1}",sourceContainer,sourceObjectName)); + + headers.Add(ObjectStoreConstants.CopyFrom, string.Format("{0}/{1}", sourceContainer, sourceObjectName)); var urlPath = new Uri(string.Format("{0}/{1}/{2}", GetServiceEndpointCloudFiles(identity, region), destinationContainer, destinationObjectName)); @@ -493,7 +600,7 @@ public Dictionary GetObjectMetaData(string container, string obj _objectStoreHelper.ValidateObjectName(objectName); var urlPath = new Uri(string.Format("{0}/{1}/{2}", GetServiceEndpointCloudFiles(identity, region), container, objectName)); - var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.HEAD); + var response = ExecuteRESTRequest(identity, urlPath, HttpMethod.HEAD); var processedHeaders = _objectStoreHelper.ProcessMetadata(response.Headers); diff --git a/src/testing/integration/Providers/Rackspace/ObjectStoreTests.cs b/src/testing/integration/Providers/Rackspace/ObjectStoreTests.cs index 52dec773f..c19d69533 100644 --- a/src/testing/integration/Providers/Rackspace/ObjectStoreTests.cs +++ b/src/testing/integration/Providers/Rackspace/ObjectStoreTests.cs @@ -323,6 +323,104 @@ public void Should_Make_Container_CDN_Disabled() Assert.IsFalse(bool.Parse(cdnContainerHeaderResponse.Where(x => x.Key.Equals("X-Cdn-Enabled", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value)); } + [TestMethod] + public void Should_Enable_Static_Web_On_Container_With_Index_Error_CSS_And_Listing_As_True() + { + const string containerName = "DarkKnight"; + const string webIndex = "index.html"; + const string webError = "error.html"; + const string webListingsCSS = "index.css"; + const bool webListing = true; + + var provider = new ObjectStoreProvider(); + //var cdnEnabledResponse = provider.EnableCDNOnContainer(_testIdentity, containerName, true); + + provider.EnableStaticWebOnContainer(containerName, webIndex, webError, webListingsCSS, webListing, null, false, _testIdentity); + var cdnContainerMetaDataResponse = provider.GetContainerMetaData(_testIdentity, containerName); + + Assert.AreEqual(webIndex, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("Web-index", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.AreEqual(webError, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-error", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.AreEqual(webListingsCSS, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-listings-css", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.IsTrue(bool.Parse(cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-listings", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value)); + + } + + [TestMethod] + public void Should_Enable_Static_Web_On_Container_With_CSS_And_Listing_As_True() + { + const string containerName = "DarkKnight"; + const string webListingsCSS = "index.css"; + const bool webListing = true; + + var provider = new ObjectStoreProvider(); + //var cdnEnabledResponse = provider.EnableCDNOnContainer(_testIdentity, containerName, true); + + provider.EnableStaticWebOnContainer(containerName, webListingsCSS, webListing, null, false, _testIdentity); + var cdnContainerMetaDataResponse = provider.GetContainerMetaData(_testIdentity, containerName); + + Assert.AreEqual(webListingsCSS, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-listings-css", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.IsTrue(bool.Parse(cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-listings", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value)); + + } + + [TestMethod] + public void Should_Enable_Static_Web_On_Container_With_Index_Error_And_Listing_As_True() + { + const string containerName = "DarkKnight"; + const string webIndex = "index.html"; + const string webError = "error.html"; + const bool webListing = true; + + var provider = new ObjectStoreProvider(); + //var cdnEnabledResponse = provider.EnableCDNOnContainer(_testIdentity, containerName, true); + + provider.EnableStaticWebOnContainer(containerName, webIndex, webError, webListing, null, false, _testIdentity); + var cdnContainerMetaDataResponse = provider.GetContainerMetaData(_testIdentity, containerName); + + Assert.AreEqual(webIndex, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("Web-index", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.AreEqual(webError, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-error", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.IsTrue(bool.Parse(cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-listings", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value)); + + } + + [TestMethod] + public void Should_Enable_Static_Web_On_Container_With_Index_And_Error() + { + const string containerName = "DarkKnight"; + const string webIndex = "index.html"; + const string webError = "error.html"; + + var provider = new ObjectStoreProvider(); + //var cdnEnabledResponse = provider.EnableCDNOnContainer(_testIdentity, containerName, true); + + provider.EnableStaticWebOnContainer(containerName, webIndex, webError, null, false, _testIdentity); + var cdnContainerMetaDataResponse = provider.GetContainerMetaData(_testIdentity, containerName); + + Assert.AreEqual(webIndex, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("Web-index", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + Assert.AreEqual(webError, cdnContainerMetaDataResponse.Where(x => x.Key.Equals("web-error", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().Value); + } + + [TestMethod] + public void Should_Disable_Static_Web_On_Container() + { + const string containerName = "DarkKnight"; + + var provider = new ObjectStoreProvider(); + //var cdnEnabledResponse = provider.EnableCDNOnContainer(_testIdentity, containerName, true); + + provider.DisableStaticWebOnContainer(containerName, null, false, _testIdentity); + var cdnContainerMetaDataResponse = provider.GetContainerMetaData(_testIdentity, containerName); + + + Assert.IsFalse(cdnContainerMetaDataResponse.ContainsKey("Web-Index")); + Assert.IsFalse(cdnContainerMetaDataResponse.ContainsKey("Web-Error")); + Assert.IsFalse(cdnContainerMetaDataResponse.ContainsKey("Web-Listings-Css")); + Assert.IsFalse(cdnContainerMetaDataResponse.ContainsKey("Web-Listings")); + + } + + + #endregion Container Tests #region Object Tests