Skip to content
This repository has been archived by the owner on Jun 1, 2023. It is now read-only.

Commit

Permalink
synchronize access to the request-routes
Browse files Browse the repository at this point in the history
  • Loading branch information
weigon committed Jun 14, 2018
1 parent f4b2dbb commit 182eb03
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
13 changes: 10 additions & 3 deletions src/http/src/http_server_plugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <atomic>
#include <chrono>
#include <thread>
#include <mutex>

#include <sys/types.h>

Expand Down Expand Up @@ -66,10 +67,12 @@ std::atomic<int> g_shutdown_pending { 0 };
* if no handler is found, reply with 404 not found
*/
void HttpRequestRouter::append(const std::string &url_regex_str, std::unique_ptr<BaseRequestHandler> cb) {
std::lock_guard<std::mutex> lock(route_mtx_);
request_handlers_.emplace_back(RouterData { url_regex_str, PosixRE {url_regex_str}, std::move(cb) });
}

void HttpRequestRouter::remove(const std::string &url_regex_str) {
std::lock_guard<std::mutex> lock(route_mtx_);
for (auto it = request_handlers_.begin(); it != request_handlers_.end(); ) {
if (it->url_regex_str == url_regex_str) {
it = request_handlers_.erase(it);
Expand All @@ -80,7 +83,7 @@ void HttpRequestRouter::remove(const std::string &url_regex_str) {
}

// if no routes are specified, return 404
void HttpRequestRouter::route_default(HttpRequest &req) const {
void HttpRequestRouter::route_default(HttpRequest &req) {
if (default_route_) {
default_route_->handle_request(req);
} else {
Expand All @@ -89,15 +92,19 @@ void HttpRequestRouter::route_default(HttpRequest &req) const {
}

void HttpRequestRouter::set_default_route(std::unique_ptr<BaseRequestHandler> cb) {
std::lock_guard<std::mutex> lock(route_mtx_);
default_route_ = std::move(cb);
}

void HttpRequestRouter::clear_default_route() {
std::lock_guard<std::mutex> lock(route_mtx_);
default_route_ = nullptr;
}


void HttpRequestRouter::route(HttpRequest req) const {
void HttpRequestRouter::route(HttpRequest req) {
std::lock_guard<std::mutex> lock(route_mtx_);

auto uri = req.get_uri();

for (auto &request_handler: request_handlers_) {
Expand Down Expand Up @@ -127,7 +134,7 @@ void HttpRequestThread::accept_socket() {

void HttpRequestThread::set_request_router(HttpRequestRouter &router) {
evhttp_set_gencb(ev_http.get(), [](evhttp_request * req, void * user_data) {
const auto *rtr = static_cast<HttpRequestRouter *>(user_data);
auto *rtr = static_cast<HttpRequestRouter *>(user_data);
rtr->route(
HttpRequest {
std::unique_ptr<evhttp_request, std::function<void(evhttp_request *)>>(
Expand Down
7 changes: 5 additions & 2 deletions src/http/src/http_server_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <string>
#include <vector>
#include <thread>
#include <mutex>

#include <event2/buffer.h>
#include <event2/event.h>
Expand All @@ -49,11 +50,11 @@ class HttpRequestRouter
void remove(const std::string &url_regex_str);

// if no routes are specified, return 404
void route_default(HttpRequest &req) const;
void route_default(HttpRequest &req);

void set_default_route(std::unique_ptr<BaseRequestHandler> cb);
void clear_default_route();
void route(HttpRequest req) const;
void route(HttpRequest req);
private:
struct RouterData {
std::string url_regex_str;
Expand All @@ -63,6 +64,8 @@ class HttpRequestRouter
std::vector<RouterData> request_handlers_;

std::unique_ptr<BaseRequestHandler> default_route_;

std::mutex route_mtx_;
};

/**
Expand Down

0 comments on commit 182eb03

Please sign in to comment.