S3ErrorMarshaller.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/core/client/AWSError.h>
  6. #include <aws/s3/S3ErrorMarshaller.h>
  7. #include <aws/s3/S3Errors.h>
  8. using namespace Aws::Client;
  9. using namespace Aws::S3;
  10. AWSError<CoreErrors> S3ErrorMarshaller::FindErrorByName(const char* errorName) const
  11. {
  12. AWSError<CoreErrors> error = S3ErrorMapper::GetErrorForName(errorName);
  13. if(error.GetErrorType() != CoreErrors::UNKNOWN)
  14. {
  15. return error;
  16. }
  17. return AWSErrorMarshaller::FindErrorByName(errorName);
  18. }
  19. Aws::String S3ErrorMarshaller::ExtractRegion(const AWSError<CoreErrors>& error) const
  20. {
  21. const auto& headers = error.GetResponseHeaders();
  22. const auto& iter = headers.find("x-amz-bucket-region");
  23. if (iter != headers.end())
  24. {
  25. return iter->second;
  26. }
  27. const Aws::Utils::Xml::XmlDocument& xmlDocument = GetXmlPayloadFromError(error);
  28. Aws::Utils::Xml::XmlNode xmlNode = xmlDocument.GetRootElement();
  29. if (!xmlNode.IsNull())
  30. {
  31. Aws::Utils::Xml::XmlNode regionNode = xmlNode.FirstChild("Region");
  32. if (!regionNode.IsNull())
  33. {
  34. return regionNode.GetText().c_str();
  35. }
  36. }
  37. // as a last choice, try finding region from endpoint.
  38. const auto& locIter = headers.find("location");
  39. if (locIter != headers.end())
  40. {
  41. Aws::Http::URI uri(locIter->second);
  42. auto authority = uri.GetAuthority();
  43. // virtual address example: <bucketname>.<[s3-]region>.amazonaws.com
  44. // path style example: <[s3]-region>.amazonaws.com/<bucketname>
  45. auto pos = authority.find(".amazonaws.com");
  46. if (pos == 0 || pos == std::string::npos)
  47. {
  48. return {};
  49. }
  50. auto endPos = pos - 1;
  51. while (pos > 0 && authority[pos - 1] != '.')
  52. {
  53. pos--;
  54. }
  55. auto region = authority.substr(pos, endPos + 1 - pos);
  56. if (region.compare(0, 3, "s3-") == 0)
  57. {
  58. region = region.substr(3);
  59. }
  60. if (region.compare(0, 5, "fips-") == 0)
  61. {
  62. region = region.substr(5);
  63. }
  64. return region;
  65. }
  66. return {};
  67. }
  68. Aws::String S3ErrorMarshaller::ExtractEndpoint(const AWSError<CoreErrors>& error) const
  69. {
  70. const auto& headers = error.GetResponseHeaders();
  71. const auto& iter = headers.find("location");
  72. if (iter != headers.end())
  73. {
  74. Aws::Http::URI uri(iter->second);
  75. return uri.GetAuthority();
  76. }
  77. const Aws::Utils::Xml::XmlDocument& xmlDocument = GetXmlPayloadFromError(error);
  78. Aws::Utils::Xml::XmlNode xmlNode = xmlDocument.GetRootElement();
  79. if (!xmlNode.IsNull())
  80. {
  81. Aws::Utils::Xml::XmlNode endpointNode = xmlNode.FirstChild("Endpoint");
  82. if (!endpointNode.IsNull())
  83. {
  84. Aws::Http::URI uri(endpointNode.GetText().c_str());
  85. return uri.GetAuthority();
  86. }
  87. }
  88. return {};
  89. }