#include "Http.h" #include "Common.h" #include #include // TODO: Add sentry error handling back std::string Http::GET(const std::string& host, int port, const std::string& target, unsigned int* status) { httplib::SSLClient client(host, port); client.enable_server_certificate_verification(false); client.set_address_family(AF_INET); auto res = client.Get(target.c_str()); if (res) { if (status) { *status = res->status; } return res->body; } else { return Http::ErrorString; } } std::string Http::POST(const std::string& host, int port, const std::string& target, const std::string& body, const std::string& ContentType, unsigned int* status) { httplib::SSLClient client(host, port); client.enable_server_certificate_verification(false); client.set_address_family(AF_INET); auto res = client.Post(target.c_str(), body.c_str(), body.size(), ContentType.c_str()); if (res) { if (status) { *status = res->status; } return res->body; } else { return Http::ErrorString; } } // RFC 2616, RFC 7231 static std::map Map = { { -1, "Invalid Response Code" }, { 100, "Continue" }, { 101, "Switching Protocols" }, { 102, "Processing" }, { 103, "Early Hints" }, { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, { 203, "Non-Authoritative Information" }, { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, { 207, "Multi-Status" }, { 208, "Already Reported" }, { 226, "IM Used" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, { 302, "Found" }, { 303, "See Other" }, { 304, "Not Modified" }, { 305, "Use Proxy" }, { 306, "(Unused)" }, { 307, "Temporary Redirect" }, { 308, "Permanent Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, { 402, "Payment Required" }, { 403, "Forbidden" }, { 404, "Not Found" }, { 405, "Method Not Allowed" }, { 406, "Not Acceptable" }, { 407, "Proxy Authentication Required" }, { 408, "Request Timeout" }, { 409, "Conflict" }, { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, { 413, "Payload Too Large" }, { 414, "URI Too Long" }, { 415, "Unsupported Media Type" }, { 416, "Range Not Satisfiable" }, { 417, "Expectation Failed" }, { 421, "Misdirected Request" }, { 422, "Unprocessable Entity" }, { 423, "Locked" }, { 424, "Failed Dependency" }, { 425, "Too Early" }, { 426, "Upgrade Required" }, { 428, "Precondition Required" }, { 429, "Too Many Requests" }, { 431, "Request Header Fields Too Large" }, { 451, "Unavailable For Legal Reasons" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, { 503, "Service Unavailable" }, { 504, "Gateway Timeout" }, { 505, "HTTP Version Not Supported" }, { 506, "Variant Also Negotiates" }, { 507, "Insufficient Storage" }, { 508, "Loop Detected" }, { 510, "Not Extended" }, { 511, "Network Authentication Required" }, // cloudflare status codes { 520, "(CDN) Web Server Returns An Unknown Error" }, { 521, "(CDN) Web Server Is Down" }, { 522, "(CDN) Connection Timed Out" }, { 523, "(CDN) Origin Is Unreachable" }, { 524, "(CDN) A Timeout Occurred" }, { 525, "(CDN) SSL Handshake Failed" }, { 526, "(CDN) Invalid SSL Certificate" }, { 527, "(CDN) Railgun Listener To Origin Error" }, { 530, "(CDN) 1XXX Internal Error" }, }; std::string Http::Status::ToString(int code) { if (Map.find(code) != Map.end()) { return Map.at(code); } else { return std::to_string(code); } }