aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp')
-rw-r--r--contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp b/contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp
new file mode 100644
index 0000000000..a4e8756d27
--- /dev/null
+++ b/contrib/libs/aws-sdk-cpp/aws-cpp-sdk-s3/source/model/SelectObjectContentHandler.cpp
@@ -0,0 +1,271 @@
+/**
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0.
+ */
+
+#include <aws/s3/model/SelectObjectContentHandler.h>
+#include <aws/s3/S3ErrorMarshaller.h>
+#include <aws/core/client/CoreErrors.h>
+#include <aws/core/utils/event/EventStreamErrors.h>
+#include <aws/core/utils/logging/LogMacros.h>
+#include <aws/core/utils/xml/XmlSerializer.h>
+
+using namespace Aws::S3::Model;
+using namespace Aws::Utils::Event;
+using namespace Aws::Utils::Xml;
+
+namespace Aws
+{
+namespace S3
+{
+namespace Model
+{
+ using namespace Aws::Client;
+
+ static const char SELECTOBJECTCONTENT_HANDLER_CLASS_TAG[] = "SelectObjectContentHandler";
+
+ SelectObjectContentHandler::SelectObjectContentHandler() : EventStreamHandler()
+ {
+ m_onRecordsEvent = [&](const RecordsEvent&)
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "RecordsEvent received.");
+ };
+
+ m_onStatsEvent = [&](const StatsEvent&)
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "StatsEvent received.");
+ };
+
+ m_onProgressEvent = [&](const ProgressEvent&)
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "ProgressEvent received.");
+ };
+
+ m_onContinuationEvent = [&]()
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "ContinuationEvent received.");
+ };
+
+ m_onEndEvent = [&]()
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "EndEvent received.");
+ };
+
+ m_onError = [&](const AWSError<S3Errors>& error)
+ {
+ AWS_LOGSTREAM_TRACE(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "S3 Errors received, " << error);
+ };
+ }
+
+ void SelectObjectContentHandler::OnEvent()
+ {
+ // Handler internal error during event stream decoding.
+ if (!*this)
+ {
+ AWSError<CoreErrors> error = EventStreamErrorsMapper::GetAwsErrorForEventStreamError(GetInternalError());
+ error.SetMessage(GetEventPayloadAsString());
+ m_onError(AWSError<S3Errors>(error));
+ return;
+ }
+
+ const auto& headers = GetEventHeaders();
+ auto messageTypeHeaderIter = headers.find(MESSAGE_TYPE_HEADER);
+ if (messageTypeHeaderIter == headers.end())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Header: " << MESSAGE_TYPE_HEADER << " not found in the message.");
+ return;
+ }
+
+ switch (Aws::Utils::Event::Message::GetMessageTypeForName(messageTypeHeaderIter->second.GetEventHeaderValueAsString()))
+ {
+ case Aws::Utils::Event::Message::MessageType::EVENT:
+ HandleEventInMessage();
+ break;
+ case Aws::Utils::Event::Message::MessageType::REQUEST_LEVEL_ERROR:
+ case Aws::Utils::Event::Message::MessageType::REQUEST_LEVEL_EXCEPTION:
+ {
+ HandleErrorInMessage();
+ break;
+ }
+ default:
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG,
+ "Unexpected message type: " << messageTypeHeaderIter->second.GetEventHeaderValueAsString());
+ break;
+ }
+ }
+
+ void SelectObjectContentHandler::HandleEventInMessage()
+ {
+ const auto& headers = GetEventHeaders();
+ auto eventTypeHeaderIter = headers.find(EVENT_TYPE_HEADER);
+ if (eventTypeHeaderIter == headers.end())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Header: " << EVENT_TYPE_HEADER << " not found in the message.");
+ return;
+ }
+ switch (SelectObjectContentEventMapper::GetSelectObjectContentEventTypeForName(eventTypeHeaderIter->second.GetEventHeaderValueAsString()))
+ {
+ case SelectObjectContentEventType::RECORDS:
+ {
+ RecordsEvent event(GetEventPayloadWithOwnership());
+ m_onRecordsEvent(event);
+ break;
+ }
+ case SelectObjectContentEventType::STATS:
+ {
+ auto xmlDoc = XmlDocument::CreateFromXmlString(GetEventPayloadAsString());
+ if (!xmlDoc.WasParseSuccessful())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Unable to generate a proper StatsEvent object from the response in XML format.");
+ break;
+ }
+
+ m_onStatsEvent(StatsEvent(xmlDoc.GetRootElement()));
+ break;
+ }
+ case SelectObjectContentEventType::PROGRESS:
+ {
+ auto xmlDoc = XmlDocument::CreateFromXmlString(GetEventPayloadAsString());
+ if (!xmlDoc.WasParseSuccessful())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Unable to generate a proper ProgressEvent object from the response in XML format.");
+ break;
+ }
+
+ m_onProgressEvent(ProgressEvent(xmlDoc.GetRootElement()));
+ break;
+ }
+ case SelectObjectContentEventType::CONT:
+ {
+ m_onContinuationEvent();
+ break;
+ }
+ case SelectObjectContentEventType::END:
+ {
+ m_onEndEvent();
+ break;
+ }
+ default:
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG,
+ "Unexpected event type: " << eventTypeHeaderIter->second.GetEventHeaderValueAsString());
+ break;
+ }
+ }
+
+ void SelectObjectContentHandler::HandleErrorInMessage()
+ {
+ const auto& headers = GetEventHeaders();
+ Aws::String errorCode;
+ Aws::String errorMessage;
+ auto errorHeaderIter = headers.find(ERROR_CODE_HEADER);
+ if (errorHeaderIter == headers.end())
+ {
+ errorHeaderIter = headers.find(EXCEPTION_TYPE_HEADER);
+ if (errorHeaderIter == headers.end())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG,
+ "Error type was not found in the event message.");
+ return;
+ }
+ }
+
+ errorCode = errorHeaderIter->second.GetEventHeaderValueAsString();
+ errorHeaderIter = headers.find(ERROR_MESSAGE_HEADER);
+ if (errorHeaderIter == headers.end())
+ {
+ errorHeaderIter = headers.find(EXCEPTION_TYPE_HEADER);
+ if (errorHeaderIter == headers.end())
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG,
+ "Error description was not found in the event message.");
+ return;
+ }
+ }
+ errorMessage = errorHeaderIter->second.GetEventHeaderValueAsString();
+ MarshallError(errorCode, errorMessage);
+ }
+
+ void SelectObjectContentHandler::MarshallError(const Aws::String& errorCode, const Aws::String& errorMessage)
+ {
+ S3ErrorMarshaller errorMarshaller;
+ AWSError<CoreErrors> error;
+
+ if (errorCode.empty())
+ {
+ error = AWSError<CoreErrors>(CoreErrors::UNKNOWN, "", errorMessage, false);
+ }
+ else
+ {
+ error = errorMarshaller.FindErrorByName(errorMessage.c_str());
+ if (error.GetErrorType() != CoreErrors::UNKNOWN)
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Encountered AWSError '" << errorCode.c_str() << "': " << errorMessage.c_str());
+ error.SetExceptionName(errorCode);
+ error.SetMessage(errorMessage);
+ }
+ else
+ {
+ AWS_LOGSTREAM_WARN(SELECTOBJECTCONTENT_HANDLER_CLASS_TAG, "Encountered Unknown AWSError '" << errorCode.c_str() << "': " << errorMessage.c_str());
+ error = AWSError<CoreErrors>(CoreErrors::UNKNOWN, errorCode, "Unable to parse ExceptionName: " + errorCode + " Message: " + errorMessage, false);
+ }
+ }
+
+ m_onError(AWSError<S3Errors>(error));
+ }
+
+namespace SelectObjectContentEventMapper
+{
+ static const int RECORDS_HASH = Aws::Utils::HashingUtils::HashString("Records");
+ static const int STATS_HASH = Aws::Utils::HashingUtils::HashString("Stats");
+ static const int PROGRESS_HASH = Aws::Utils::HashingUtils::HashString("Progress");
+ static const int CONT_HASH = Aws::Utils::HashingUtils::HashString("Cont");
+ static const int END_HASH = Aws::Utils::HashingUtils::HashString("End");
+
+ SelectObjectContentEventType GetSelectObjectContentEventTypeForName(const Aws::String& name)
+ {
+ int hashCode = Aws::Utils::HashingUtils::HashString(name.c_str());
+ if (hashCode == RECORDS_HASH)
+ {
+ return SelectObjectContentEventType::RECORDS;
+ }
+ else if (hashCode == STATS_HASH)
+ {
+ return SelectObjectContentEventType::STATS;
+ }
+ else if (hashCode == PROGRESS_HASH)
+ {
+ return SelectObjectContentEventType::PROGRESS;
+ }
+ else if (hashCode == CONT_HASH)
+ {
+ return SelectObjectContentEventType::CONT;
+ }
+ else if (hashCode == END_HASH)
+ {
+ return SelectObjectContentEventType::END;
+ }
+ return SelectObjectContentEventType::UNKNOWN;
+ }
+
+ Aws::String GetNameForSelectObjectContentEventType(SelectObjectContentEventType value)
+ {
+ switch (value)
+ {
+ case SelectObjectContentEventType::RECORDS:
+ return "Records";
+ case SelectObjectContentEventType::STATS:
+ return "Stats";
+ case SelectObjectContentEventType::PROGRESS:
+ return "Progress";
+ case SelectObjectContentEventType::CONT:
+ return "Cont";
+ case SelectObjectContentEventType::END:
+ return "End";
+ default:
+ return "Unknown";
+ }
+ }
+} // namespace SelectObjectContentEventMapper
+} // namespace Model
+} // namespace S3
+} // namespace Aws