#include "webcc/response.h" #include "webcc/utility.h" namespace webcc { static const std::pair kTable[] = { { Status::kContinue, "Continue" }, { Status::kSwitchingProtocols, "Switching Protocols" }, { Status::kProcessing, "Processing" }, { Status::kEarlyHints, "Early Hints" }, { Status::kOK, "OK" }, { Status::kCreated, "Created" }, { Status::kAccepted, "Accepted" }, { Status::kNoContent, "No Content" }, { Status::kNotModified, "Not Modified" }, { Status::kTemporaryRedirect, "Temporary Reditect" }, { Status::kPermanentRedirect, "Permanent Redirect" }, { Status::kUnauthorized, "Unauthorized" }, { Status::kForbidden, "Forbidden" }, { Status::kMethodNotAllowed, "Method Not Allowed" }, { Status::kNotAcceptable, "Not Acceptable" }, { Status::kProxyAuthenticationRequired, "Proxy Authentication Required" }, { Status::kRequestTimeout, "Request Timeout" }, { Status::kConflict, "Conflict" }, { Status::kGone, "Gone" }, { Status::kLocked, "Locked" }, { Status::kIamATeapot, "I'm a Teapot" }, { Status::kBadRequest, "Bad Request" }, { Status::kNotFound, "Not Found" }, { Status::kInternalServerError, "Internal Server Error" }, { Status::kNotImplemented, "Not Implemented" }, { Status::kBadGateway, "Bad Gateway" }, { Status::kServiceUnavailable, "Service Unavailable" }, // Not Standard Code By UnknownObject { Status::k_uRequestFormatError, "Request Format Error" }, { Status::k_uRequestInvalid, "Request Invalid" }, { Status::k_uSubProcessFalied, "SubProcess Falied" }, { Status::k_uURLOutOfRange, "URL Out Of Range" }, { Status::k_uInvalidRequestHost, "Invalid Request Host" }, { Status::k_uIPBlocked, "IP Blocked" }, { Status::k_uIllegalUpload, "Illegal Upload" }, { Status::k_uFileFormatError, "File Format Error" }, { Status::k_uInvalidFile, "Invalid File" }, { Status::k_uFileTooLarge, "File Too Large" }, { Status::k_uRPSLimited, "RPS Limit" }, { Status::k_uServerHateYou, "Server Hate You" }, { Status::k_uDoSFound, "DoS Found" }, { Status::k_uDDoSFound, "DDoS Found" }, { Status::k_uUnknownServerError, "Unknown Server Error" } }; static const char* GetReason(int status) { for (auto& pair : kTable) { if (pair.first == status) { return pair.second; } } return ""; } void Response::Prepare() { if (!start_line_.empty()) { return; } start_line_ = "HTTP/1.1 "; start_line_ += std::to_string(status_); start_line_ += " "; if (reason_.empty()) { start_line_ += GetReason(status_); } else { start_line_ += reason_; } if (!HasHeader(headers::kServer)) SetHeader(headers::kServer, utility::UserAgent()); } } // namespace webcc