diff options
| author | Dan Engelbrecht <[email protected]> | 2022-09-08 08:55:38 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-09-07 23:55:38 -0700 |
| commit | c96d28abc6c2c526295ec8ef9b7959b0ff862d23 (patch) | |
| tree | 7b1e116a3184bb38a47621660f11871c1cd254ff /zenserver/upstream/jupiter.cpp | |
| parent | Implement proper GetCacheValues upstream (#155) (diff) | |
| download | zen-c96d28abc6c2c526295ec8ef9b7959b0ff862d23.tar.xz zen-c96d28abc6c2c526295ec8ef9b7959b0ff862d23.zip | |
Added CloudCacheSession::GetInlineBlob to properly get CacheValues (#159)
* Added CloudCacheSession::GetInlineBlob to properly get CacheValues from Horde
Issue #UE-162151
* validate uncompressed binary from Horde "application/x-jupiter-inline" response
Diffstat (limited to 'zenserver/upstream/jupiter.cpp')
| -rw-r--r-- | zenserver/upstream/jupiter.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/zenserver/upstream/jupiter.cpp b/zenserver/upstream/jupiter.cpp index 65fa1da92..b82290f3d 100644 --- a/zenserver/upstream/jupiter.cpp +++ b/zenserver/upstream/jupiter.cpp @@ -181,6 +181,40 @@ CloudCacheSession::GetCompressedBlob(std::string_view Namespace, const IoHash& K } CloudCacheResult +CloudCacheSession::GetInlineBlob(std::string_view Namespace, std::string_view BucketId, const IoHash& Key, IoHash& OutPayloadHash) +{ + ZEN_TRACE_CPU("HordeClient::GetInlineBlob"); + + ExtendableStringBuilder<256> Uri; + Uri << m_CacheClient->ServiceUrl() << "/api/v1/refs/" << Namespace << "/" << BucketId << "/" << Key.ToHexString(); + + cpr::Session& Session = GetSession(); + const CloudCacheAccessToken& AccessToken = GetAccessToken(); + + Session.SetOption(cpr::Url{Uri.c_str()}); + Session.SetOption(cpr::Header{{"Authorization", AccessToken.Value}, {"Accept", "application/x-jupiter-inline"}}); + Session.SetOption(cpr::Body{}); + + cpr::Response Response = Session.Get(); + ZEN_DEBUG("GET {}", Response); + + if (Response.error) + { + return {.ErrorCode = static_cast<int32_t>(Response.error.code), .Reason = Response.error.message}; + } + else if (!VerifyAccessToken(Response.status_code)) + { + return {.ErrorCode = 401, .Reason = std::string("Invalid access token")}; + } + + const bool Success = Response.status_code == 200; + const IoBuffer Buffer = Success ? IoBufferBuilder::MakeCloneFromMemory(Response.text.data(), Response.text.size()) : IoBuffer(); + OutPayloadHash = IoHash::FromHexString(Response.header["X-Jupiter-InlinePayloadHash"]); + + return {.Response = Buffer, .Bytes = Response.downloaded_bytes, .ElapsedSeconds = Response.elapsed, .Success = Success}; +} + +CloudCacheResult CloudCacheSession::GetObject(std::string_view Namespace, const IoHash& Key) { ZEN_TRACE_CPU("HordeClient::GetObject"); |