Extract the route related code to new class Router and add UT.

This commit is contained in:
Chunting Gu
2019-09-11 15:10:12 +08:00
parent 9166b5d99e
commit 53a731caf5
5 changed files with 240 additions and 119 deletions
+51
View File
@@ -0,0 +1,51 @@
#ifndef WEBCC_ROUTER_H_
#define WEBCC_ROUTER_H_
#include <regex>
#include <string>
#include "webcc/globals.h"
#include "webcc/view.h"
namespace webcc {
class Router {
public:
virtual ~Router() = default;
// Route a URL to a view.
// The URL should start with "/". E.g., "/instances".
bool Route(const std::string& url, ViewPtr view,
const Strings& methods = { "GET" });
// Route a URL (as regular expression) to a view.
// The URL should start with "/" and be a regular expression.
// E.g., "/instances/(\\d+)".
bool Route(const UrlRegex& regex_url, ViewPtr view,
const Strings& methods = { "GET" });
// Find the view by HTTP method and URL (path).
ViewPtr FindView(const std::string& method, const std::string& url,
UrlArgs* args);
// Match the view by HTTP method and URL (path).
// Return if a view is matched or not.
// If the view asks for data streaming, |stream| will be set to true.
bool MatchView(const std::string& method, const std::string& url,
bool* stream);
private:
struct RouteInfo {
std::string url;
std::regex url_regex;
ViewPtr view;
Strings methods;
};
// Route table.
std::vector<RouteInfo> routes_;
};
} // namespace webcc
#endif // WEBCC_ROUTER_H_