работающая авторизация

This commit is contained in:
2024-11-05 10:33:52 +03:00
parent b561dedb2b
commit 0eacd76810
10 changed files with 150 additions and 61 deletions

View File

@@ -24,12 +24,7 @@ namespace http::server {
void Connection::doRead() {
request_parser_.reset();
request_.headers.clear();
request_.method.clear();
request_.queryUri.clear();
if (request_.url != nullptr) {
request_.url.reset(nullptr);
}
request_.reset();
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(buffer_), [this, self](boost::system::error_code ec, std::size_t bytes_transferred) {
@@ -98,9 +93,7 @@ namespace http::server {
get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
request_parser_.reset();
request_.headers.clear();
request_.method.clear();
request_.queryUri.clear();
request_.reset();
auto self(shared_from_this());
stream_.async_read_some(boost::asio::buffer(buffer_), [this, self](boost::system::error_code ec, std::size_t bytes_transferred) {

View File

@@ -221,7 +221,6 @@ namespace http::server {
void httpRedirect(Reply &rep, const std::string &location) {
rep.status = see_other_redirect;
rep.content.clear();
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::text_html)});
rep.headers.push_back({.name = "Location", .value = location});
}
} // namespace http::server

View File

@@ -19,14 +19,23 @@ namespace http::server {
};
/// A request received from a client.
struct Request {
class Request {
public:
Request();
void reset();
std::string getHeaderValue(const std::string& headerName) const;
std::string method;
std::string queryUri;
std::unique_ptr<Url> url;
bool is_keep_alive;
int http_version_major;
int http_version_minor;
bool is_keep_alive{};
int http_version_major{};
int http_version_minor{};
std::vector<header> headers;
std::vector<char> payload;
~Request();
};
} // namespace http::Server

View File

@@ -32,6 +32,32 @@ namespace http::server {
Url::~Url() = default;
Request::Request() = default;
void Request::reset() {
method = "";
queryUri = "";
if (url != nullptr) {
url.reset(nullptr);
}
is_keep_alive = false;
http_version_major = 0;
http_version_minor = 0;
headers.clear();
payload.clear();
}
std::string Request::getHeaderValue(const std::string &headerName) const {
for (const auto& header: headers) {
if (boost::iequals(header.name, headerName)) {
return header.value;
}
}
return "";
}
Request::~Request() = default;
RequestParser::RequestParser()
: state_(method_start) {
@@ -39,6 +65,7 @@ namespace http::server {
void RequestParser::reset() {
state_ = method_start;
contentLenghtHeader = 0;
}
RequestParser::result_type RequestParser::consume(Request &req, char input) {
@@ -216,9 +243,22 @@ namespace http::server {
case expecting_newline_3:
if (input == '\n') {
req.url = std::make_unique<Url>(req.queryUri);
return good;
auto content_len = req.getHeaderValue("content-length");
if (content_len.empty()) {
return good;
}
contentLenghtHeader = std::stol(content_len);
state_ = expecting_payload;
return indeterminate;
}
return bad;
case expecting_payload:
req.payload.push_back(input);
if (req.payload.size() <= contentLenghtHeader - 1) {
return indeterminate;
}
return good;
default:
return bad;
}

View File

@@ -73,8 +73,11 @@ namespace http::server {
space_before_header_value,
header_value,
expecting_newline_2,
expecting_newline_3
expecting_newline_3,
expecting_payload
} state_;
size_t contentLenghtHeader = 0;
};
} // namespace http::Server