memgraph/speedy/http/response.inl

63 lines
1.5 KiB
C++

#ifndef MEMGRAPH_SERVER_HTTP_RESPONSE_INL
#define MEMGRAPH_SERVER_HTTP_RESPONSE_INL
#include "response.hpp"
#include "httpconnection.hpp"
namespace http
{
Response::Response(HttpConnection& connection)
: connection(connection), buffer(65536), code(Status::Ok) {}
void Response::send(Status code, const std::string& body)
{
this->status(code).send(body);
}
void Response::send(const std::string& body)
{
uv_write_t* write_req =
static_cast<uv_write_t*>(malloc(sizeof(uv_write_t)));
write_req->data = &connection;
// set the appropriate content length
headers["Content-Length"] = std::to_string(body.size());
// set the appropriate connection type
headers["Connection"] = connection.keep_alive ? "Keep-Alive" : "Close";
buffer << "HTTP/1.1 " << to_string[code] << "\r\n";
for(auto it = headers.begin(); it != headers.end(); ++it)
buffer << it->first << ":" << it->second << "\r\n";
buffer << "\r\n" << body;
uv_write(write_req, connection.client, buffer, 1,
[](uv_write_t* write_req, int) {
HttpConnection& conn =
*reinterpret_cast<HttpConnection*>(write_req->data);
if(!conn.keep_alive)
conn.close();
conn.response.code = Status::Ok;
conn.response.buffer.clear();
conn.response.headers.clear();
std::free(write_req);
});
}
Response& Response::status(Status code)
{
this->code = code;
return *this;
}
}
#endif