From fc53dd4bd6737f4e1c406f24cd66b4255f383e60 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Tue, 2 May 2023 13:23:42 +0200 Subject: move testing and observability code to zenhttp (#266) --- src/zenserver/httpcidstore.cpp | 124 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/zenserver/httpcidstore.cpp (limited to 'src/zenserver/httpcidstore.cpp') diff --git a/src/zenserver/httpcidstore.cpp b/src/zenserver/httpcidstore.cpp new file mode 100644 index 000000000..233a45edb --- /dev/null +++ b/src/zenserver/httpcidstore.cpp @@ -0,0 +1,124 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "httpcidstore.h" + +#include +#include +#include +#include + +#include + +namespace zen { + +HttpCidService::HttpCidService(CidStore& Store) : m_CidStore(Store) +{ + m_Router.AddPattern("cid", "([0-9A-Fa-f]{40})"); + + m_Router.RegisterRoute( + "{cid}", + [this](HttpRouterRequest& Req) { + IoHash Hash = IoHash::FromHexString(Req.GetCapture(1)); + ZEN_DEBUG("CID request for {}", Hash); + + HttpServerRequest& ServerRequest = Req.ServerRequest(); + + switch (ServerRequest.RequestVerb()) + { + case HttpVerb::kGet: + case HttpVerb::kHead: + { + if (IoBuffer Value = m_CidStore.FindChunkByCid(Hash)) + { + return ServerRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Value); + } + + return ServerRequest.WriteResponse(HttpResponseCode::NotFound); + } + break; + + case HttpVerb::kPut: + { + IoBuffer Payload = ServerRequest.ReadPayload(); + IoHash RawHash; + uint64_t RawSize; + if (!CompressedBuffer::ValidateCompressedHeader(Payload, RawHash, RawSize)) + { + return ServerRequest.WriteResponse(HttpResponseCode::UnsupportedMediaType); + } + + // URI hash must match content hash + if (RawHash != Hash) + { + return ServerRequest.WriteResponse(HttpResponseCode::BadRequest); + } + + m_CidStore.AddChunk(Payload, RawHash); + + return ServerRequest.WriteResponse(HttpResponseCode::OK); + } + break; + + default: + break; + } + }, + HttpVerb::kGet | HttpVerb::kPut | HttpVerb::kHead); +} + +const char* +HttpCidService::BaseUri() const +{ + return "/cid/"; +} + +void +HttpCidService::HandleRequest(zen::HttpServerRequest& Request) +{ + if (Request.RelativeUri().empty()) + { + // Root URI request + + switch (Request.RequestVerb()) + { + case HttpVerb::kPut: + case HttpVerb::kPost: + { + IoBuffer Payload = Request.ReadPayload(); + IoHash RawHash; + uint64_t RawSize; + if (!CompressedBuffer::ValidateCompressedHeader(Payload, RawHash, RawSize)) + { + return Request.WriteResponse(HttpResponseCode::UnsupportedMediaType); + } + + ZEN_DEBUG("CID POST request for {} ({} bytes)", RawHash, Payload.Size()); + + auto InsertResult = m_CidStore.AddChunk(Payload, RawHash); + + if (InsertResult.New) + { + return Request.WriteResponse(HttpResponseCode::Created); + } + else + { + return Request.WriteResponse(HttpResponseCode::OK); + } + } + break; + + case HttpVerb::kGet: + case HttpVerb::kHead: + break; + + default: + break; + } + } + else + { + m_Router.HandleRequest(Request); + } +} + +} // namespace zen -- cgit v1.2.3