From d6985ed62eb459645597738e975ceb40cce9aec3 Mon Sep 17 00:00:00 2001 From: eidheim Date: Mon, 29 Apr 2019 13:22:57 +0200 Subject: [PATCH] Fixes #261: SimpleWeb::status_code(const std::string &) now only regards the status code number when searching for status code enum, and can also return undefined enums that can be cast to an integer value --- status_code.hpp | 15 ++++++++++++--- tests/status_code_test.cpp | 6 ++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/status_code.hpp b/status_code.hpp index 0792727..9f9ecc5 100644 --- a/status_code.hpp +++ b/status_code.hpp @@ -1,6 +1,7 @@ #ifndef SIMPLE_WEB_STATUS_CODE_HPP #define SIMPLE_WEB_STATUS_CODE_HPP +#include #include #include #include @@ -140,17 +141,25 @@ namespace SimpleWeb { } inline StatusCode status_code(const std::string &status_code_string) noexcept { + if(status_code_string.size() < 3) + return StatusCode::unknown; + + auto number = status_code_string.substr(0, 3); + if(number[0] < '0' || number[0] > '9' || number[1] < '0' || number[1] > '9' || number[2] < '0' || number[2] > '9') + return StatusCode::unknown; + class StringToStatusCode : public std::unordered_map { public: StringToStatusCode() { for(auto &status_code : status_code_strings()) - emplace(status_code.second, status_code.first); + emplace(status_code.second.substr(0, 3), status_code.first); } }; static StringToStatusCode string_to_status_code; - auto pos = string_to_status_code.find(status_code_string); + + auto pos = string_to_status_code.find(number); if(pos == string_to_status_code.end()) - return StatusCode::unknown; + return static_cast(atoi(number.c_str())); return pos->second; } diff --git a/tests/status_code_test.cpp b/tests/status_code_test.cpp index 679e504..1b784d4 100644 --- a/tests/status_code_test.cpp +++ b/tests/status_code_test.cpp @@ -5,9 +5,15 @@ using namespace SimpleWeb; int main() { + ASSERT(status_code("") == StatusCode::unknown); + ASSERT(status_code("Error") == StatusCode::unknown); ASSERT(status_code("000 Error") == StatusCode::unknown); ASSERT(status_code(StatusCode::unknown) == ""); + ASSERT(static_cast(status_code("050 Custom")) == 50); + ASSERT(static_cast(status_code("950 Custom")) == 950); ASSERT(status_code("100 Continue") == StatusCode::information_continue); + ASSERT(status_code("100 C") == StatusCode::information_continue); + ASSERT(status_code("100") == StatusCode::information_continue); ASSERT(status_code(StatusCode::information_continue) == "100 Continue"); ASSERT(status_code("200 OK") == StatusCode::success_ok); ASSERT(status_code(StatusCode::success_ok) == "200 OK");