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 EXPRESS_DISPATCHER_REGEX_UTILS_H
43#define EXPRESS_DISPATCHER_REGEX_UTILS_H
49#ifndef DOXYGEN_SHOULD_SKIP_THIS
58#include <unordered_map>
66 std::vector<std::string>
explode(
const std::string& s,
char delim);
77 void splitPathAndQuery(std::string_view url, std::string_view& path, std::string_view& query);
79 std::unordered_map<std::string, std::string>
parseQuery(std::string_view qs);
84 inline bool ieq(
char a,
char b) {
85 return std::tolower(
static_cast<
unsigned char>(a)) == std::tolower(
static_cast<
unsigned char>(b));
88 bool equalPath(std::string_view a, std::string_view b,
bool caseInsensitive);
91 bool boundaryPrefix(std::string_view path, std::string_view base,
bool caseInsensitive);
94 const std::unordered_map<std::string, std::string>& need);
101 std::pair<std::regex, std::vector<std::string>>
compileParamRegex(std::string_view mountPath,
104 bool caseInsensitive);
106 template <
typename RequestLike>
108 matchAndFillParams(
const std::regex& rx,
const std::vector<std::string>& names, std::string_view reqPath, RequestLike& req) {
110 if (!std::regex_search(reqPath.begin(), reqPath.end(), m, rx)) {
113 const size_t g = (!m.empty()) ? (m.size() - 1) : 0;
114 const size_t n = std::min(names.size(), g);
115 for (size_t i = 0; i < n; ++i) {
116 req.params[names[i]] = m[i + 1].str();
const std::string & getConnectionName() const
SocketConnection * getSocketConnection() const
const std::shared_ptr< Request > & getRequest()
bool getStrictRouting() const
bool getCaseInsensitiveRouting() const
const std::shared_ptr< Response > & getResponse()
std::shared_ptr< Route > nextRoute
web::http::CiStringMap< std::string > queries
web::http::server::SocketContext * getSocketContext() const
std::list< std::string > getRoute(const std::string &parentMountPath, bool strictRouting) const
std::vector< std::string > names
const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> lambda
bool dispatch(express::Controller &controller, const std::string &parentMountPath, const express::MountPoint &mountPoint) override
std::list< std::string > getRoutes(const std::string &parentMountPath, const MountPoint &mountPoint, bool strictRouting) const override
ApplicationDispatcher(const std::function< void(const std::shared_ptr< Request > &, const std::shared_ptr< Response > &)> &lambda)
bool matchAndFillParams(const std::regex &rx, const std::vector< std::string > &names, std::string_view reqPath, RequestLike &req)
bool querySupersetMatches(const std::unordered_map< std::string, std::string > &rq, const std::unordered_map< std::string, std::string > &need)
void setParams(const std::string &cpath, Request &req)
std::vector< std::string > explode(const std::string &input, char delim)
void splitPathAndQuery(std::string_view url, std::string_view &path, std::string_view &query)
bool boundaryPrefix(std::string_view path, std::string_view base, bool caseInsensitive)
std::pair< std::regex, std::vector< std::string > > compileParamRegex(std::string_view mountPath, bool isPrefix, bool strictRouting, bool caseInsensitive)
std::smatch matchResult(const std::string &cpath)
std::unordered_map< std::string, std::string > parseQuery(std::string_view qs)
bool hasResult(const std::string &cpath)
std::string_view trimOneTrailingSlash(std::string_view s)
bool equalPath(std::string_view a, std::string_view b, bool caseInsensitive)
const std::regex & pathRegex()
std::string relativeMountPath