aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2022-03-23 16:15:08 +0100
committerStefan Boberg <[email protected]>2022-03-23 16:15:08 +0100
commitcfbe2e251e2cf174ff2474bc70f4e6b9551c4af2 (patch)
tree9d6da6e33484be16cd0251b3781408deb14e2340
parentadded xmake file for zentest-appstub (diff)
parentFixed wrong route pattern. (diff)
downloadzen-cfbe2e251e2cf174ff2474bc70f4e6b9551c4af2.tar.xz
zen-cfbe2e251e2cf174ff2474bc70f4e6b9551c4af2.zip
Merge branch 'main' of https://github.com/EpicGames/zen
-rw-r--r--zencore/compactbinary.cpp7
-rw-r--r--zencore/include/zencore/compactbinary.h11
-rw-r--r--zenhttp/httpserver.cpp16
-rw-r--r--zenhttp/include/zenhttp/httpserver.h1
-rw-r--r--zenserver-test/zenserver-test.cpp2
-rw-r--r--zenserver/projectstore.cpp32
-rw-r--r--zenserver/projectstore.h1
7 files changed, 69 insertions, 1 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp
index 808e4f39a..cb628af4b 100644
--- a/zencore/compactbinary.cpp
+++ b/zencore/compactbinary.cpp
@@ -1701,6 +1701,13 @@ CompactBinaryToJson(const CbObjectView& Object, StringBuilderBase& Builder)
Writer.WriteField(Object.AsFieldView());
}
+void
+CompactBinaryToJson(const CbArrayView& Array, StringBuilderBase& Builder)
+{
+ CbJsonWriter Writer(Builder);
+ Writer.WriteField(Array.AsFieldView());
+}
+
//////////////////////////////////////////////////////////////////////////
#if ZEN_WITH_TESTS
diff --git a/zencore/include/zencore/compactbinary.h b/zencore/include/zencore/compactbinary.h
index 66fa3065d..8985144dd 100644
--- a/zencore/include/zencore/compactbinary.h
+++ b/zencore/include/zencore/compactbinary.h
@@ -870,6 +870,11 @@ private:
};
/**
+ * Serialize a compact binary array to JSON.
+ */
+ZENCORE_API void CompactBinaryToJson(const CbArrayView& Object, StringBuilderBase& Builder);
+
+/**
* Array of CbField that have no names.
*
* Accessing a field of the array requires iteration. Access by index is not provided because the
@@ -941,6 +946,12 @@ public:
/** Returns a view of the array, including the type and name when present. */
using CbFieldView::GetView;
+ StringBuilderBase& ToJson(StringBuilderBase& Builder) const
+ {
+ CompactBinaryToJson(*this, Builder);
+ return Builder;
+ }
+
private:
friend inline CbFieldViewIterator begin(const CbArrayView& Array) { return Array.CreateViewIterator(); }
friend inline CbFieldViewIterator end(const CbArrayView&) { return CbFieldViewIterator(); }
diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp
index 710b6f356..df5a0596a 100644
--- a/zenhttp/httpserver.cpp
+++ b/zenhttp/httpserver.cpp
@@ -375,6 +375,22 @@ HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, CbObject Data)
}
void
+HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, CbArray Array)
+{
+ if (m_AcceptType == HttpContentType::kJSON)
+ {
+ ExtendableStringBuilder<1024> Sb;
+ WriteResponse(ResponseCode, HttpContentType::kJSON, Array.ToJson(Sb).ToView());
+ }
+ else
+ {
+ SharedBuffer Buf = Array.GetBuffer();
+ std::array<IoBuffer, 1> Buffers{IoBufferBuilder::MakeCloneFromMemory(Buf.GetData(), Buf.GetSize())};
+ return WriteResponse(ResponseCode, HttpContentType::kCbObject, Buffers);
+ }
+}
+
+void
HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::string_view ResponseString)
{
return WriteResponse(ResponseCode, ContentType, std::u8string_view{(char8_t*)ResponseString.data(), ResponseString.size()});
diff --git a/zenhttp/include/zenhttp/httpserver.h b/zenhttp/include/zenhttp/httpserver.h
index 545b96db2..5bd51740a 100644
--- a/zenhttp/include/zenhttp/httpserver.h
+++ b/zenhttp/include/zenhttp/httpserver.h
@@ -94,6 +94,7 @@ public:
virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, CompositeBuffer& Payload);
void WriteResponse(HttpResponseCode ResponseCode, CbObject Data);
+ void WriteResponse(HttpResponseCode ResponseCode, CbArray Array);
void WriteResponse(HttpResponseCode ResponseCode, CbPackage Package);
void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::string_view ResponseString);
void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, IoBuffer Blob);
diff --git a/zenserver-test/zenserver-test.cpp b/zenserver-test/zenserver-test.cpp
index a0d97a489..5260eaa65 100644
--- a/zenserver-test/zenserver-test.cpp
+++ b/zenserver-test/zenserver-test.cpp
@@ -2490,7 +2490,7 @@ private:
zen::BinaryWriter m_MemOut;
};
-TEST_CASE("exec.basic")
+TEST_CASE("exec.basic" * doctest::skip(true))
{
# if ZEN_WITH_EXEC_SERVICES
using namespace std::literals;
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp
index 113a7cec4..58b806989 100644
--- a/zenserver/projectstore.cpp
+++ b/zenserver/projectstore.cpp
@@ -933,6 +933,17 @@ ProjectStore::DiscoverProjects()
}
void
+ProjectStore::IterateProjects(std::function<void(Project& Prj)>&& Fn)
+{
+ RwLock::SharedLockScope _(m_ProjectsLock);
+
+ for (auto& Kv : m_Projects)
+ {
+ Fn(Kv.second);
+ }
+}
+
+void
ProjectStore::Flush()
{
// TODO
@@ -1072,6 +1083,27 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects)
m_Router.AddPattern("hash", "([[:xdigit:]]{40})");
m_Router.RegisterRoute(
+ "list",
+ [this](HttpRouterRequest& Req) {
+ m_ProjectStore->DiscoverProjects();
+
+ CbWriter Response;
+ Response.BeginArray();
+ m_ProjectStore->IterateProjects([&Response](ProjectStore::Project& Prj) {
+ Response.BeginObject();
+ Response << "Id"sv << Prj.Identifier;
+ Response << "RootDir"sv << Prj.RootDir.string();
+ Response << "ProjectRootDir"sv << Prj.ProjectRootDir;
+ Response << "EngineRootDir"sv << Prj.EngineRootDir;
+ Response.EndObject();
+ });
+ Response.EndArray();
+
+ Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response.Save().AsArray());
+ },
+ HttpVerb::kGet);
+
+ m_Router.RegisterRoute(
"{project}/oplog/{log}/batch",
[this](HttpRouterRequest& Req) {
HttpServerRequest& HttpReq = Req.ServerRequest();
diff --git a/zenserver/projectstore.h b/zenserver/projectstore.h
index 283dec3b2..f71434783 100644
--- a/zenserver/projectstore.h
+++ b/zenserver/projectstore.h
@@ -189,6 +189,7 @@ public:
void Flush();
void Scrub(ScrubContext& Ctx);
void DiscoverProjects();
+ void IterateProjects(std::function<void(Project& Prj)>&& Fn);
spdlog::logger& Log() { return m_Log; }
const std::filesystem::path& BasePath() const { return m_ProjectBasePath; }