2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#ifndef ATTRIBUTEINJECTOR_H
43#define ATTRIBUTEINJECTOR_H
45#ifndef DOXYGEN_SHOULD_SKIP_THIS
60 for (
unsigned i = 0; i != N; ++i) {
74 template <
typename Attribute>
75 concept InjectableAttribute = std::copy_constructible<Attribute>
and std::default_initializable<Attribute>
and std::copyable<Attribute>;
95 constexpr bool setAttribute(
const Attribute& attribute,
bool overwrite =
false) {
96 bool inserted =
false;
108 constexpr bool setAttribute(
const Attribute&& attribute,
bool overwrite =
false) {
109 bool inserted =
false;
121 constexpr bool getAttribute(
const std::function<
void(Attribute&)>& onFound)
const {
122 const bool found =
false;
124 if (attribute !=
nullptr &&
attributeType ==
typeid(Attribute).name()) {
132 constexpr void getAttribute(
const std::function<
void(Attribute&)>& onFound,
133 const std::function<
void(
const std::string&)>& onNotFound)
const {
134 if (attribute !=
nullptr &&
attributeType ==
typeid(Attribute).name()) {
137 onNotFound(std::string(
typeid(Attribute).name()));
149 constexpr bool setAttribute(
const Attribute& attribute,
const std::string& subKey =
"",
bool overwrite =
false) {
150 bool inserted =
false;
152 if (!
attributes.contains(
typeid(Attribute).name() + std::string(key) + subKey) || overwrite) {
153 attributes[
typeid(Attribute).name() + std::string(key) + subKey] =
162 constexpr bool setAttribute(
const Attribute&& attribute,
const std::string& subKey =
"",
bool overwrite =
false) {
163 bool inserted =
false;
165 if (!
attributes.contains(
typeid(Attribute).name() + std::string(key) + subKey) || overwrite) {
166 attributes[
typeid(Attribute).name() + std::string(key) + subKey] =
176 bool deleted =
attributes.erase(
typeid(Attribute).name() + std::string(key) + subKey) > 0;
183 bool found = attributes.find(
typeid(Attribute).name() + std::string(key) + subKey) !=
attributes.end();
189 bool getAttribute(
const std::function<
void(Attribute&)>& onFound,
const std::string& subKey =
"")
const {
192 std::map<std::string, std::shared_ptr<
void>>::const_iterator it =
193 attributes.find(
typeid(Attribute).name() + std::string(key) + subKey);
198 onFound(**std::static_pointer_cast<
AttributeProxy<Attribute>>(it->second));
206 const std::function<
void(
const std::string&)>& onNotFound,
207 const std::string& subKey =
"")
const {
208 std::map<std::string, std::shared_ptr<
void>>::const_iterator it =
209 attributes.find(
typeid(Attribute).name() + std::string(key) + subKey);
212 onFound(**std::static_pointer_cast<
AttributeProxy<Attribute>>(it->second));
214 onNotFound(std::string(
typeid(Attribute).name()) + std::string(key) + subKey);
#define DECLARE_ROUTER_REQUESTMETHOD(METHOD)
#define APPLICATION(req, res)
#define MIDDLEWARE(req, res, next)
static void init(int argc, char *argv[])
static int start(const utils::Timeval &timeOut={LONG_MAX, 0})
static constexpr int DISABLED
static constexpr int ERROR
static constexpr int FATAL
void next(const std::string &how) const
bool dispatchNext(bool strictRouting, bool caseInsensitiveRouting, bool mergeParams)
Controller(const std::shared_ptr< web::http::server::Request > &request, const std::shared_ptr< web::http::server::Response > &response)
const std::shared_ptr< Request > & getRequest() const
const std::shared_ptr< Response > & getResponse() const
std::shared_ptr< Response > response
Controller(const Controller &controller)
void setCurrentRoute(Route *currentRoute)
bool nextRouterCalled() const
void setRootRoute(RootRoute *rootRoute)
std::shared_ptr< Request > request
Controller & operator=(const Controller &controller) noexcept
void operator()(const std::string &how="") const
Next(Controller &controller)
web::http::CiStringMap< std::string > cookies
Request(Request &&) noexcept=delete
const std::string & cookie(const std::string &key) const
Request & operator=(Request &&) noexcept=delete
std::map< std::string, std::string > params
const std::string & get(const std::string &key, int i=0) const
Request(const std::shared_ptr< web::http::server::Request > &request) noexcept
std::shared_ptr< web::http::server::Request > requestBase
Request(Request &)=delete
const std::string & query(const std::string &key) const
web::http::CiStringMap< std::string > headers
const std::string & param(const std::string &id, const std::string &fallBack="")
std::map< std::string, std::string > queries
web::http::CiStringMap< std::string > trailer
Request & operator=(Request &)=delete
Response & set(const std::string &field, const std::string &value, bool overwrite=true)
void send(const std::string &chunk)
Response & status(int status)
void json(const nlohmann::json &json)
Route & head(const Router &router) const
Route & all(const Router &router) const
const Router & setCaseInsensitiveRouting(bool caseInsensitiveRouting=true) const
const Router & setStrictRouting(bool strictRouting=true) const
Route & options(const Router &router) const
Route & connect(const Router &router) const
Route & post(const Router &router) const
Route & del(const Router &router) const
Router(const Router &)=default
Route & use(const Router &router) const
Route & get(const Router &router) const
Route & trace(const Router &router) const
Route & patch(const Router &router) const
const Router & setMergeParams(bool mergeParams=true) const
std::list< std::string > getRoutes() const
Route & put(const Router &router) const
std::shared_ptr< RootRoute > rootRoute
WebAppT(const std::string &name, const Router &router)
typename Server::SocketConnection SocketConnection
express::Response Response
typename Server::SocketAddress SocketAddress
WebAppT(const std::string &name)
static void init(int argc, char *argv[])
static core::TickStatus tick(const utils::Timeval &timeOut=0)
static core::State state()
static int start(const utils::Timeval &timeOut={LONG_MAX, 0})
WebApp(const Router &router)
LogMessage(Level level, int verboseLevel=-1, bool withErrno=false)
std::string toString(bool expanded=true) const override
const Super & listen(uint16_t port, const std::function< void(const SocketAddress &, core::socket::State)> &onStatus) const
constexpr AttributeProxy(const Attribute &attribute)
constexpr Attribute & operator*()
constexpr bool setAttribute(const Attribute &&attribute, const std::string &subKey="", bool overwrite=false)
constexpr bool hasAttribute(const std::string &subKey="") const
constexpr bool delAttribute(const std::string &subKey="")
bool getAttribute(const std::function< void(Attribute &)> &onFound, const std::string &subKey="") const
std::map< std::string, std::shared_ptr< void > > attributes
void getAttribute(const std::function< void(Attribute &)> &onFound, const std::function< void(const std::string &)> &onNotFound, const std::string &subKey="") const
constexpr bool setAttribute(const Attribute &attribute, const std::string &subKey="", bool overwrite=false)
constexpr void getAttribute(const std::function< void(Attribute &)> &onFound, const std::function< void(const std::string &)> &onNotFound) const
std::string attributeType
constexpr bool setAttribute(const Attribute &attribute, bool overwrite=false)
constexpr bool setAttribute(const Attribute &&attribute, bool overwrite=false)
std::shared_ptr< void > attribute
constexpr bool getAttribute(const std::function< void(Attribute &)> &onFound) const
Timeval(const std::initializer_list< time_t > &initList) noexcept
int main(int argc, char *argv[])
std::vector< json > Trace
static void ensureTrace(const std::shared_ptr< express::Request > &req)
static void tracePush(const std::shared_ptr< express::Request > &req, const std::string &label)
static json snapshot(const std::shared_ptr< express::Request > &req, const std::string &label)
static json traceGet(const std::shared_ptr< express::Request > &req)
fixed_string(char const (&)[N]) -> fixed_string< N - 1 >
web::http::server::Server< net::in::stream::legacy::SocketServer > Server
auto operator<=>(const fixed_string &) const =default
constexpr fixed_string(char const *s)
constexpr operator char const *() const