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 | |
| parent | vcxproj change for adding httpcommon.h (diff) | |
| download | zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.tar.xz zen-55d2b7526ea4b75b8b1beff6c099b304a1916c4e.zip | |
Added client implementation of CbPackage filter/transact
| -rw-r--r-- | zenhttp/httpclient.cpp | 63 | ||||
| -rw-r--r-- | zenhttp/include/zenhttp/httpclient.h | 12 | ||||
| -rw-r--r-- | zenserver-test/zenserver-test.cpp | 4 | ||||
| -rw-r--r-- | zenserver/testing/httptest.cpp | 10 |
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() |