aboutsummaryrefslogtreecommitdiff
path: root/zenhttp/httpserver.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-04-20 12:09:47 +0200
committerStefan Boberg <[email protected]>2023-04-20 12:09:47 +0200
commit74ff3745511e80ad4529620858604890f222af74 (patch)
tree2b6c836442791d84bdedd5cc0e81154d9e36159d /zenhttp/httpserver.cpp
parent#pragma once added to some headers (diff)
parentoops: clang-format (diff)
downloadzen-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.cpp70
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: