private static StorageException Create(int httpStatusCode, XElement extendedErrorElement) { // Unfortunately, the RequestResult properties are all internal-only settable. ReadXml is the only way to // create a populated RequestResult instance. XElement requestResultElement = new XElement("RequestResult", new XElement("HTTPStatusCode", httpStatusCode), new XElement("HttpStatusMessage"), new XElement("TargetLocation"), new XElement("ServiceRequestID"), new XElement("ContentMd5"), new XElement("Etag"), new XElement("RequestDate"), new XElement("StartTime", DateTime.Now), new XElement("EndTime", DateTime.Now), extendedErrorElement); RequestResult result = new RequestResult(); using (XmlReader reader = requestResultElement.CreateReader()) { result.ReadXml(reader); } return new StorageException(result, null, null); }
public static RequestResult TranslateFromExceptionMessage(string message) { RequestResult res = new RequestResult(); using (XmlReader reader = XmlReader.Create(new StringReader(message))) { res.ReadXml(reader); } return(res); }
public void RequestResultVerifyXml() { Uri baseAddressUri = new Uri(TestBase.TargetTenantConfig.BlobServiceEndpoint); CloudBlobClient blobClient = new CloudBlobClient(baseAddressUri, TestBase.StorageCredentials); CloudBlobContainer container = blobClient.GetContainerReference(Guid.NewGuid().ToString("N")); RequestResult retrResult = new RequestResult(); OperationContext opContext = new OperationContext(); Assert.IsNull(opContext.LastResult); container.Exists(null, opContext); Assert.IsNotNull(opContext.LastResult); // We do not have precision at milliseconds level. Hence, we need // to recreate the start DateTime to be able to compare it later. DateTime start = opContext.LastResult.StartTime; start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second); DateTime end = opContext.LastResult.EndTime; end = new DateTime(end.Year, end.Month, end.Day, end.Hour, end.Minute, end.Second); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; StringBuilder sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb, settings)) { opContext.LastResult.WriteXml(writer); } using (XmlReader reader = XmlReader.Create(new StringReader(sb.ToString()))) { retrResult.ReadXml(reader); } Assert.AreEqual(opContext.LastResult.RequestDate, retrResult.RequestDate); Assert.AreEqual(opContext.LastResult.ServiceRequestID, retrResult.ServiceRequestID); Assert.AreEqual(start, retrResult.StartTime); Assert.AreEqual(end, retrResult.EndTime); Assert.AreEqual(opContext.LastResult.HttpStatusCode, retrResult.HttpStatusCode); Assert.AreEqual(opContext.LastResult.HttpStatusMessage, retrResult.HttpStatusMessage); }
public static RequestResult TranslateFromExceptionMessage(string message) { RequestResult res = new RequestResult(); using (XmlReader reader = XmlReader.Create(new StringReader(message))) { res.ReadXml(reader); } return res; }
private StorageException GetSimulatedStorageTransientErrorDetectionStrategy(string errorString) { string requestResultAsXml = String.Format("<RequestResult><HTTPStatusCode>500</HTTPStatusCode><HttpStatusMessage>fake status message</HttpStatusMessage><TargetLocation>Primary</TargetLocation><ServiceRequestID>fake requestId</ServiceRequestID><ContentMd5>fake md5</ContentMd5><Etag>fake etag</Etag><RequestDate>fake request date</RequestDate><StartTime>{1}</StartTime><EndTime>{1}</EndTime><ExtendedErrorInformation><Code>{0}</Code></ExtendedErrorInformation></RequestResult>", errorString, DateTime.UtcNow); RequestResult requestResult = new RequestResult(); XmlTextReader reader = new XmlTextReader(new StringReader(requestResultAsXml)); requestResult.ReadXml(reader); Exception innerException = null; return new StorageException(requestResult, "Simulated StorageException", innerException); }
public void RequestResultErrorCode() { Uri baseAddressUri = new Uri(TestBase.TargetTenantConfig.BlobServiceEndpoint); CloudBlobClient client = new CloudBlobClient(baseAddressUri, TestBase.StorageCredentials); CloudBlobContainer container = client.GetContainerReference(Guid.NewGuid().ToString("N")); byte[] buffer = TestBase.GetRandomBuffer(4 * 1024 * 1024); MD5 md5 = MD5.Create(); string contentMD5 = Convert.ToBase64String(md5.ComputeHash(buffer)); try { RequestResult requestResult; XmlWriterSettings settings; StringBuilder sb; container.Create(); CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); List <string> blocks = new List <string>(); for (int i = 0; i < 2; i++) { blocks.Add(Convert.ToBase64String(Guid.NewGuid().ToByteArray())); } // Verify the ErrorCode property is set and that it is serialized correctly using (MemoryStream memoryStream = new MemoryStream(buffer)) { memoryStream.Seek(0, SeekOrigin.Begin); blob.PutBlock(blocks[0], memoryStream, contentMD5); int offset = buffer.Length - 1024; memoryStream.Seek(offset, SeekOrigin.Begin); StorageException e = TestHelper.ExpectedException <StorageException>( () => blob.PutBlock(blocks[1], memoryStream, contentMD5), "Invalid MD5 should fail with mismatch"); Assert.AreEqual(e.RequestInformation.ErrorCode, StorageErrorCodeStrings.Md5Mismatch); requestResult = new RequestResult(); settings = new XmlWriterSettings(); settings.Indent = true; sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb, settings)) { e.RequestInformation.WriteXml(writer); } using (XmlReader reader = XmlReader.Create(new StringReader(sb.ToString()))) { requestResult.ReadXml(reader); } // ExtendedErrorInformation.ErrorCode will be depricated, but it should still match on a non HEAD request Assert.AreEqual(e.RequestInformation.ErrorCode, requestResult.ErrorCode); Assert.AreEqual(e.RequestInformation.ExtendedErrorInformation.ErrorCode, requestResult.ErrorCode); } // Verify the ErrorCode property is set on a HEAD request CloudAppendBlob blob2 = container.GetAppendBlobReference("blob2"); blob2.CreateOrReplace(); StorageException e2 = TestHelper.ExpectedException <StorageException>( () => blob2.FetchAttributes(AccessCondition.GenerateIfMatchCondition("garbage")), "Mismatched etag should fail"); Assert.AreEqual(e2.RequestInformation.ErrorCode, StorageErrorCodeStrings.ConditionNotMet); // Verify the ErrorCode property is not set on a successful request and that it is serialized correctly OperationContext ctx = new OperationContext(); blob2.FetchAttributes(operationContext: ctx); Assert.AreEqual(ctx.RequestResults[0].ErrorCode, null); requestResult = new RequestResult(); settings = new XmlWriterSettings(); settings.Indent = true; sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb, settings)) { ctx.RequestResults[0].WriteXml(writer); } using (XmlReader reader = XmlReader.Create(new StringReader(sb.ToString()))) { requestResult.ReadXml(reader); } Assert.AreEqual(ctx.RequestResults[0].ErrorCode, requestResult.ErrorCode); } finally { container.DeleteIfExists(); } }
public void RequestResultVerifyXml() { Uri baseAddressUri = new Uri(TestBase.TargetTenantConfig.BlobServiceEndpoint); CloudBlobClient blobClient = new CloudBlobClient(baseAddressUri, TestBase.StorageCredentials); CloudBlobContainer container = blobClient.GetContainerReference(Guid.NewGuid().ToString("N")); OperationContext opContext = new OperationContext(); Assert.IsNull(opContext.LastResult); container.Exists(null, opContext); Assert.IsNotNull(opContext.LastResult); // We do not have precision at milliseconds level. Hence, we need // to recreate the start DateTime to be able to compare it later. DateTime start = opContext.LastResult.StartTime; start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second); DateTime end = opContext.LastResult.EndTime; end = new DateTime(end.Year, end.Month, end.Day, end.Hour, end.Minute, end.Second); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; StringBuilder sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb, settings)) { opContext.LastResult.WriteXml(writer); } RequestResult retrResult = new RequestResult(); using (XmlReader reader = XmlReader.Create(new StringReader(sb.ToString()))) { retrResult.ReadXml(reader); } Assert.AreEqual(opContext.LastResult.RequestDate, retrResult.RequestDate); Assert.AreEqual(opContext.LastResult.ServiceRequestID, retrResult.ServiceRequestID); Assert.AreEqual(start, retrResult.StartTime); Assert.AreEqual(end, retrResult.EndTime); Assert.AreEqual(opContext.LastResult.HttpStatusCode, retrResult.HttpStatusCode); Assert.AreEqual(opContext.LastResult.HttpStatusMessage, retrResult.HttpStatusMessage); Assert.AreEqual(opContext.LastResult.ContentMd5, retrResult.ContentMd5); Assert.AreEqual(opContext.LastResult.Etag, retrResult.Etag); // Now test with no indentation sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb)) { opContext.LastResult.WriteXml(writer); } retrResult = new RequestResult(); using (XmlReader reader = XmlReader.Create(new StringReader(sb.ToString()))) { retrResult.ReadXml(reader); } Assert.AreEqual(opContext.LastResult.RequestDate, retrResult.RequestDate); Assert.AreEqual(opContext.LastResult.ServiceRequestID, retrResult.ServiceRequestID); Assert.AreEqual(start, retrResult.StartTime); Assert.AreEqual(end, retrResult.EndTime); Assert.AreEqual(opContext.LastResult.HttpStatusCode, retrResult.HttpStatusCode); Assert.AreEqual(opContext.LastResult.HttpStatusMessage, retrResult.HttpStatusMessage); Assert.AreEqual(opContext.LastResult.ContentMd5, retrResult.ContentMd5); Assert.AreEqual(opContext.LastResult.Etag, retrResult.Etag); }