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

This commit is contained in:
eidheim 2019-04-29 13:22:57 +02:00
commit d6985ed62e
2 changed files with 18 additions and 3 deletions

View file

@ -1,6 +1,7 @@
#ifndef SIMPLE_WEB_STATUS_CODE_HPP
#define SIMPLE_WEB_STATUS_CODE_HPP
#include <cstdlib>
#include <map>
#include <string>
#include <unordered_map>
@ -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<std::string, SimpleWeb::StatusCode> {
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<StatusCode>(atoi(number.c_str()));
return pos->second;
}

View file

@ -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<int>(status_code("050 Custom")) == 50);
ASSERT(static_cast<int>(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");