aboutsummaryrefslogtreecommitdiff
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
parentvcxproj change for adding httpcommon.h (diff)
downloadzen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.tar.xz
zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.zip
Added client implementation of CbPackage filter/transact
-rw-r--r--zenhttp/httpclient.cpp63
-rw-r--r--zenhttp/include/zenhttp/httpclient.h12
-rw-r--r--zenserver-test/zenserver-test.cpp4
-rw-r--r--zenserver/testing/httptest.cpp10
4 files changed, 77 insertions, 12 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 {};
}
//////////////////////////////////////////////////////////////////////////
diff --git a/zenhttp/include/zenhttp/httpclient.h b/zenhttp/include/zenhttp/httpclient.h
index 10829a58c..8975f6fe1 100644
--- a/zenhttp/include/zenhttp/httpclient.h
+++ b/zenhttp/include/zenhttp/httpclient.h
@@ -4,6 +4,9 @@
#include "zenhttp.h"
+#include <zencore/iobuffer.h>
+#include <zenhttp/httpcommon.h>
+
#include <zencore/windows.h>
// For some reason, these don't seem to stick, so we disable the warnings
@@ -27,7 +30,14 @@ public:
HttpClient(std::string_view BaseUri);
~HttpClient();
- void TransactPackage(std::string_view Url, CbPackage Package);
+ struct Response
+ {
+ int StatusCode = 0;
+ IoBuffer ResponsePayload;
+ };
+
+ [[nodiscard]] Response TransactPackage(std::string_view Url, CbPackage Package);
+ [[nodiscard]] Response Delete(std::string_view Url);
private:
std::string m_BaseUri;
diff --git a/zenserver-test/zenserver-test.cpp b/zenserver-test/zenserver-test.cpp
index 2711698c3..efcbf5da8 100644
--- a/zenserver-test/zenserver-test.cpp
+++ b/zenserver-test/zenserver-test.cpp
@@ -1486,8 +1486,8 @@ TEST_CASE("http.package")
TestPackage.AddAttachment(Attach1);
TestPackage.AddAttachment(Attach2);
- zen::HttpClient TestClient(BaseUri);
- TestClient.TransactPackage("/testing/package"sv, TestPackage);
+ zen::HttpClient TestClient(BaseUri);
+ zen::HttpClient::Response Response = TestClient.TransactPackage("/testing/package"sv, TestPackage);
}
#endif
diff --git a/zenserver/testing/httptest.cpp b/zenserver/testing/httptest.cpp
index 2d469c936..b44db2722 100644
--- a/zenserver/testing/httptest.cpp
+++ b/zenserver/testing/httptest.cpp
@@ -2,6 +2,8 @@
#include "httptest.h"
+#include <zencore/compactbinarypackage.h>
+
namespace zen {
HttpTestingService::HttpTestingService()
@@ -18,6 +20,14 @@ HttpTestingService::HttpTestingService()
Req.ServerRequest().WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Body);
},
HttpVerb::kPost);
+
+ m_Router.RegisterRoute(
+ "package",
+ [this](HttpRouterRequest& Req) {
+ CbPackage Pkg = Req.ServerRequest().ReadPayloadPackage();
+ Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Pkg);
+ },
+ HttpVerb::kPost);
}
HttpTestingService::~HttpTestingService()