feat: Add dosguard to new webserver (#1772)

For #919.
This commit is contained in:
Sergey Kuznetsov
2024-12-10 14:59:12 +00:00
committed by GitHub
parent 4ff2953257
commit 7bef13f913
23 changed files with 1325 additions and 148 deletions

View File

@@ -17,10 +17,14 @@
*/
//==============================================================================
#include "util/Taggable.hpp"
#include "util/build/Build.hpp"
#include "util/config/Config.hpp"
#include "web/ng/MockConnection.hpp"
#include "web/ng/Request.hpp"
#include "web/ng/Response.hpp"
#include <boost/beast/core/flat_buffer.hpp>
#include <boost/beast/http/field.hpp>
#include <boost/beast/http/message.hpp>
#include <boost/beast/http/status.hpp>
@@ -29,6 +33,7 @@
#include <boost/json/object.hpp>
#include <boost/json/serialize.hpp>
#include <fmt/core.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <string>
@@ -41,21 +46,23 @@ struct ResponseDeathTest : testing::Test {};
TEST_F(ResponseDeathTest, intoHttpResponseWithoutHttpData)
{
Request const request{"some messsage", Request::HttpHeaders{}};
web::ng::Response response{boost::beast::http::status::ok, "message", request};
Request::HttpHeaders const headers{};
Request const request{"some message", headers};
Response response{boost::beast::http::status::ok, "message", request};
EXPECT_DEATH(std::move(response).intoHttpResponse(), "");
}
TEST_F(ResponseDeathTest, asConstBufferWithHttpData)
{
Request const request{http::request<http::string_body>{http::verb::get, "/", 11}};
web::ng::Response const response{boost::beast::http::status::ok, "message", request};
Response const response{boost::beast::http::status::ok, "message", request};
EXPECT_DEATH(response.asWsResponse(), "");
}
struct ResponseTest : testing::Test {
int const httpVersion_ = 11;
http::status const responseStatus_ = http::status::ok;
Request::HttpHeaders const headers_;
};
TEST_F(ResponseTest, intoHttpResponse)
@@ -63,7 +70,7 @@ TEST_F(ResponseTest, intoHttpResponse)
Request const request{http::request<http::string_body>{http::verb::post, "/", httpVersion_, "some message"}};
std::string const responseMessage = "response message";
web::ng::Response response{responseStatus_, responseMessage, request};
Response response{responseStatus_, responseMessage, request};
auto const httpResponse = std::move(response).intoHttpResponse();
EXPECT_EQ(httpResponse.result(), responseStatus_);
@@ -83,7 +90,7 @@ TEST_F(ResponseTest, intoHttpResponseJson)
Request const request{http::request<http::string_body>{http::verb::post, "/", httpVersion_, "some message"}};
boost::json::object const responseMessage{{"key", "value"}};
web::ng::Response response{responseStatus_, responseMessage, request};
Response response{responseStatus_, responseMessage, request};
auto const httpResponse = std::move(response).intoHttpResponse();
EXPECT_EQ(httpResponse.result(), responseStatus_);
@@ -100,9 +107,9 @@ TEST_F(ResponseTest, intoHttpResponseJson)
TEST_F(ResponseTest, asConstBuffer)
{
Request const request("some request", Request::HttpHeaders{});
Request const request("some request", headers_);
std::string const responseMessage = "response message";
web::ng::Response const response{responseStatus_, responseMessage, request};
Response const response{responseStatus_, responseMessage, request};
auto const buffer = response.asWsResponse();
EXPECT_EQ(buffer.size(), responseMessage.size());
@@ -113,9 +120,9 @@ TEST_F(ResponseTest, asConstBuffer)
TEST_F(ResponseTest, asConstBufferJson)
{
Request const request("some request", Request::HttpHeaders{});
Request const request("some request", headers_);
boost::json::object const responseMessage{{"key", "value"}};
web::ng::Response const response{responseStatus_, responseMessage, request};
Response const response{responseStatus_, responseMessage, request};
auto const buffer = response.asWsResponse();
EXPECT_EQ(buffer.size(), boost::json::serialize(responseMessage).size());
@@ -123,3 +130,88 @@ TEST_F(ResponseTest, asConstBufferJson)
std::string const messageFromBuffer{static_cast<char const*>(buffer.data()), buffer.size()};
EXPECT_EQ(messageFromBuffer, boost::json::serialize(responseMessage));
}
TEST_F(ResponseTest, createFromStringAndConnection)
{
util::TagDecoratorFactory tagDecoratorFactory{util::Config{}};
StrictMockConnection connection{"some ip", boost::beast::flat_buffer{}, tagDecoratorFactory};
std::string const responseMessage = "response message";
EXPECT_CALL(connection, wasUpgraded()).WillOnce(testing::Return(false));
Response response{responseStatus_, responseMessage, connection};
EXPECT_EQ(response.message(), responseMessage);
auto const httpResponse = std::move(response).intoHttpResponse();
EXPECT_EQ(httpResponse.result(), responseStatus_);
auto const it = httpResponse.find(http::field::content_type);
ASSERT_NE(it, httpResponse.end());
EXPECT_EQ(it->value(), "text/html");
}
TEST_F(ResponseTest, createFromJsonAndConnection)
{
util::TagDecoratorFactory tagDecoratorFactory{util::Config{}};
StrictMockConnection connection{"some ip", boost::beast::flat_buffer{}, tagDecoratorFactory};
boost::json::object const responseMessage{{"key", "value"}};
EXPECT_CALL(connection, wasUpgraded()).WillOnce(testing::Return(false));
Response response{responseStatus_, responseMessage, connection};
EXPECT_EQ(response.message(), boost::json::serialize(responseMessage));
auto const httpResponse = std::move(response).intoHttpResponse();
EXPECT_EQ(httpResponse.result(), responseStatus_);
auto const it = httpResponse.find(http::field::content_type);
ASSERT_NE(it, httpResponse.end());
EXPECT_EQ(it->value(), "application/json");
}
TEST_F(ResponseTest, setMessageString_HttpResponse)
{
Request const request{http::request<http::string_body>{http::verb::post, "/", httpVersion_, "some request"}};
Response response{boost::beast::http::status::ok, "message", request};
std::string const newMessage = "new message";
response.setMessage(newMessage);
EXPECT_EQ(response.message(), newMessage);
auto const httpResponse = std::move(response).intoHttpResponse();
auto it = httpResponse.find(http::field::content_type);
ASSERT_NE(it, httpResponse.end());
EXPECT_EQ(it->value(), "text/html");
}
TEST_F(ResponseTest, setMessageString_WsResponse)
{
Request const request{"some request", headers_};
Response response{boost::beast::http::status::ok, "message", request};
std::string const newMessage = "new message";
response.setMessage(newMessage);
EXPECT_EQ(response.message(), newMessage);
}
TEST_F(ResponseTest, setMessageJson_HttpResponse)
{
Request const request{http::request<http::string_body>{http::verb::post, "/", httpVersion_, "some request"}};
Response response{boost::beast::http::status::ok, "message", request};
boost::json::object const newMessage{{"key", "value"}};
response.setMessage(newMessage);
auto const httpResponse = std::move(response).intoHttpResponse();
auto it = httpResponse.find(http::field::content_type);
ASSERT_NE(it, httpResponse.end());
EXPECT_EQ(it->value(), "application/json");
}
TEST_F(ResponseTest, setMessageJson_WsResponse)
{
Request const request{"some request", headers_};
Response response{boost::beast::http::status::ok, "message", request};
boost::json::object const newMessage{{"key", "value"}};
response.setMessage(newMessage);
EXPECT_EQ(response.message(), boost::json::serialize(newMessage));
}