работающая авторизация
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user