Added additional information in StorageException, fixed a bug where ClientRequestId wasn't filled in StorageException. (#1455)

* additional info in storage exception

* changelog

* clang-format
This commit is contained in:
JinmingHu 2021-01-25 22:22:27 +08:00 committed by GitHub
parent a60fff1d6e
commit d2f29afb1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 0 deletions

View File

@ -2,10 +2,18 @@
## 12.0.0-beta.7 (Unreleased)
### New Features
- Added additional information in `StorageException`.
### Breaking Changes
- `AccountSasResource::BlobContainer` was renamed to `AccountSasResource::Container`.
### Bug Fixes
- Fixed `ClientRequestId` wasn't filled in `StorageException`.
## 12.0.0-beta.6 (2020-01-14)
### New Features

View File

@ -3,6 +3,7 @@
#pragma once
#include <map>
#include <memory>
#include <stdexcept>
#include <string>
@ -21,6 +22,7 @@ namespace Azure { namespace Storage {
std::string RequestId;
std::string ErrorCode;
std::string Message;
std::map<std::string, std::string> AdditionalInformation;
std::unique_ptr<Azure::Core::Http::RawResponse> RawResponse;
static StorageException CreateFromResponse(

View File

@ -34,6 +34,7 @@ namespace Azure { namespace Storage {
std::string errorCode;
std::string message;
std::map<std::string, std::string> additionalInformation;
if (response->GetHeaders().find(Details::HttpHeaderContentType) != response->GetHeaders().end())
{
@ -48,8 +49,10 @@ namespace Azure { namespace Storage {
XmlTagError,
XmlTagCode,
XmlTagMessage,
XmlTagUnknown,
};
std::vector<XmlTagName> path;
std::string startTagName;
while (true)
{
@ -60,6 +63,7 @@ namespace Azure { namespace Storage {
}
else if (node.Type == Details::XmlNodeType::EndTag)
{
startTagName.clear();
if (path.size() > 0)
{
path.pop_back();
@ -71,6 +75,7 @@ namespace Azure { namespace Storage {
}
else if (node.Type == Details::XmlNodeType::StartTag)
{
startTagName = node.Name;
if (std::strcmp(node.Name, "Error") == 0)
{
path.emplace_back(XmlTagName::XmlTagError);
@ -83,6 +88,10 @@ namespace Azure { namespace Storage {
{
path.emplace_back(XmlTagName::XmlTagMessage);
}
else
{
path.emplace_back(XmlTagName::XmlTagUnknown);
}
}
else if (node.Type == Details::XmlNodeType::Text)
{
@ -97,6 +106,15 @@ namespace Azure { namespace Storage {
{
message = node.Value;
}
else if (
path.size() == 2 && path[0] == XmlTagName::XmlTagError
&& path[1] == XmlTagName::XmlTagUnknown)
{
if (!startTagName.empty())
{
additionalInformation.emplace(std::move(startTagName), node.Value);
}
}
}
}
}
@ -129,9 +147,11 @@ namespace Azure { namespace Storage {
result.StatusCode = httpStatusCode;
result.ReasonPhrase = std::move(reasonPhrase);
result.RequestId = std::move(requestId);
result.ClientRequestId = std::move(clientRequestId);
result.ErrorCode = std::move(errorCode);
result.Message = std::move(message);
result.RawResponse = std::move(response);
result.AdditionalInformation = std::move(additionalInformation);
return result;
}
}} // namespace Azure::Storage

View File

@ -747,4 +747,46 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_EQ(1536, result.ClearRanges[1].Length.GetValue());
}
TEST_F(FileShareFileClientTest, StorageExceptionAdditionalInfo)
{
Azure::Storage::Files::Shares::ShareClientOptions options;
class InvalidQueryParameterPolicy : public Azure::Core::Http::HttpPolicy {
public:
~InvalidQueryParameterPolicy() override {}
std::unique_ptr<HttpPolicy> Clone() const override
{
return std::make_unique<InvalidQueryParameterPolicy>(*this);
}
std::unique_ptr<Core::Http::RawResponse> Send(
Core::Context const& ctx,
Core::Http::Request& request,
Core::Http::NextHttpPolicy nextHttpPolicy) const override
{
request.GetUrl().AppendQueryParameter("comp", "lease1");
return nextHttpPolicy.Send(ctx, request);
}
};
options.PerOperationPolicies.emplace_back(std::make_unique<InvalidQueryParameterPolicy>());
auto fileClient = Azure::Storage::Files::Shares::ShareFileClient::CreateFromConnectionString(
StandardStorageConnectionString(), m_shareName, RandomString(), options);
try
{
fileClient.Create(1024);
}
catch (StorageException& e)
{
EXPECT_NE(e.StatusCode, Azure::Core::Http::HttpStatusCode::None);
EXPECT_FALSE(e.ReasonPhrase.empty());
EXPECT_FALSE(e.ClientRequestId.empty());
EXPECT_FALSE(e.RequestId.empty());
EXPECT_FALSE(e.ErrorCode.empty());
EXPECT_FALSE(e.Message.empty());
EXPECT_FALSE(e.AdditionalInformation.empty());
return;
}
FAIL();
}
}}} // namespace Azure::Storage::Test