aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2022-09-12 14:52:51 +0300
committera-romanov <Anton.Romanov@ydb.tech>2022-09-12 14:52:51 +0300
commitd03166a35c18b8c63294a8c8f4b124553b24c755 (patch)
tree338fd014565fb23b24111f84d765fc1cd929cf7c
parent2fe09e801e5d30bf9e3d105810729afae413161d (diff)
downloadydb-d03166a35c18b8c63294a8c8f4b124553b24c755.tar.gz
Hotfix.
-rw-r--r--ydb/library/yql/providers/common/http_gateway/yql_http_gateway.cpp25
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>;