diff options
| author | Per Larsson <[email protected]> | 2023-04-19 08:44:34 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-04-19 08:44:34 +0200 |
| commit | 045702915c4b63d232b99d86a1ee0b16642098c8 (patch) | |
| tree | b8487d22d36b1c2a03352c45b386c209b9bb0b27 /zenhttp/httpasio.cpp | |
| parent | make sure initialization of a new filecas dont remove the cas manifest file o... (diff) | |
| download | zen-045702915c4b63d232b99d86a1ee0b16642098c8.tar.xz zen-045702915c4b63d232b99d86a1ee0b16642098c8.zip | |
Support for HTTP range header (#245)
* Support for HTTP range header.
* Implement http range for HTTP sys.
* Validate range parameters.
---------
Co-authored-by: Stefan Boberg <[email protected]>
Diffstat (limited to 'zenhttp/httpasio.cpp')
| -rw-r--r-- | zenhttp/httpasio.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/zenhttp/httpasio.cpp b/zenhttp/httpasio.cpp index 450b5a1fc..f270c9d2b 100644 --- a/zenhttp/httpasio.cpp +++ b/zenhttp/httpasio.cpp @@ -7,6 +7,7 @@ #include <deque> #include <memory> +#include <string_view> #include <vector> ZEN_THIRD_PARTY_INCLUDES_START @@ -41,6 +42,7 @@ static constinit uint32_t HashAccept = HashStringAsLowerDjb2("Accept"sv); static constinit uint32_t HashExpect = HashStringAsLowerDjb2("Expect"sv); static constinit uint32_t HashSession = HashStringAsLowerDjb2("UE-Session"sv); static constinit uint32_t HashRequest = HashStringAsLowerDjb2("UE-Request"sv); +static constinit uint32_t HashRange = HashStringAsLowerDjb2("Range"sv); inline spdlog::logger& InitLogger() @@ -103,6 +105,7 @@ public: virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::span<IoBuffer> Blobs) override; virtual void WriteResponse(HttpResponseCode ResponseCode, HttpContentType ContentType, std::u8string_view ResponseString) override; virtual void WriteResponseAsync(std::function<void(HttpServerRequest&)>&& ContinuationHandler) override; + virtual bool TryGetRanges(HttpRanges& Ranges) override; using HttpServerRequest::WriteResponse; @@ -151,6 +154,8 @@ struct HttpRequest Oid SessionId() const { return m_SessionId; } int RequestId() const { return m_RequestId; } + std::string_view RangeHeader() const { return m_RangeHeaderIndex != -1 ? m_Headers[m_RangeHeaderIndex].Value : std::string_view(); } + private: struct HeaderEntry { @@ -176,6 +181,7 @@ private: int8_t m_ContentLengthHeaderIndex; int8_t m_AcceptHeaderIndex; int8_t m_ContentTypeHeaderIndex; + int8_t m_RangeHeaderIndex; HttpVerb m_RequestVerb; bool m_KeepAlive = false; bool m_Expect100Continue = false; @@ -740,6 +746,10 @@ HttpRequest::AppendCurrentHeader() ZEN_INFO("Unexpected expect - Expect: {}", HeaderValue); } } + else if (HeaderHash == HashRange) + { + m_RangeHeaderIndex = (int8_t)m_Headers.size(); + } m_Headers.emplace_back(HeaderName, HeaderValue); } @@ -912,6 +922,7 @@ HttpRequest::ResetState() m_ContentLengthHeaderIndex = -1; m_AcceptHeaderIndex = -1; m_ContentTypeHeaderIndex = -1; + m_RangeHeaderIndex = -1; m_Expect100Continue = false; m_BodyBuffer = {}; m_BodyPosition = 0; @@ -1178,6 +1189,12 @@ HttpAsioServerRequest::WriteResponseAsync(std::function<void(HttpServerRequest&) ContinuationHandler(*this); } +bool +HttpAsioServerRequest::TryGetRanges(HttpRanges& Ranges) +{ + return TryParseHttpRangeHeader(m_Request.RangeHeader(), Ranges); +} + ////////////////////////////////////////////////////////////////////////// HttpAsioServerImpl::HttpAsioServerImpl() |