diff options
| author | Stefan Boberg <[email protected]> | 2022-03-23 16:15:08 +0100 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2022-03-23 16:15:08 +0100 |
| commit | cfbe2e251e2cf174ff2474bc70f4e6b9551c4af2 (patch) | |
| tree | 9d6da6e33484be16cd0251b3781408deb14e2340 | |
| parent | added xmake file for zentest-appstub (diff) | |
| parent | Fixed wrong route pattern. (diff) | |
| download | zen-cfbe2e251e2cf174ff2474bc70f4e6b9551c4af2.tar.xz zen-cfbe2e251e2cf174ff2474bc70f4e6b9551c4af2.zip | |
Merge branch 'main' of https://github.com/EpicGames/zen
| -rw-r--r-- | zencore/compactbinary.cpp | 7 | ||||
| -rw-r--r-- | zencore/include/zencore/compactbinary.h | 11 | ||||
| -rw-r--r-- | zenhttp/httpserver.cpp | 16 | ||||
| -rw-r--r-- | zenhttp/include/zenhttp/httpserver.h | 1 | ||||
| -rw-r--r-- | zenserver-test/zenserver-test.cpp | 2 | ||||
| -rw-r--r-- | zenserver/projectstore.cpp | 32 | ||||
| -rw-r--r-- | zenserver/projectstore.h | 1 |
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; } |