diff --git a/http_examples.cpp b/http_examples.cpp index a8a1047..3e88570 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -89,7 +89,7 @@ int main() { // Responds with request-information server.resource["^/info$"]["GET"] = [](shared_ptr response, shared_ptr request) { stringstream stream; - stream << "

Request from " << request->remote_endpoint_address << ":" << request->remote_endpoint_port << "

"; + stream << "

Request from " << request->remote_endpoint_address() << ":" << request->remote_endpoint_port() << "

"; stream << request->method << " " << request->path << " HTTP/" << request->http_version; diff --git a/https_examples.cpp b/https_examples.cpp index 7d6e987..94747aa 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -87,7 +87,7 @@ int main() { // Responds with request-information server.resource["^/info$"]["GET"] = [](shared_ptr response, shared_ptr request) { stringstream stream; - stream << "

Request from " << request->remote_endpoint_address << ":" << request->remote_endpoint_port << "

"; + stream << "

Request from " << request->remote_endpoint_address() << ":" << request->remote_endpoint_port() << "

"; stream << request->method << " " << request->path << " HTTP/" << request->http_version; diff --git a/server_http.hpp b/server_http.hpp index 458260a..97ee7de 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -183,8 +183,10 @@ namespace SimpleWeb { friend class Session; asio::streambuf streambuf; - Request(std::size_t max_request_streambuf_size, const std::string &remote_endpoint_address = std::string(), unsigned short remote_endpoint_port = 0) noexcept - : streambuf(max_request_streambuf_size), content(streambuf), remote_endpoint_address(remote_endpoint_address), remote_endpoint_port(remote_endpoint_port) {} + std::shared_ptr remote_endpoint; + + Request(std::size_t max_request_streambuf_size, std::shared_ptr remote_endpoint) noexcept + : streambuf(max_request_streambuf_size), remote_endpoint(std::move(remote_endpoint)), content(streambuf) {} public: std::string method, path, query_string, http_version; @@ -195,8 +197,18 @@ namespace SimpleWeb { regex::smatch path_match; - std::string remote_endpoint_address; - unsigned short remote_endpoint_port; + std::string remote_endpoint_address() noexcept { + try { + return remote_endpoint->address().to_string(); + } + catch(...) { + return std::string(); + } + } + + unsigned short remote_endpoint_port() noexcept { + return remote_endpoint->port(); + } /// Returns query keys with percent-decoded values. CaseInsensitiveMultimap parse_query_string() noexcept { @@ -217,6 +229,8 @@ namespace SimpleWeb { std::unique_ptr timer; + std::shared_ptr remote_endpoint; + void close() noexcept { error_code ec; std::unique_lock lock(socket_close_mutex); // The following operations seems to be needed to run sequentially @@ -250,13 +264,11 @@ namespace SimpleWeb { class Session { public: Session(std::size_t max_request_streambuf_size, std::shared_ptr connection) noexcept : connection(std::move(connection)) { - try { - auto remote_endpoint = this->connection->socket->lowest_layer().remote_endpoint(); - request = std::shared_ptr(new Request(max_request_streambuf_size, remote_endpoint.address().to_string(), remote_endpoint.port())); - } - catch(...) { - request = std::shared_ptr(new Request(max_request_streambuf_size)); + if(!this->connection->remote_endpoint) { + error_code ec; + this->connection->remote_endpoint = std::make_shared(this->connection->socket->lowest_layer().remote_endpoint(ec)); } + request = std::shared_ptr(new Request(max_request_streambuf_size, this->connection->remote_endpoint)); } std::shared_ptr connection; @@ -579,10 +591,10 @@ namespace SimpleWeb { protected: void accept() override { - auto session = std::make_shared(config.max_request_streambuf_size, create_connection(*io_service)); + auto connection = create_connection(*io_service); - acceptor->async_accept(*session->connection->socket, [this, session](const error_code &ec) { - auto lock = session->connection->handler_runner->continue_lock(); + acceptor->async_accept(*connection->socket, [this, connection](const error_code &ec) { + auto lock = connection->handler_runner->continue_lock(); if(!lock) return; @@ -590,6 +602,8 @@ namespace SimpleWeb { if(ec != asio::error::operation_aborted) this->accept(); + auto session = std::make_shared(config.max_request_streambuf_size, connection); + if(!ec) { asio::ip::tcp::no_delay option(true); error_code ec; diff --git a/server_https.hpp b/server_https.hpp index 8b44df3..131c4f5 100644 --- a/server_https.hpp +++ b/server_https.hpp @@ -48,16 +48,18 @@ namespace SimpleWeb { asio::ssl::context context; void accept() override { - auto session = std::make_shared(config.max_request_streambuf_size, create_connection(*io_service, context)); + auto connection = create_connection(*io_service, context); - acceptor->async_accept(session->connection->socket->lowest_layer(), [this, session](const error_code &ec) { - auto lock = session->connection->handler_runner->continue_lock(); + acceptor->async_accept(connection->socket->lowest_layer(), [this, connection](const error_code &ec) { + auto lock = connection->handler_runner->continue_lock(); if(!lock) return; if(ec != asio::error::operation_aborted) this->accept(); + auto session = std::make_shared(config.max_request_streambuf_size, connection); + if(!ec) { asio::ip::tcp::no_delay option(true); error_code ec; diff --git a/tests/parse_test.cpp b/tests/parse_test.cpp index b456d31..ce91224 100644 --- a/tests/parse_test.cpp +++ b/tests/parse_test.cpp @@ -152,7 +152,7 @@ int main() { asio::io_service io_service; asio::ip::tcp::socket socket(io_service); - SimpleWeb::Server::Request request(static_cast(-1)); + SimpleWeb::Server::Request request(static_cast(-1), nullptr); { request.query_string = ""; auto queries = request.parse_query_string();