Commit 01eb1fbf authored by Nico Caprioli's avatar Nico Caprioli

Merge remote-tracking branch 'upstream/master'

parents c20e9ef8 efe54d9e
......@@ -253,9 +253,9 @@ namespace Async {
template<typename T>
struct Continuable : public Request {
Continuable(const std::shared_ptr<Core>& chain)
: chain_(chain)
, resolveCount_(0)
: resolveCount_(0)
, rejectCount_(0)
, chain_(chain)
{ }
void resolve(const std::shared_ptr<Core>& core) {
......
......@@ -34,9 +34,9 @@ struct Connection : public std::enable_shared_from_this<Connection> {
Connection()
: fd(-1)
, connectionState_(NotConnected)
, inflightCount(0)
, responsesReceived(0)
, connectionState_(NotConnected)
{
state_.store(static_cast<uint32_t>(State::Idle));
}
......
......@@ -52,6 +52,7 @@
#include <string>
#include <utility>
#include <type_traits>
#include <memory>
#ifdef __GNUC__
# pragma GCC diagnostic push
......@@ -4232,7 +4233,7 @@ struct fields
weekday wd{7u};
time_of_day<Duration> tod{};
fields() = default;
fields() {} // = default; // Note: doesn't compile with default
fields(year_month_day ymd_) : ymd(ymd_) {}
fields(weekday wd_) : wd(wd_) {}
......@@ -4370,7 +4371,7 @@ scan_keyword(std::basic_istream<CharT, Traits>& is, FwdIter kb, FwdIter ke)
const unsigned char does_match = '\2';
unsigned char statbuf[100];
unsigned char* status = statbuf;
unique_ptr<unsigned char, void(*)(void*)> stat_hold(0, free);
std::unique_ptr<unsigned char, void(*)(void*)> stat_hold(0, free);
if (nkw > sizeof(statbuf))
{
status = (unsigned char*)malloc(nkw);
......
......@@ -9,7 +9,9 @@
#include <type_traits>
#include <stdexcept>
#include <array>
#include <vector>
#include <sstream>
#include <algorithm>
#include <sys/timerfd.h>
......@@ -103,6 +105,27 @@ namespace Uri {
params.clear();
}
// \brief Return iterator to the beginning of the parameters map
std::unordered_map<std::string, std::string>::const_iterator
parameters_begin() const {
return params.begin();
}
// \brief Return iterator to the end of the parameters map
std::unordered_map<std::string, std::string>::const_iterator
parameters_end() const {
return params.begin();
}
// \brief returns all parameters given in the query
std::vector<std::string> parameters() const {
std::vector<std::string> keys;
std::transform(params.begin(), params.end(), std::back_inserter(keys),
[](const std::unordered_map<std::string, std::string>::value_type
&pair) {return pair.first;});
return keys;
}
private:
//first is key second is value
std::unordered_map<std::string, std::string> params;
......
......@@ -146,14 +146,21 @@ public:
void removeRoute(Http::Method method, std::string resource);
void addCustomHandler(Route::Handler handler);
void addNotFoundHandler(Route::Handler handler);
inline bool hasNotFoundHandler() { return notFoundHandler != nullptr; }
void invokeNotFoundHandler(const Http::Request &req, Http::ResponseWriter resp) const;
Route::Status route(const Http::Request& request, Http::ResponseWriter response);
Route::Status route(const Http::Request& request, Http::ResponseWriter response);
Status route(const Http::Request& request, Http::ResponseWriter response);
private:
void addRoute(Http::Method method, std::string resource, Route::Handler handler);
std::unordered_map<Http::Method, FragmentTreeNode> routes;
std::vector<Route::Handler> customHandlers;
Route::Handler notFoundHandler;
};
namespace Private {
......@@ -207,6 +214,8 @@ namespace Routes {
void Options(Router& router, std::string resource, Route::Handler handler);
void Remove(Router& router, Http::Method method, std::string resource);
void NotFound(Router& router, Route::Handler handler);
namespace details {
template <class... Args>
struct TypeList
......
......@@ -122,11 +122,6 @@ CacheControl::parseRaw(const char* str, size_t len) {
RawStreamBuf<> buf(const_cast<char *>(str), len);
StreamCursor cursor(&buf);
const char *begin = str;
auto memsize = [&](size_t s) {
return std::min(s, cursor.remaining());
};
do {
bool found = false;
......@@ -143,7 +138,6 @@ CacheControl::parseRaw(const char* str, size_t len) {
if (!found) {
for (const auto& d: TimedDirectives) {
if (match_raw(d.str, d.size, cursor)) {
int c;
if (!cursor.advance(1)) {
throw std::runtime_error("Invalid caching directive, missing delta-seconds");
}
......@@ -211,6 +205,7 @@ CacheControl::write(std::ostream& os) const {
case CacheDirective::Ext:
return "";
}
return "";
};
auto hasDelta = [](CacheDirective directive) {
......@@ -282,6 +277,9 @@ Connection::write(std::ostream& os) const {
case ConnectionControl::KeepAlive:
os << "Keep-Alive";
break;
case ConnectionControl::Ext:
os << "Ext";
break;
}
}
......
......@@ -18,14 +18,14 @@ namespace Tcp {
using namespace std;
Peer::Peer()
: fd_(-1)
, transport_(nullptr)
: transport_(nullptr)
, fd_(-1)
{ }
Peer::Peer(const Address& addr)
: addr(addr)
: transport_(nullptr)
, addr(addr)
, fd_(-1)
, transport_(nullptr)
{ }
Address
......
......@@ -286,6 +286,32 @@ Pistache::Rest::FragmentTreeNode::invokeRouteHandler(const Http::Request& req, H
return invokeRouteHandler(path, req, std::move(response), params, splats);
} catch (std::runtime_error&) {
return Route::Status::NotFound;
namespace Private {
RouterHandler::RouterHandler(const Rest::Router& router)
: router(router)
{
}
void
RouterHandler::onRequest(
const Http::Request& req,
Http::ResponseWriter response)
{
auto resp = response.clone();
auto result = router.route(req, std::move(resp));
/* @Feature: add support for a custom NotFound handler */
if (result == Router::Status::NotFound)
{
if (router.hasNotFoundHandler())
{
auto resp2 = response.clone();
router.invokeNotFoundHandler(req, std::move(resp2));
}
else
response.send(Http::Code::Not_Found, "Could not find a matching route");
}
}
......@@ -359,7 +385,18 @@ Router::addCustomHandler(Route::Handler handler) {
customHandlers.push_back(std::move(handler));
}
Route::Status
void
Router::addNotFoundHandler(Route::Handler handler) {
notFoundHandler = std::move(handler);
}
void
Router::invokeNotFoundHandler(const Http::Request &req, Http::ResponseWriter resp) const
{
notFoundHandler(Rest::Request(std::move(req), std::vector<TypedParam>(), std::vector<TypedParam>()), std::move(resp));
}
Router::Status
Router::route(const Http::Request& req, Http::ResponseWriter response) {
auto& r = routes[req.method()];
try {
......@@ -410,8 +447,12 @@ void Options(Router& router, std::string resource, Route::Handler handler) {
router.options(std::move(resource), std::move(handler));
}
void Remove(Router& router, Http::Method method, std::string resource) {
router.removeRoute(method, resource);
void NotFound(Router& router, Route::Handler handler) {
router.addNotFoundHandler(std::move(handler));
}
} // namespace Routes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment