diff options
| author | Stefan Boberg <[email protected]> | 2021-09-13 21:44:38 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-09-13 21:44:38 +0200 |
| commit | 55d2b7526ea4b75b8b1beff6c099b304a1916c4e (patch) | |
| tree | 1efe9a119f73496982ac6d75a0f357263309b895 /zenhttp/httpclient.cpp | |
| parent | vcxproj change for adding httpcommon.h (diff) | |
| download | zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.tar.xz zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.zip | |
Added client implementation of CbPackage filter/transact
Diffstat (limited to 'zenhttp/httpclient.cpp')
| -rw-r--r-- | zenhttp/httpclient.cpp | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/zenhttp/httpclient.cpp b/zenhttp/httpclient.cpp index fb31e0a8b..b7df12026 100644 --- a/zenhttp/httpclient.cpp +++ b/zenhttp/httpclient.cpp @@ -1,16 +1,33 @@ // Copyright Epic Games, Inc. All Rights Reserved. #include <zenhttp/httpclient.h> +#include <zenhttp/httpserver.h> #include <zencore/compactbinarybuilder.h> #include <zencore/compactbinarypackage.h> +#include <zencore/iobuffer.h> #include <zencore/logging.h> +#include <zencore/sharedbuffer.h> #include <zencore/stream.h> +#include "httpshared.h" + #include <doctest/doctest.h> +static std::atomic<uint32_t> HttpClientRequestIdCounter{0}; + namespace zen { +using namespace std::literals; + +HttpClient::Response +FromCprResponse(cpr::Response& InResponse) +{ + return {.StatusCode = InResponse.status_code}; +} + +////////////////////////////////////////////////////////////////////////// + HttpClient::HttpClient(std::string_view BaseUri) : m_BaseUri(BaseUri) { } @@ -19,7 +36,7 @@ HttpClient::~HttpClient() { } -void +HttpClient::Response HttpClient::TransactPackage(std::string_view Url, CbPackage Package) { cpr::Session Sess; @@ -30,6 +47,9 @@ HttpClient::TransactPackage(std::string_view Url, CbPackage Package) std::vector<IoHash> AttachmentsToSend; std::span<const CbAttachment> Attachments = Package.GetAttachments(); + const uint32_t RequestId = ++HttpClientRequestIdCounter; + auto RequestIdString = fmt::to_string(RequestId); + if (Attachments.empty() == false) { CbObjectWriter Writer; @@ -48,7 +68,8 @@ HttpClient::TransactPackage(std::string_view Url, CbPackage Package) BinaryWriter MemWriter(MemOut); Writer.Save(MemWriter); - Sess.SetHeader({{"Content-Type", "application/x-ue-offer"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", "1"}}); + Sess.SetHeader( + {{"Content-Type", "application/x-ue-offer"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", RequestIdString}}); Sess.SetBody(cpr::Body{(const char*)MemOut.Data(), MemOut.Size()}); cpr::Response FilterResponse = Sess.Post(); @@ -66,9 +87,10 @@ HttpClient::TransactPackage(std::string_view Url, CbPackage Package) } } + // Prepare package for send + CbPackage SendPackage; SendPackage.SetObject(Package.GetObject(), Package.GetObjectHash()); - ; for (const IoHash& AttachmentCid : AttachmentsToSend) { @@ -84,16 +106,39 @@ HttpClient::TransactPackage(std::string_view Url, CbPackage Package) } } + // Transmit package payload + + CompositeBuffer Message = FormatPackageMessageBuffer(SendPackage); + SharedBuffer FlatMessage = Message.Flatten(); + + Sess.SetHeader( + {{"Content-Type", "application/x-ue-cbpkg"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", RequestIdString}}); + Sess.SetBody(cpr::Body{(const char*)FlatMessage.GetData(), FlatMessage.GetSize()}); + + cpr::Response FilterResponse = Sess.Post(); + + if (!IsHttpSuccessCode(FilterResponse.status_code)) { - MemoryOutStream MemOut; - BinaryWriter MemWriter(MemOut); - SendPackage.Save(MemWriter); + return FromCprResponse(FilterResponse); + } - Sess.SetHeader({{"Content-Type", "application/x-ue-cbpkg"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", "1"}}); - Sess.SetBody(cpr::Body{(const char*)MemOut.Data(), MemOut.Size()}); + IoBuffer ResponseBuffer(IoBuffer::Clone, FilterResponse.text.data(), FilterResponse.text.size()); - cpr::Response FilterResponse = Sess.Post(); + if (auto It = FilterResponse.header.find("Content-Type"); It != FilterResponse.header.end()) + { + HttpContentType ContentType = ParseContentType(It->second); + + ResponseBuffer.SetContentType(ContentType); } + + return {.StatusCode = FilterResponse.status_code, .ResponsePayload = ResponseBuffer}; +} + +HttpClient::Response +HttpClient::Delete(std::string_view Url) +{ + ZEN_UNUSED(Url); + return {}; } ////////////////////////////////////////////////////////////////////////// |