Let's implement a simple redirection module.
This module will handle incoming http requests and send back a redirection response.
For example we might want to redirect all requests to google.com
.
So for the following incoming request:
GET /google HTTP/1.1
We'll then get the following response:
HTTP/1.1 301 Moved Permanently
Location: www.google.com
First, let's implement the IHandlerModule
interface base.
#include "ziapi/Module.hpp"
class PhpCgiModule : public ziapi::IHandlerModule {
public:
void Init(const ziapi::config::Node &cfg) override {}
[[nodiscard]] Version GetVersion() const noexcept { return {4, 0, 0}; }
[[nodiscard]] Version GetCompatibleApiVersion() const noexcept { return {4, 0, 0}; }
[[nodiscard]] const char *GetName() const noexcept { return "Redirection Module"; }
[[nodiscard]] const char *GetDescription() const noexcept { return "Redirects the request to another location."; }
[[nodiscard]] double GetHandlerPriority() const noexcept {
// Directions should be treated in priority
return 0.9;
}
void Handle(ziapi::http::Context &ctx, const ziapi::http::Request &req, ziapi::http::Response &res) override {}
};
Let's give our module a configuration.
Let's load from the config the route to which we will redirect requests. We'll store the value in a member variable of our module called redirection_route_
.
...
void Init(const Config &cfg)
{
/// We'll load from the configuration where to redirect to!
redirection_route_ = cfg["modules"]["redirection"]["route"];
}
...
We want to redirect all requests so we just return true
in our ShouldHandle()
.
...
[[nodiscard]] bool ShouldHandle(const http::Context &, const http::Request &req) const
{
return true;
}
...
Let's now implement the Handle()
method. We simply redirect each request to the redirection_route_
by changing the Location
header on the response. We also set the appropriate status code.
...
void Handle(http::Context &, const http::Request &, http::Response &res)
{
res.headers[ziapi::http::header::kLocation] = redirection_route_;
res.status_code = ziapi::http::code::kMovedPermanently;
}
...
You can check the full source code for this example here.