aboutsummaryrefslogtreecommitdiff
path: root/zenhttp/httpserver.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-13 12:24:59 +0200
committerStefan Boberg <[email protected]>2021-09-13 12:24:59 +0200
commit4e2649977d034b913413d2cb35d4a88afc30393f (patch)
tree9258d4329a2217d581aaedfb251a655692987d4d /zenhttp/httpserver.cpp
parentAdded Ref<>::Get to work around issue casting a pointer to a derived type to ... (diff)
downloadzen-4e2649977d034b913413d2cb35d4a88afc30393f.tar.xz
zen-4e2649977d034b913413d2cb35d4a88afc30393f.zip
Changed interface for httpServerRequest::SessionId()/RequestId() so they share storage and lazy eval logic
They now call into ParseSessionId()/ParseRequestId() when required Eliminates redundant logic in derived implementations Also moved package transport code into httpshared.(cpp|h) for easier sharing with client code Added some I/O error reporting in http.sys related code Changed IHttpPackageHandler interface to support partially updated handling flow
Diffstat (limited to 'zenhttp/httpserver.cpp')
-rw-r--r--zenhttp/httpserver.cpp136
1 files changed, 23 insertions, 113 deletions
diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp
index 39bec435d..50141167d 100644
--- a/zenhttp/httpserver.cpp
+++ b/zenhttp/httpserver.cpp
@@ -3,6 +3,7 @@
#include <zenhttp/httpserver.h>
#include "httpnull.h"
+#include "httpshared.h"
#include "httpsys.h"
#include "httpuws.h"
@@ -262,72 +263,10 @@ HttpServerRequest::~HttpServerRequest()
{
}
-struct CbPackageHeader
-{
- uint32_t HeaderMagic;
- uint32_t AttachmentCount;
- uint32_t Reserved1;
- uint32_t Reserved2;
-};
-
-static constinit uint32_t kCbPkgMagic = 0xaa77aacc;
-
-struct CbAttachmentEntry
-{
- uint64_t AttachmentSize;
- uint32_t Reserved1;
- IoHash AttachmentHash;
-};
-
void
HttpServerRequest::WriteResponse(HttpResponseCode ResponseCode, CbPackage Data)
{
- const std::span<const CbAttachment>& Attachments = Data.GetAttachments();
-
- std::vector<IoBuffer> ResponseBuffers;
- ResponseBuffers.reserve(3 + Attachments.size()); // TODO: may want to use an additional fudge factor here to avoid growing since each
- // attachment is likely to consist of several buffers
-
- uint64_t TotalAttachmentsSize = 0;
-
- // Fixed size header
-
- CbPackageHeader Hdr{.HeaderMagic = kCbPkgMagic, .AttachmentCount = gsl::narrow<uint32_t>(Attachments.size())};
-
- ResponseBuffers.push_back(IoBufferBuilder::MakeCloneFromMemory(&Hdr, sizeof Hdr));
-
- // Attachment metadata array
-
- IoBuffer AttachmentMetadataBuffer = IoBuffer{sizeof(CbAttachmentEntry) * (Attachments.size() + /* root */ 1)};
-
- CbAttachmentEntry* AttachmentInfo = reinterpret_cast<CbAttachmentEntry*>(AttachmentMetadataBuffer.MutableData());
-
- ResponseBuffers.push_back(AttachmentMetadataBuffer); // Attachment metadata
-
- // Root object
-
- IoBuffer RootIoBuffer = Data.GetObject().GetBuffer().AsIoBuffer();
- ResponseBuffers.push_back(RootIoBuffer); // Root object
-
- *AttachmentInfo++ = {.AttachmentSize = RootIoBuffer.Size(), .AttachmentHash = Data.GetObjectHash()};
-
- // Attachment payloads
-
- for (const CbAttachment& Attachment : Attachments)
- {
- CompressedBuffer AttachmentBuffer = Attachment.AsCompressedBinary();
- CompositeBuffer Compressed = AttachmentBuffer.GetCompressed();
-
- *AttachmentInfo++ = {.AttachmentSize = AttachmentBuffer.GetCompressedSize(),
- .AttachmentHash = IoHash::FromBLAKE3(AttachmentBuffer.GetRawHash())};
-
- for (const SharedBuffer& Segment : Compressed.GetSegments())
- {
- ResponseBuffers.push_back(Segment.AsIoBuffer());
- TotalAttachmentsSize += Segment.GetSize();
- }
- }
-
+ std::vector<IoBuffer> ResponseBuffers = FormatPackageMessage(Data);
return WriteResponse(ResponseCode, HttpContentType::kCbPackage, ResponseBuffers);
}
@@ -400,13 +339,27 @@ HttpServerRequest::GetQueryParams()
Oid
HttpServerRequest::SessionId() const
{
- return {};
+ if (m_Flags & kHaveSessionId)
+ {
+ return m_SessionId;
+ }
+
+ m_SessionId = ParseSessionId();
+ m_Flags |= kHaveSessionId;
+ return m_SessionId;
}
uint32_t
HttpServerRequest::RequestId() const
{
- return {};
+ if (m_Flags & kHaveRequestId)
+ {
+ return m_RequestId;
+ }
+
+ m_RequestId = ParseRequestId();
+ m_Flags |= kHaveRequestId;
+ return m_RequestId;
}
CbObject
@@ -418,62 +371,19 @@ HttpServerRequest::ReadPayloadObject()
{
return LoadCompactBinaryObject(std::move(Payload));
}
- else
- {
- return {};
- }
+
+ return {};
}
CbPackage
HttpServerRequest::ReadPayloadPackage()
{
- // TODO: this should not read into a contiguous buffer!
-
- IoBuffer Payload = ReadPayload();
- MemoryInStream InStream(Payload);
- BinaryReader Reader(InStream);
-
- if (!Payload)
- {
- return {};
- }
-
- CbPackage Package;
-
- CbPackageHeader Hdr;
- Reader.Read(&Hdr, sizeof Hdr);
-
- if (Hdr.HeaderMagic != kCbPkgMagic)
- {
- // report error
- return {};
- }
-
- uint32_t ChunkCount = Hdr.AttachmentCount + 1;
-
- std::unique_ptr<CbAttachmentEntry[]> AttachmentEntries{new CbAttachmentEntry[ChunkCount]};
-
- Reader.Read(AttachmentEntries.get(), sizeof(CbAttachmentEntry) * ChunkCount);
-
- for (uint32_t i = 0; i < ChunkCount; ++i)
+ if (IoBuffer Payload = ReadPayload())
{
- const uint64_t AttachmentSize = AttachmentEntries[i].AttachmentSize;
- IoBuffer AttachmentBuffer{AttachmentSize};
- Reader.Read(AttachmentBuffer.MutableData(), AttachmentSize);
- CompressedBuffer CompBuf(CompressedBuffer::FromCompressed(SharedBuffer(AttachmentBuffer)));
-
- if (i == 0)
- {
- Package.SetObject(LoadCompactBinaryObject(CompBuf));
- }
- else
- {
- CbAttachment Attachment(CompBuf);
- Package.AddAttachment(Attachment);
- }
+ return ParsePackageMessage(Payload);
}
- return Package;
+ return {};
}
//////////////////////////////////////////////////////////////////////////