Стандартизация req объекта
This commit is contained in:
parent
cb0befebba
commit
aca5c81168
@ -22,5 +22,6 @@ add_executable(application src/main.cpp
|
|||||||
src/Session.cpp
|
src/Session.cpp
|
||||||
src/Listener.h
|
src/Listener.h
|
||||||
src/Listener.cpp
|
src/Listener.cpp
|
||||||
|
src/RequestHandlers/BasicRequestHandler.cpp
|
||||||
src/RequestHandlers/BasicRequestHandler.h)
|
src/RequestHandlers/BasicRequestHandler.h)
|
||||||
target_link_libraries(application PRIVATE Threads::Threads)
|
target_link_libraries(application PRIVATE Threads::Threads)
|
96
src/RequestHandlers/BasicRequestHandler.cpp
Normal file
96
src/RequestHandlers/BasicRequestHandler.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include "BasicRequestHandler.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace uad
|
||||||
|
{
|
||||||
|
namespace beast = boost::beast;
|
||||||
|
namespace http = beast::http;
|
||||||
|
namespace net = boost::asio;
|
||||||
|
|
||||||
|
http::message_generator HandleRequest(
|
||||||
|
beast::string_view doc_root,
|
||||||
|
http::request<http::string_body>&& req)
|
||||||
|
{
|
||||||
|
auto const bad_request =
|
||||||
|
[&req](beast::string_view why)
|
||||||
|
{
|
||||||
|
http::response<http::string_body> res {http::status::bad_request, req.version()};
|
||||||
|
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||||
|
res.set(http::field::content_type, "text/html");
|
||||||
|
res.keep_alive(req.keep_alive());
|
||||||
|
res.body() = std::string(why);
|
||||||
|
res.prepare_payload();
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto const not_found =
|
||||||
|
[&req](beast::string_view target)
|
||||||
|
{
|
||||||
|
http::response<http::string_body> res {http::status::not_found, req.version()};
|
||||||
|
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||||
|
res.set(http::field::content_type, "text/html");
|
||||||
|
res.keep_alive(req.keep_alive());
|
||||||
|
res.body() = "The resource '" + std::string(target) + "' was not found.";
|
||||||
|
res.prepare_payload();
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto const server_error =
|
||||||
|
[&req](beast::string_view what)
|
||||||
|
{
|
||||||
|
http::response<http::string_body> res {http::status::internal_server_error, req.version()};
|
||||||
|
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||||
|
res.set(http::field::content_type, "text/html");
|
||||||
|
res.keep_alive(req.keep_alive());
|
||||||
|
res.body() = "An error occurred: '" + std::string(what) + "'";
|
||||||
|
res.prepare_payload();
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (req.method() != http::verb::get &&
|
||||||
|
req.method() != http::verb::head)
|
||||||
|
return bad_request("Unknown HTTP-method");
|
||||||
|
|
||||||
|
if (req.target().empty() ||
|
||||||
|
req.target()[0] != '/' ||
|
||||||
|
req.target().find("..") != beast::string_view::npos)
|
||||||
|
return bad_request("Illegal request-target");
|
||||||
|
|
||||||
|
std::string path = PathCat(doc_root, req.target());
|
||||||
|
if (req.target().back() == '/')
|
||||||
|
path.append("index.html");
|
||||||
|
|
||||||
|
beast::error_code ec;
|
||||||
|
http::file_body::value_type body;
|
||||||
|
body.open(path.c_str(), beast::file_mode::scan, ec);
|
||||||
|
|
||||||
|
if (ec == beast::errc::no_such_file_or_directory)
|
||||||
|
return not_found(req.target());
|
||||||
|
|
||||||
|
if (ec)
|
||||||
|
return server_error(ec.message());
|
||||||
|
|
||||||
|
auto const size = body.size();
|
||||||
|
|
||||||
|
if (req.method() == http::verb::head)
|
||||||
|
{
|
||||||
|
http::response<http::empty_body> res {http::status::ok, req.version()};
|
||||||
|
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||||
|
res.set(http::field::content_type, MimeType(path));
|
||||||
|
res.content_length(size);
|
||||||
|
res.keep_alive(req.keep_alive());
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
http::response<http::file_body> res {
|
||||||
|
std::piecewise_construct,
|
||||||
|
std::make_tuple(std::move(body)),
|
||||||
|
std::make_tuple(http::status::ok, req.version())};
|
||||||
|
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
||||||
|
res.set(http::field::content_type, MimeType(path));
|
||||||
|
res.content_length(size);
|
||||||
|
res.keep_alive(req.keep_alive());
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include "./../helpers.h"
|
#include "./../helpers.h"
|
||||||
|
|
||||||
@ -23,90 +24,7 @@ namespace beast = boost::beast;
|
|||||||
namespace http = beast::http;
|
namespace http = beast::http;
|
||||||
namespace net = boost::asio;
|
namespace net = boost::asio;
|
||||||
|
|
||||||
template<class Body, class Allocator>
|
|
||||||
http::message_generator HandleRequest(
|
http::message_generator HandleRequest(
|
||||||
beast::string_view doc_root,
|
beast::string_view doc_root,
|
||||||
http::request<Body, http::basic_fields<Allocator>>&& req)
|
http::request<http::string_body>&& req);
|
||||||
{
|
|
||||||
auto const bad_request =
|
|
||||||
[&req](beast::string_view why)
|
|
||||||
{
|
|
||||||
http::response<http::string_body> res {http::status::bad_request, req.version()};
|
|
||||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
|
||||||
res.set(http::field::content_type, "text/html");
|
|
||||||
res.keep_alive(req.keep_alive());
|
|
||||||
res.body() = std::string(why);
|
|
||||||
res.prepare_payload();
|
|
||||||
return res;
|
|
||||||
};
|
|
||||||
|
|
||||||
auto const not_found =
|
|
||||||
[&req](beast::string_view target)
|
|
||||||
{
|
|
||||||
http::response<http::string_body> res {http::status::not_found, req.version()};
|
|
||||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
|
||||||
res.set(http::field::content_type, "text/html");
|
|
||||||
res.keep_alive(req.keep_alive());
|
|
||||||
res.body() = "The resource '" + std::string(target) + "' was not found.";
|
|
||||||
res.prepare_payload();
|
|
||||||
return res;
|
|
||||||
};
|
|
||||||
|
|
||||||
auto const server_error =
|
|
||||||
[&req](beast::string_view what)
|
|
||||||
{
|
|
||||||
http::response<http::string_body> res {http::status::internal_server_error, req.version()};
|
|
||||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
|
||||||
res.set(http::field::content_type, "text/html");
|
|
||||||
res.keep_alive(req.keep_alive());
|
|
||||||
res.body() = "An error occurred: '" + std::string(what) + "'";
|
|
||||||
res.prepare_payload();
|
|
||||||
return res;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (req.method() != http::verb::get &&
|
|
||||||
req.method() != http::verb::head)
|
|
||||||
return bad_request("Unknown HTTP-method");
|
|
||||||
|
|
||||||
if (req.target().empty() ||
|
|
||||||
req.target()[0] != '/' ||
|
|
||||||
req.target().find("..") != beast::string_view::npos)
|
|
||||||
return bad_request("Illegal request-target");
|
|
||||||
|
|
||||||
std::string path = PathCat(doc_root, req.target());
|
|
||||||
if (req.target().back() == '/')
|
|
||||||
path.append("index.html");
|
|
||||||
|
|
||||||
beast::error_code ec;
|
|
||||||
http::file_body::value_type body;
|
|
||||||
body.open(path.c_str(), beast::file_mode::scan, ec);
|
|
||||||
|
|
||||||
if (ec == beast::errc::no_such_file_or_directory)
|
|
||||||
return not_found(req.target());
|
|
||||||
|
|
||||||
if (ec)
|
|
||||||
return server_error(ec.message());
|
|
||||||
|
|
||||||
auto const size = body.size();
|
|
||||||
|
|
||||||
if (req.method() == http::verb::head)
|
|
||||||
{
|
|
||||||
http::response<http::empty_body> res {http::status::ok, req.version()};
|
|
||||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
|
||||||
res.set(http::field::content_type, MimeType(path));
|
|
||||||
res.content_length(size);
|
|
||||||
res.keep_alive(req.keep_alive());
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
http::response<http::file_body> res {
|
|
||||||
std::piecewise_construct,
|
|
||||||
std::make_tuple(std::move(body)),
|
|
||||||
std::make_tuple(http::status::ok, req.version())};
|
|
||||||
res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
|
|
||||||
res.set(http::field::content_type, MimeType(path));
|
|
||||||
res.content_length(size);
|
|
||||||
res.keep_alive(req.keep_alive());
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user