aboutsummaryrefslogtreecommitdiff
path: root/zenhttp/httpasio.cpp
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2023-04-19 08:44:34 +0200
committerGitHub <[email protected]>2023-04-19 08:44:34 +0200
commit045702915c4b63d232b99d86a1ee0b16642098c8 (patch)
treeb8487d22d36b1c2a03352c45b386c209b9bb0b27 /zenhttp/httpasio.cpp
parentmake sure initialization of a new filecas dont remove the cas manifest file o... (diff)
downloadzen-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.cpp17
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()