aboutsummaryrefslogtreecommitdiff
path: root/src/zenhttp/include
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-02-13 13:27:08 +0100
committerGitHub Enterprise <[email protected]>2026-02-13 13:27:08 +0100
commit3b5b777900d9f59ff32eb7cea79e3a72a08c67a6 (patch)
treef5ffdeaad0ca9e291085d707209938c6dfe86d20 /src/zenhttp/include
parentbump sentry to 0.12.1 (#721) (diff)
downloadzen-3b5b777900d9f59ff32eb7cea79e3a72a08c67a6.tar.xz
zen-3b5b777900d9f59ff32eb7cea79e3a72a08c67a6.zip
add IHttpRequestFilter to allow server implementation to filter/reject requests (#753)
* add IHttpRequestFilter to allow server implementation to filter/reject requests
Diffstat (limited to 'src/zenhttp/include')
-rw-r--r--src/zenhttp/include/zenhttp/httpserver.h22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/zenhttp/include/zenhttp/httpserver.h b/src/zenhttp/include/zenhttp/httpserver.h
index f0a667686..60f6bc9f2 100644
--- a/src/zenhttp/include/zenhttp/httpserver.h
+++ b/src/zenhttp/include/zenhttp/httpserver.h
@@ -41,7 +41,7 @@ public:
[[nodiscard]] inline std::string_view RelativeUri() const { return m_Uri; } // Returns URI without service prefix
[[nodiscard]] std::string_view RelativeUriWithExtension() const { return m_UriWithExtension; }
[[nodiscard]] inline std::string_view QueryString() const { return m_QueryString; }
- [[nodiscard]] inline std::string_view BaseUri() const { return m_BaseUri; } // Service prefix
+ [[nodiscard]] inline HttpService& Service() const { return m_Service; }
struct QueryParams
{
@@ -121,13 +121,14 @@ protected:
kHaveSessionId = 1 << 3,
};
- mutable uint32_t m_Flags = 0;
+ mutable uint32_t m_Flags = 0;
+
+ HttpService& m_Service; // Service handling this request
HttpVerb m_Verb = HttpVerb::kGet;
HttpContentType m_ContentType = HttpContentType::kBinary;
HttpContentType m_AcceptType = HttpContentType::kUnknownContentType;
uint64_t m_ContentLength = ~0ull;
- std::string_view m_BaseUri; // Base URI path of the service handling this request
- std::string_view m_Uri; // URI without service prefix
+ std::string_view m_Uri; // URI without service prefix
std::string_view m_UriWithExtension;
std::string_view m_QueryString;
mutable uint32_t m_RequestId = ~uint32_t(0);
@@ -148,6 +149,17 @@ public:
virtual void OnRequestComplete() = 0;
};
+struct IHttpRequestFilter
+{
+ enum class Result
+ {
+ Forbidden,
+ ResponseSent,
+ Accepted
+ };
+ virtual Result FilterRequest(HttpServerRequest& Request) = 0;
+};
+
/**
* Base class for implementing an HTTP "service"
*
@@ -184,6 +196,7 @@ class HttpServer : public RefCounted
public:
void RegisterService(HttpService& Service);
void EnumerateServices(std::function<void(HttpService&)>&& Callback);
+ void SetHttpRequestFilter(IHttpRequestFilter* RequestFilter);
int Initialize(int BasePort, std::filesystem::path DataDir);
void Run(bool IsInteractiveSession);
@@ -195,6 +208,7 @@ private:
virtual void OnRegisterService(HttpService& Service) = 0;
virtual int OnInitialize(int BasePort, std::filesystem::path DataDir) = 0;
+ virtual void OnSetHttpRequestFilter(IHttpRequestFilter* RequestFilter) = 0;
virtual void OnRun(bool IsInteractiveSession) = 0;
virtual void OnRequestExit() = 0;
virtual void OnClose() = 0;