From 303f779935192c2958849a52ffdcfaa9bbc8b334 Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Wed, 23 Mar 2022 13:08:46 +0100 Subject: Skip zenserver-test exec.basic test since it tries to access a non-existent file path --- zenserver-test/zenserver-test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; -- cgit v1.2.3 From e41d74d85c9d0132d864b4ac6f1a3ba10194ce99 Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Wed, 23 Mar 2022 13:45:49 +0100 Subject: Added ToJson for compact binary array. --- zencore/compactbinary.cpp | 7 +++++++ zencore/include/zencore/compactbinary.h | 11 +++++++++++ 2 files changed, 18 insertions(+) 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 @@ -869,6 +869,11 @@ private: using TCbFieldIterator::TCbFieldIterator; }; +/** + * Serialize a compact binary array to JSON. + */ +ZENCORE_API void CompactBinaryToJson(const CbArrayView& Object, StringBuilderBase& Builder); + /** * Array of CbField that have no names. * @@ -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(); } -- cgit v1.2.3 From 58406e56968254cba7f5e807151014326fe0b385 Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Wed, 23 Mar 2022 13:47:01 +0100 Subject: Helper function for sending compact binary array HTTP response. --- zenhttp/httpserver.cpp | 16 ++++++++++++++++ zenhttp/include/zenhttp/httpserver.h | 1 + 2 files changed, 17 insertions(+) diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp index 710b6f356..df5a0596a 100644 --- a/zenhttp/httpserver.cpp +++ b/zenhttp/httpserver.cpp @@ -374,6 +374,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 Buffers{IoBufferBuilder::MakeCloneFromMemory(Buf.GetData(), Buf.GetSize())}; + return WriteResponse(ResponseCode, HttpContentType::kCbObject, Buffers); + } +} + void HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::string_view ResponseString) { 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); -- cgit v1.2.3 From 0745c75bd8e49757fd003c076f2ae98dc2ee5439 Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Wed, 23 Mar 2022 14:01:34 +0100 Subject: Added route '/prj/list' for retrieving project info. --- zenserver/projectstore.cpp | 32 ++++++++++++++++++++++++++++++++ zenserver/projectstore.h | 1 + 2 files changed, 33 insertions(+) diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 113a7cec4..79ebc0a65 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -932,6 +932,17 @@ ProjectStore::DiscoverProjects() } } +void +ProjectStore::IterateProjects(std::function&& Fn) +{ + RwLock::SharedLockScope _(m_ProjectsLock); + + for (auto& Kv : m_Projects) + { + Fn(Kv.second); + } +} + void ProjectStore::Flush() { @@ -1071,6 +1082,27 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) m_Router.AddPattern("chunk", "([[:xdigit:]]{24})"); 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) { 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&& Fn); spdlog::logger& Log() { return m_Log; } const std::filesystem::path& BasePath() const { return m_ProjectBasePath; } -- cgit v1.2.3 From 1bba6125a1cc47424569ad9c966a43bb3b33c17e Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Wed, 23 Mar 2022 14:06:00 +0100 Subject: Fixed wrong route pattern. --- zenserver/projectstore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 79ebc0a65..58b806989 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -1083,7 +1083,7 @@ HttpProjectService::HttpProjectService(CidStore& Store, ProjectStore* Projects) m_Router.AddPattern("hash", "([[:xdigit:]]{40})"); m_Router.RegisterRoute( - "/list", + "list", [this](HttpRouterRequest& Req) { m_ProjectStore->DiscoverProjects(); -- cgit v1.2.3