125 lines
4.5 KiB
C++
125 lines
4.5 KiB
C++
#include "webcc/response.h"
|
|
|
|
#include "webcc/utility.h"
|
|
|
|
namespace webcc {
|
|
|
|
static const std::pair<int, const char*> 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::kNonAuthoritativeInformation, "Non-Authoritative Information" },
|
|
{ Status::kNoContent, "No Content" },
|
|
{ Status::kResetContent, "Reset Content" },
|
|
{ Status::kPartialContent, "Partial Content" },
|
|
{ Status::kMultiStatus, "Multi Status" },
|
|
{ Status::kAlreadyReported, "Already Reported" },
|
|
{ Status::kIMUsed, "IM Used" },
|
|
|
|
{ Status::kMultipleChoices, "Multiple Choices" },
|
|
{ Status::kMovedPermanently, "Moved Permanently" },
|
|
{ Status::kFound, "Found" },
|
|
{ Status::kSeeOther, "SeeOther" },
|
|
{ Status::kNotModified, "Not Modified" },
|
|
{ Status::kUseProxy, "Use Proxy" },
|
|
{ Status::k__Unused, "Unused" },
|
|
{ Status::kTemporaryRedirect, "Temporary Reditect" },
|
|
{ Status::kPermanentRedirect, "Permanent Redirect" },
|
|
|
|
{ Status::kBadRequest, "Bad Request" },
|
|
{ Status::kUnauthorized, "Unauthorized" },
|
|
{ Status::kPaymentRequired, "Payment Required" },
|
|
{ Status::kForbidden, "Forbidden" },
|
|
{ Status::kNotFound, "Not Found" },
|
|
{ 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::kLengthRequired, "Length Required" },
|
|
{ Status::kPreconditionFailed, "Precondition Failed" },
|
|
{ Status::kContentTooLarge, "Content Too Large" },
|
|
{ Status::kURITooLong, "URI Too Long" },
|
|
{ Status::kUnsupportedMediaType, "Unsupported Media Type" },
|
|
{ Status::kRangeNotSatisfiable, "Range Not Satisfiable" },
|
|
{ Status::kExpectationFailed, "Expectation Failed" },
|
|
{ Status::kIamATeapot, "I'm a Teapot" },
|
|
{ Status::kMisdirectedRequest, "Misdirected Request" },
|
|
{ Status::kUnprocessableContent, "Unprocessable Content" },
|
|
{ Status::kLocked, "Locked" },
|
|
{ Status::kFailedDependency, "Failed Dependency" },
|
|
{ Status::kTooEarly, "TooEarly" },
|
|
{ Status::kUpgradeRequired, "Upgrade Required" },
|
|
{ Status::kPreconditionRequired, "Precondition Required" },
|
|
{ Status::kTooManyRequests, "Too ManyR equests" },
|
|
{ Status::kRequestHeaderFieldsTooLarge, "Request Header Fields Too Large" },
|
|
{ Status::kUnavailableForLegalReasons, "Unavailable For Legal Reasons" },
|
|
|
|
{ Status::kInternalServerError, "Internal Server Error" },
|
|
{ Status::kNotImplemented, "Not Implemented" },
|
|
{ Status::kBadGateway, "Bad Gateway" },
|
|
{ Status::kServiceUnavailable, "Service Unavailable" },
|
|
{ Status::kGatewayTimeout, "Gateway Timeout" },
|
|
{ Status::kHTTPVersionNotSupported, "HTTP Version Not Supported" },
|
|
{ Status::kVariantAlsoNegotiates, "Variant Also Negotiates" },
|
|
{ Status::kInsufficientStorage, "Insufficient Storage" },
|
|
{ Status::kLoopDetected, "Loop Detected" },
|
|
{ Status::kNotExtended, "Not Extended" },
|
|
{ Status::kNetworkAuthenticationRequired, "Network Authentication Required" },
|
|
|
|
// Not Standard Code By UnknownObject
|
|
|
|
{ Status::k_uRequestFormatError, "Request Format Error" },
|
|
{ Status::k_uRequestInvalid, "Request Invalid" },
|
|
{ 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_uSubProcessFalied, "SubProcess Falied" },
|
|
{ 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
|