From 2cadd38b6b22190ed5ff2b0148dd3515cf2e6b8f Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 6 Mar 2015 23:32:28 +0900 Subject: [PATCH] asio: Fix path matching in server --- src/asio_server_serve_mux.cc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/asio_server_serve_mux.cc b/src/asio_server_serve_mux.cc index 1959ea10..829568ba 100644 --- a/src/asio_server_serve_mux.cc +++ b/src/asio_server_serve_mux.cc @@ -103,20 +103,26 @@ request_cb serve_mux::handler(request_impl &req) const { return status_handler(404); } +namespace { +bool path_match(const std::string &pattern, const std::string &path) { + if (pattern.back() != '/') { + return pattern == path; + } + return util::startsWith(path, pattern); +} +} // namespace + request_cb serve_mux::match(const std::string &path) const { const handler_entry *ent = nullptr; size_t best = 0; for (auto &kv : mux_) { auto &pattern = kv.first; - if (!util::startsWith(path, pattern)) { + if (!path_match(pattern, path)) { continue; } - if (path.size() == pattern.size() || pattern.back() == '/' || - path[pattern.size()] == '/') { - if (!ent || best < pattern.size()) { - best = pattern.size(); - ent = &kv.second; - } + if (!ent || best < pattern.size()) { + best = pattern.size(); + ent = &kv.second; } } if (ent) {