diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2022-09-12 14:52:51 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2022-09-12 14:52:51 +0300 |
commit | d03166a35c18b8c63294a8c8f4b124553b24c755 (patch) | |
tree | 338fd014565fb23b24111f84d765fc1cd929cf7c | |
parent | 2fe09e801e5d30bf9e3d105810729afae413161d (diff) | |
download | ydb-d03166a35c18b8c63294a8c8f4b124553b24c755.tar.gz |
Hotfix.
-rw-r--r-- | ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp b/ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp index 56fc30dad1..314fe2a498 100644 --- a/ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp +++ b/ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp @@ -373,6 +373,8 @@ public: } if (Working = !Working) SkipTo(Position); + else + LastHttpResponseCode = 0L; return Working ? EAction::Work : EAction::Stop; } @@ -386,7 +388,8 @@ public: private: void Fail(const TIssue& error) final { Working = false; - return OnFinish(TIssues{error}); + if (!Cancelled) + OnFinish(TIssues{error}); } void Done(CURLcode result, long) final { @@ -394,20 +397,23 @@ private: return Fail(TIssue(curl_easy_strerror(result))); Working = false; - return OnFinish(TIssues()); + if (!Cancelled) + OnFinish(TIssues()); } size_t Write(void* contents, size_t size, size_t nmemb) final { - if (!StreamStarted) { - StreamStarted = true; - long httpResponseCode = 0L; - curl_easy_getinfo(GetHandle(), CURLINFO_RESPONSE_CODE, &httpResponseCode); - OnStart(httpResponseCode); + if (!LastHttpResponseCode) { + curl_easy_getinfo(GetHandle(), CURLINFO_RESPONSE_CODE, &LastHttpResponseCode); + if (!FirstHttpResponseCode) + OnStart(FirstHttpResponseCode = LastHttpResponseCode); + else if (FirstHttpResponseCode != LastHttpResponseCode) + Cancel(TIssue(TStringBuilder() << "HTTP response has been changed from " << FirstHttpResponseCode << " to " << LastHttpResponseCode)); } const auto realsize = size * nmemb; Position += realsize; - OnNewData(IHTTPGateway::TCountedContent(TString(static_cast<char*>(contents), realsize), Counter)); + if (!Cancelled) + OnNewData(IHTTPGateway::TCountedContent(TString(static_cast<char*>(contents), realsize), Counter)); return realsize; } @@ -422,7 +428,8 @@ private: bool Working = false; size_t Position = 0ULL; bool Cancelled = false; - bool StreamStarted = false; + long FirstHttpResponseCode = 0L; + long LastHttpResponseCode = 0L; }; using TKeyType = std::tuple<TString, size_t, IHTTPGateway::THeaders, TString, IRetryPolicy<long>::TPtr>; |