diff --git a/worker/api/cpp/src/server_data_broker.cpp b/worker/api/cpp/src/server_data_broker.cpp index 3db20c6660efb2df45cc8bc13ab256bc6f300737..887c9bfc77d97156c77cdbf1bb07a629eff37233 100644 --- a/worker/api/cpp/src/server_data_broker.cpp +++ b/worker/api/cpp/src/server_data_broker.cpp @@ -56,31 +56,46 @@ std::string GetIDFromJson(const std::string& json_string, Error* err) { return std::to_string(id); } -Error ServerDataBroker::GetFileInfoFromServer(FileInfo* info, const std::string& operation) { +void ServerDataBroker::ProcessServerError(Error* err,const std::string& response,std::string* redirect_uri) { + if ((*err)->GetErrorType() != asapo::ErrorType::kEndOfFile) { + (*err)->Append(response); + return; + } else { + if (response.find("id") != std::string::npos) { + auto id = GetIDFromJson(response, err); + if (*err) { + return; + } + *redirect_uri = server_uri_ + "/database/" + source_name_ + "/" + id; + } + } + *err=nullptr; + return; +} + +Error ServerDataBroker::ProcessRequest(std::string* response,std::string request_uri) { Error err; HttpCode code; - std::string full_uri = server_uri_ + "/database/" + source_name_ + "/" + operation; - std::string response; + *response = httpclient__->Get(request_uri, &code, &err); + if (err != nullptr) { + return err; + } + return HttpCodeToWorkerError(code); +} + +Error ServerDataBroker::GetFileInfoFromServer(FileInfo* info, const std::string& operation) { + std::string request_uri = server_uri_ + "/database/" + source_name_ + "/" + operation; uint64_t elapsed_ms = 0; + std::string response; while (true) { - response = httpclient__->Get(full_uri, &code, &err); - if (err != nullptr) { - return err; + auto err = ProcessRequest(&response,request_uri); + if (err == nullptr) { + break; } - err = HttpCodeToWorkerError(code); - if (err == nullptr) break; - if (err->GetErrorType() != asapo::ErrorType::kEndOfFile) { - err->Append(response); + ProcessServerError(&err,response,&request_uri); + if (err != nullptr) { return err; - } else { - if (response.find("id") != std::string::npos) { - auto id = GetIDFromJson(response, &err); - if (err) { - return err; - } - full_uri = server_uri_ + "/database/" + source_name_ + "/" + id; - } } if (elapsed_ms >= timeout_ms_) { diff --git a/worker/api/cpp/src/server_data_broker.h b/worker/api/cpp/src/server_data_broker.h index 36d277deb0cc7660b9ef1d259da4626223b8ec28..f17ce25c30bff2362c8c84f25094e63b5c566312 100644 --- a/worker/api/cpp/src/server_data_broker.h +++ b/worker/api/cpp/src/server_data_broker.h @@ -20,6 +20,8 @@ class ServerDataBroker final : public asapo::DataBroker { std::unique_ptr<HttpClient> httpclient__; private: Error GetFileInfoFromServer(FileInfo* info, const std::string& operation); + void ProcessServerError(Error* err,const std::string& response,std::string* redirect_uri); + Error ProcessRequest(std::string* response,std::string request_uri); std::string server_uri_; std::string source_name_; uint64_t timeout_ms_ = 0;