#include http::code http::http_code(status status) { switch(status) { case accepted: return {status, "Accepted"}; case bad_gateway: return {status, "Bad gateway"}; case bad_request: return {status, "Bad Request"}; case created: return {status, "Created"}; case forbidden: return {status, "Forbidden"}; case gateway_timeout: return {status, "Gateway Timeout"}; case http_version_not_supported: return {status, "HTTP Version Not Supported"}; case internal_server_error: return {status, "Internal Server Error"}; case method_not_allowed: return {status, "Method Not Allowed"}; case not_acceptable: return {status, "Not Acceptable"}; case no_content: return {status, "No Content"}; case not_found: return {status, "Not Found"}; case not_implemented: return {status, "Not Implemented"}; case ok: return {status, "OK"}; case payment_required: return {status, "Payment Required"}; case service_unavailable: return {status, "Service Unavailable"}; case unauthorized: return {status, "Unauthorized"}; default: return {status, "UNKNOWN"}; } } std::ostream &http::response::do_response(std::ostream &os) const { os << "HTTP/1.1" << " " << status_code.first << " " << status_code.second << "\r\n"; for(auto &header : response_headers) os << header.first << ": " << header.second << "\r\n"; if(status_code.first != http::no_content) { os << "Content-Length: "; if(!body.empty()) { return os << body.size() << "\r\n\r\n" << body; } else { auto body_replace= std::to_string(status_code.first) + " " + status_code.second; return os << body_replace.size() << "\r\n\r\n" << body_replace; } } return os << "\r\n"; } void http::json_response::set_status(http::status code){ response::set_status(code); set_body({{"code",status_code.first},{"status",status_code.second}}); } void http::json_response::set_body(const nlohmann::json &json){ response::set_body(json.dump()); } http::json_response::json_response(){ add_header({"Content-Type","application/json"}); set_body({{"code",status_code.first},{"status",status_code.second}}); }