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:
parent
ded57636dd
commit
d6985ed62e
2 changed files with 18 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue