diff options
Diffstat (limited to 'zenserver/projectstore.cpp')
| -rw-r--r-- | zenserver/projectstore.cpp | 123 |
1 files changed, 74 insertions, 49 deletions
diff --git a/zenserver/projectstore.cpp b/zenserver/projectstore.cpp index 006796b28..2bbc1dce3 100644 --- a/zenserver/projectstore.cpp +++ b/zenserver/projectstore.cpp @@ -542,8 +542,30 @@ ProjectStore::Oplog::AppendNewOplogEntry(CbPackage OpPackage) for (const auto& Attach : Attachments) { - IoBuffer AttachmentData = Attach.AsBinary().AsIoBuffer(); - CasStore::InsertResult Result = m_CasStore.InsertChunk(AttachmentData, Attach.GetHash()); + IoBuffer AttachmentData; + + if (Attach.IsBinary()) + { + AttachmentData = Attach.AsBinary().AsIoBuffer(); + } + else if (Attach.IsCompressedBinary()) + { + ZEN_NOT_IMPLEMENTED("Compressed binary attachments are currently not supported for oplogs"); + + AttachmentData = Attach.AsCompressedBinary().GetCompressed().Flatten().AsIoBuffer(); + } + else if (Attach.IsObject()) + { + AttachmentData = Attach.AsObject().GetBuffer().AsIoBuffer(); + } + else + { + ZEN_NOT_IMPLEMENTED("Unknown attachment type"); + } + + ZEN_ASSERT(AttachmentData); + + CasStore::InsertResult Result = m_CasStore.InsertChunk(AttachmentData, Attach.GetHash()); const uint64_t AttachmentSize = AttachmentData.Size(); @@ -909,7 +931,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } // Parse Request @@ -940,7 +962,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (Payload.Size() <= sizeof(RequestHeader)) { - HttpReq.WriteResponse(HttpResponse::BadRequest); + HttpReq.WriteResponse(HttpResponseCode::BadRequest); } RequestHeader RequestHdr; @@ -948,7 +970,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (RequestHdr.Magic != RequestHeader::kMagic) { - HttpReq.WriteResponse(HttpResponse::BadRequest); + HttpReq.WriteResponse(HttpResponseCode::BadRequest); } std::vector<RequestChunkEntry> RequestedChunks; @@ -1004,9 +1026,9 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) ResponsePtr += sizeof(ResponseHdr); for (uint32_t ChunkIndex = 0; ChunkIndex < RequestHdr.ChunkCount; ++ChunkIndex) { - //const RequestChunkEntry& RequestedChunk = RequestedChunks[ChunkIndex]; - const IoBuffer& FoundChunk(OutBlobs[ChunkIndex + 1]); - ResponseChunkEntry ResponseChunk; + // const RequestChunkEntry& RequestedChunk = RequestedChunks[ChunkIndex]; + const IoBuffer& FoundChunk(OutBlobs[ChunkIndex + 1]); + ResponseChunkEntry ResponseChunk; ResponseChunk.CorrelationId = ChunkIndex; if (FoundChunk) { @@ -1020,7 +1042,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) ResponsePtr += sizeof(ResponseChunk); } - return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, OutBlobs); + return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, OutBlobs); }, HttpVerb::kPost); @@ -1038,7 +1060,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } ProjectStore::Oplog& Log = *FoundLog; @@ -1063,7 +1085,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) Response.EndArray(); - return HttpReq.WriteResponse(HttpResponse::OK, Response.Save()); + return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save()); }, HttpVerb::kGet); @@ -1080,7 +1102,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } ProjectStore::Oplog& Log = *FoundLog; @@ -1093,10 +1115,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) { CbObjectWriter Response; Response << "size" << Value.Size(); - return HttpReq.WriteResponse(HttpResponse::OK, Response.Save()); + return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save()); } - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); }, HttpVerb::kGet); @@ -1124,7 +1146,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } else { - return HttpReq.WriteResponse(HttpResponse::BadRequest); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest); } } @@ -1137,7 +1159,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } else { - return HttpReq.WriteResponse(HttpResponse::BadRequest); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest); } } @@ -1147,7 +1169,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } ProjectStore::Oplog& Log = *FoundLog; @@ -1162,7 +1184,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) case HttpVerb::kGet: if (!Value) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } if (Verb == HttpVerb::kHead) @@ -1185,10 +1207,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) // Send only a subset of data IoBuffer InnerValue(Value, Offset, Size); - return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, InnerValue); + return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, InnerValue); } - return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, Value); + return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Value); } }, HttpVerb::kGet | HttpVerb::kHead); @@ -1217,7 +1239,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } else { - return HttpReq.WriteResponse(HttpResponse::BadRequest); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest); } } @@ -1230,7 +1252,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } else { - return HttpReq.WriteResponse(HttpResponse::BadRequest); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest); } } @@ -1240,7 +1262,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) IoBuffer Value = m_CasStore.FindChunk(Hash); if (!Value) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } if (IsOffset) @@ -1258,10 +1280,10 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) // Send only a subset of data IoBuffer InnerValue(Value, Offset, Size); - return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, InnerValue); + return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, InnerValue); } - return HttpReq.WriteResponse(HttpResponse::OK, HttpContentType::kBinary, Value); + return HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kBinary, Value); }, HttpVerb::kGet); @@ -1277,7 +1299,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } // This operation takes a list of referenced hashes and decides which @@ -1312,7 +1334,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) Cbo.EndArray(); CbObject Response = Cbo.Save(); - return HttpReq.WriteResponse(HttpResponse::OK, Response); + return HttpReq.WriteResponse(HttpResponseCode::OK, Response); }, HttpVerb::kPost); @@ -1340,7 +1362,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } ProjectStore::Oplog& Log = *FoundLog; @@ -1387,23 +1409,26 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) }; CbPackage Package; - if (!Package.TryLoad(Payload, &UniqueBuffer::Alloc, &Resolver)) + + if (!legacy::TryLoadCbPackage(Package, Payload, &UniqueBuffer::Alloc, &Resolver)) { - return HttpReq.WriteResponse(HttpResponse::BadRequest, HttpContentType::kText, "Invalid package"); + m_Log.error("Received malformed package!"); + + return HttpReq.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid package"); } if (!IsValid) { // TODO: emit diagnostics identifying missing chunks - return HttpReq.WriteResponse(HttpResponse::NotFound, HttpContentType::kText, "Missing chunk reference"); + return HttpReq.WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "Missing chunk reference"); } CbObject Core = Package.GetObject(); if (!Core["key"sv]) { - return HttpReq.WriteResponse(HttpResponse::BadRequest, HttpContentType::kText, "No oplog entry key specified"); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "No oplog entry key specified"); } // Write core to oplog @@ -1412,12 +1437,12 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (OpLsn == ProjectStore::Oplog::kInvalidOp) { - return HttpReq.WriteResponse(HttpResponse::BadRequest); + return HttpReq.WriteResponse(HttpResponseCode::BadRequest); } m_Log.info("new op #{:4} - {}/{} ({:>6}) {}", OpLsn, ProjectId, OplogId, NiceBytes(Payload.Size()), Core["key"sv].AsString()); - HttpReq.WriteResponse(HttpResponse::Created); + HttpReq.WriteResponse(HttpResponseCode::Created); }, HttpVerb::kPost); @@ -1428,7 +1453,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) // TODO: look up op and respond with the payload! - HttpReq.WriteResponse(HttpResponse::Accepted, HttpContentType::kText, u8"yeee"sv); + HttpReq.WriteResponse(HttpResponseCode::Accepted, HttpContentType::kText, u8"yeee"sv); }, HttpVerb::kGet); @@ -1444,7 +1469,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (!ProjectIt) { - return Req.ServerRequest().WriteResponse(HttpResponse::NotFound, + return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "project {} not found"_format(ProjectId)); } @@ -1459,7 +1484,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (!OplogIt) { - return Req.ServerRequest().WriteResponse(HttpResponse::NotFound, + return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "oplog {} not found in project {}"_format(OplogId, ProjectId)); } @@ -1469,7 +1494,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) CbObjectWriter Cb; Cb << "id"sv << Log.OplogId() << "project"sv << Prj.Identifier << "tempdir"sv << Log.TempDir(); - Req.ServerRequest().WriteResponse(HttpResponse::OK, Cb.Save()); + Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Cb.Save()); } break; @@ -1482,18 +1507,18 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (!Prj.NewOplog(OplogId)) { // TODO: indicate why the operation failed! - return Req.ServerRequest().WriteResponse(HttpResponse::InternalServerError); + return Req.ServerRequest().WriteResponse(HttpResponseCode::InternalServerError); } m_Log.info("established oplog {} / {}", ProjectId, OplogId); - return Req.ServerRequest().WriteResponse(HttpResponse::Created); + return Req.ServerRequest().WriteResponse(HttpResponseCode::Created); } // I guess this should ultimately be used to execute RPCs but for now, it // does absolutely nothing - return Req.ServerRequest().WriteResponse(HttpResponse::BadRequest); + return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest); } break; @@ -1503,7 +1528,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) ProjectIt->DeleteOplog(OplogId); - return Req.ServerRequest().WriteResponse(HttpResponse::OK); + return Req.ServerRequest().WriteResponse(HttpResponseCode::OK); } break; } @@ -1522,7 +1547,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (FoundLog == nullptr) { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } CbObjectWriter Response; @@ -1542,7 +1567,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } else { - return HttpReq.WriteResponse(HttpResponse::NotFound); + return HttpReq.WriteResponse(HttpResponseCode::NotFound); } } else @@ -1555,7 +1580,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) } } - return HttpReq.WriteResponse(HttpResponse::OK, Response.Save()); + return HttpReq.WriteResponse(HttpResponseCode::OK, Response.Save()); }, HttpVerb::kGet); @@ -1585,7 +1610,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) EngineRoot, ProjectRoot); - Req.ServerRequest().WriteResponse(HttpResponse::Created); + Req.ServerRequest().WriteResponse(HttpResponseCode::Created); } break; @@ -1595,7 +1620,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (!ProjectIt) { - return Req.ServerRequest().WriteResponse(HttpResponse::NotFound, + return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "project {} not found"_format(ProjectId)); } @@ -1609,7 +1634,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) Prj.IterateOplogs([&](const ProjectStore::Oplog& I) { Response << "id"sv << I.OplogId(); }); Response.EndArray(); // oplogs - Req.ServerRequest().WriteResponse(HttpResponse::OK, Response.Save()); + Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Response.Save()); } break; @@ -1619,7 +1644,7 @@ HttpProjectService::HttpProjectService(CasStore& Store, ProjectStore* Projects) if (!ProjectIt) { - return Req.ServerRequest().WriteResponse(HttpResponse::NotFound, + return Req.ServerRequest().WriteResponse(HttpResponseCode::NotFound, HttpContentType::kText, "project {} not found"_format(ProjectId)); } |