diff options
Diffstat (limited to 'zenhttp/asiohttpserver.cpp')
| -rw-r--r-- | zenhttp/asiohttpserver.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/zenhttp/asiohttpserver.cpp b/zenhttp/asiohttpserver.cpp index 9185f8856..b561fe8f2 100644 --- a/zenhttp/asiohttpserver.cpp +++ b/zenhttp/asiohttpserver.cpp @@ -122,6 +122,85 @@ MessageParser::Reset() } /////////////////////////////////////////////////////////////////////////////// +class HttpHeaderData +{ +public: + struct Entry + { + uint32_t Offset{0}; + uint32_t Size{0}; + }; + + struct HeaderEntry + { + Entry Name{}; + Entry Value{}; + }; + + static constexpr size_t kMaxHeaderSize = 2048; + static constexpr size_t kMaxHeaderCount = 16; + static constexpr size_t kHeaderIndexSize = kMaxHeaderCount * sizeof(HeaderEntry); + static constexpr size_t kMaxHeaderContentSize = kMaxHeaderSize - kHeaderIndexSize; + + HttpHeaderData() { Reset(); } + + std::string_view StatusLine() const + { + const Entry* StatusEntry = reinterpret_cast<const Entry*>(m_Buffer); + const char* Buffer = reinterpret_cast<const char*>(m_Buffer) + StatusEntry->Offset; + + return std::string_view(Buffer, size_t(StatusEntry->Size)); + } + + std::string_view Url() const + { + const Entry* UrlEntry = reinterpret_cast<const Entry*>(m_Buffer + sizeof(Entry)); + const char* Buffer = reinterpret_cast<const char*>(m_Buffer) + UrlEntry->Offset; + + return std::string_view(Buffer, size_t(UrlEntry->Size)); + } + + void Reset() + { + memset(m_Buffer, 0, kMaxHeaderSize); + + m_CursorView = MutableMemoryView(&m_Buffer[kHeaderIndexSize], kMaxHeaderContentSize); + m_HeaderCount = 0; + } + + void AppendData(MemoryView Data) + { + m_CursorView.CopyFrom(Data); + m_CursorView += Data.GetSize(); + } + + void AppendStatus(Entry StatusEntry) + { + MutableMemoryView BufferView(&m_Buffer, sizeof(Entry)); + BufferView.CopyFrom(MemoryView(&StatusEntry, sizeof(Entry))); + } + + void AppendUrl(Entry StatusEntry) + { + MutableMemoryView BufferView(&m_Buffer + sizeof(Entry), sizeof(Entry)); + BufferView.CopyFrom(MemoryView(&StatusEntry, sizeof(Entry))); + } + + void AppendHeader(HeaderEntry Header) + { + MutableMemoryView HeaderView(&m_Buffer + ((m_HeaderCount + 1) * sizeof(HeaderEntry)), sizeof(HeaderEntry)); + HeaderView.CopyFrom(MemoryView(&Header, sizeof(HeaderEntry))); + + m_HeaderCount++; + } + +private: + uint8_t m_Buffer[kMaxHeaderSize]; + MutableMemoryView m_CursorView; + size_t m_HeaderCount{0}; +}; + +/////////////////////////////////////////////////////////////////////////////// class HttpRequestMessage final : public HttpServerRequest { public: |