1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
// Copyright Epic Games, Inc. All Rights Reserved.
#include <zenhttp/httpclient.h>
#include <zencore/compactbinarybuilder.h>
#include <zencore/compactbinarypackage.h>
#include <zencore/logging.h>
#include <zencore/stream.h>
#include <doctest/doctest.h>
namespace zen {
HttpClient::HttpClient(std::string_view BaseUri) : m_BaseUri(BaseUri)
{
}
HttpClient::~HttpClient()
{
}
void
HttpClient::TransactPackage(std::string_view Url, CbPackage Package)
{
cpr::Session Sess;
Sess.SetUrl(m_BaseUri + std::string(Url));
// First, list of offered chunks for filtering on the server end
std::vector<IoHash> AttachmentsToSend;
std::span<const CbAttachment> Attachments = Package.GetAttachments();
if (Attachments.empty() == false)
{
CbObjectWriter Writer;
Writer.BeginArray("offer");
for (const CbAttachment& Attachment : Attachments)
{
IoHash Hash = Attachment.GetHash();
Writer.AddHash(Hash);
}
Writer.EndArray();
MemoryOutStream MemOut;
BinaryWriter MemWriter(MemOut);
Writer.Save(MemWriter);
Sess.SetHeader({{"Content-Type", "application/x-ue-offer"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", "1"}});
Sess.SetBody(cpr::Body{(const char*)MemOut.Data(), MemOut.Size()});
cpr::Response FilterResponse = Sess.Post();
if (FilterResponse.status_code == 200)
{
IoBuffer ResponseBuffer(IoBuffer::Wrap, FilterResponse.text.data(), FilterResponse.text.size());
CbObject ResponseObject = LoadCompactBinaryObject(ResponseBuffer);
for (auto& Entry : ResponseObject["need"])
{
ZEN_ASSERT(Entry.IsHash());
AttachmentsToSend.push_back(Entry.AsHash());
}
}
}
CbPackage SendPackage;
SendPackage.SetObject(Package.GetObject(), Package.GetObjectHash());
;
for (const IoHash& AttachmentCid : AttachmentsToSend)
{
const CbAttachment* Attachment = Package.FindAttachment(AttachmentCid);
if (Attachment)
{
SendPackage.AddAttachment(*Attachment);
}
else
{
// This should be an error -- server asked to have something we can't find
}
}
{
MemoryOutStream MemOut;
BinaryWriter MemWriter(MemOut);
SendPackage.Save(MemWriter);
Sess.SetHeader({{"Content-Type", "application/x-ue-cbpkg"}, {"UE-Session", "123456789012345678901234"}, {"UE-Request", "1"}});
Sess.SetBody(cpr::Body{(const char*)MemOut.Data(), MemOut.Size()});
cpr::Response FilterResponse = Sess.Post();
}
}
//////////////////////////////////////////////////////////////////////////
TEST_CASE("httpclient")
{
using namespace std::literals;
SUBCASE("client") {}
}
void
httpclient_forcelink()
{
}
} // namespace zen
|