aboutsummaryrefslogtreecommitdiff
path: root/zenhttp/httpclient.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-13 21:44:38 +0200
committerStefan Boberg <[email protected]>2021-09-13 21:44:38 +0200
commit55d2b7526ea4b75b8b1beff6c099b304a1916c4e (patch)
tree1efe9a119f73496982ac6d75a0f357263309b895 /zenhttp/httpclient.cpp
parentvcxproj change for adding httpcommon.h (diff)
downloadzen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.tar.xz
zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.zip
Added client implementation of CbPackage filter/transact
Diffstat (limited to 'zenhttp/httpclient.cpp')
-rw-r--r--zenhttp/httpclient.cpp63
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 {};
}
//////////////////////////////////////////////////////////////////////////