aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2022-09-16 17:48:25 +0300
committera-romanov <Anton.Romanov@ydb.tech>2022-09-16 17:48:25 +0300
commit5e727bfc30a793941d168ef1e511ae4ebd344511 (patch)
tree02cec220e4e5c561d9e32a801a21abddd57a897b
parent1874940c915d71c35c6efa3529135fd80af8ed69 (diff)
downloadydb-5e727bfc30a793941d168ef1e511ae4ebd344511.tar.gz
Fix get Etag on HTTP/1.1
-rw-r--r--ydb/library/yql/providers/s3/actors/CMakeLists.txt1
-rw-r--r--ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp13
2 files changed, 6 insertions, 8 deletions
diff --git a/ydb/library/yql/providers/s3/actors/CMakeLists.txt b/ydb/library/yql/providers/s3/actors/CMakeLists.txt
index 931067348e2..8463a5dd374 100644
--- a/ydb/library/yql/providers/s3/actors/CMakeLists.txt
+++ b/ydb/library/yql/providers/s3/actors/CMakeLists.txt
@@ -21,6 +21,7 @@ target_link_libraries(providers-s3-actors PUBLIC
yutil
contrib-libs-fmt
libs-poco-Util
+ cpp-actors-http
cpp-string_utils-base64
cpp-string_utils-quote
cpp-xml-document
diff --git a/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp b/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp
index ef7658508a3..1974a528cc8 100644
--- a/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp
+++ b/ydb/library/yql/providers/s3/actors/yql_s3_write_actor.cpp
@@ -13,6 +13,7 @@
#include <library/cpp/actors/core/event_local.h>
#include <library/cpp/actors/core/hfunc.h>
#include <library/cpp/actors/core/log.h>
+#include <library/cpp/actors/http/http.h>
#include <library/cpp/string_utils/base64/base64.h>
#include <library/cpp/string_utils/quote/quote.h>
@@ -199,16 +200,12 @@ private:
switch (response.index()) {
case 0U: {
const auto& str = std::get<IHTTPGateway::TContent>(response).Headers;
-
- if (const auto p = str.find("etag: \""); p != TString::npos) {
- if (const auto p1 = p + 7, p2 = str.find("\"", p1); p2 != TString::npos) {
- actorSystem->Send(new IEventHandle(selfId, selfId, new TEvPrivate::TEvUploadPartFinished(size, index, str.substr(p1, p2 - p1))));
- break;
- }
+ if (const NHttp::THeaders headers(str.substr(str.rfind("HTTP/"))); headers.Has("Etag"))
+ actorSystem->Send(new IEventHandle(selfId, selfId, new TEvPrivate::TEvUploadPartFinished(size, index, TString(headers.Get("Etag")))));
+ else
+ actorSystem->Send(new IEventHandle(parentId, selfId, new TEvPrivate::TEvUploadError({TIssue(TStringBuilder() << "Unexpected response:" << Endl << str)})));
}
- actorSystem->Send(new IEventHandle(parentId, selfId, new TEvPrivate::TEvUploadError({TIssue(TStringBuilder() << "Unexpected response:" << Endl << str)})));
break;
- }
case 1U:
actorSystem->Send(new IEventHandle(parentId, selfId, new TEvPrivate::TEvUploadError(std::get<TIssues>(std::move(response)))));
break;