aboutsummaryrefslogtreecommitdiff
path: root/zenhttp/httpclient.cpp
blob: fb31e0a8bdd19069c540d7661e3059ca31def2a9 (plain) (blame)
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