You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.2 KiB

#include <http.hpp>
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}});
}