diff options
| author | Stefan Boberg <[email protected]> | 2023-04-20 12:09:47 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2023-04-20 12:09:47 +0200 |
| commit | 74ff3745511e80ad4529620858604890f222af74 (patch) | |
| tree | 2b6c836442791d84bdedd5cc0e81154d9e36159d /zenhttp/httpserver.cpp | |
| parent | #pragma once added to some headers (diff) | |
| parent | oops: clang-format (diff) | |
| download | zen-74ff3745511e80ad4529620858604890f222af74.tar.xz zen-74ff3745511e80ad4529620858604890f222af74.zip | |
Merge branch 'main' of https://github.com/EpicGames/zen
Diffstat (limited to 'zenhttp/httpserver.cpp')
| -rw-r--r-- | zenhttp/httpserver.cpp | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/zenhttp/httpserver.cpp b/zenhttp/httpserver.cpp index 840b90931..3576d9b3d 100644 --- a/zenhttp/httpserver.cpp +++ b/zenhttp/httpserver.cpp @@ -4,7 +4,6 @@ #include "httpasio.h" #include "httpnull.h" -#include "httpsys.h" #include <zencore/compactbinary.h> #include <zencore/compactbinarybuilder.h> @@ -185,6 +184,70 @@ ParseContentTypeInit(const std::string_view& ContentTypeString) HttpContentType (*ParseContentType)(const std::string_view& ContentTypeString) = &ParseContentTypeInit; +bool +TryParseHttpRangeHeader(std::string_view RangeHeader, HttpRanges& Ranges) +{ + if (RangeHeader.empty()) + { + return false; + } + + const size_t Count = Ranges.size(); + + std::size_t UnitDelim = RangeHeader.find_first_of('='); + if (UnitDelim == std::string_view::npos) + { + return false; + } + + // only bytes for now + std::string_view Unit = RangeHeader.substr(0, UnitDelim); + if (Unit != "bytes"sv) + { + return false; + } + + std::string_view Tokens = RangeHeader.substr(UnitDelim); + while (!Tokens.empty()) + { + // Skip =, + Tokens = Tokens.substr(1); + + size_t Delim = Tokens.find_first_of(','); + if (Delim == std::string_view::npos) + { + Delim = Tokens.length(); + } + + std::string_view Token = Tokens.substr(0, Delim); + Tokens = Tokens.substr(Delim); + + Delim = Token.find_first_of('-'); + if (Delim == std::string_view::npos) + { + return false; + } + + const auto Start = ParseInt<uint32_t>(Token.substr(0, Delim)); + const auto End = ParseInt<uint32_t>(Token.substr(Delim + 1)); + + if (Start.has_value() && End.has_value() && End.value() > Start.value()) + { + Ranges.push_back({.Start = Start.value(), .End = End.value()}); + } + else if (Start) + { + Ranges.push_back({.Start = Start.value()}); + } + else if (End) + { + Ranges.push_back({.End = End.value()}); + } + } + + return Count != Ranges.size(); +} + ////////////////////////////////////////////////////////////////////////// const std::string_view @@ -641,6 +704,9 @@ enum class HttpServerClass kHttpNull }; +// Implemented in httpsys.cpp +Ref<HttpServer> CreateHttpSysServer(int Concurrency, int BackgroundWorkerThreads); + Ref<HttpServer> CreateHttpServer(std::string_view ServerClass) { @@ -677,7 +743,7 @@ CreateHttpServer(std::string_view ServerClass) #if ZEN_WITH_HTTPSYS case HttpServerClass::kHttpSys: ZEN_INFO("using http.sys server implementation"); - return new HttpSysServer(std::thread::hardware_concurrency(), /* background worker threads */ 16); + return CreateHttpSysServer(std::thread::hardware_concurrency(), /* background worker threads */ 16); #endif case HttpServerClass::kHttpNull: |