From cc1a8fc6146c574ed28bbecd0f900c3b6e1ddd52 Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 4 Jul 2017 09:38:01 +0200 Subject: [PATCH] The function Server::send was moved to Server::Response::send --- http_examples.cpp | 14 ++++++-------- https_examples.cpp | 14 ++++++-------- server_http.hpp | 27 +++++++++++++++------------ 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/http_examples.cpp b/http_examples.cpp index 5fa5ea7..4e3953d 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -23,8 +23,7 @@ typedef SimpleWeb::Server HttpServer; typedef SimpleWeb::Client HttpClient; //Added for the default_resource example -void default_resource_send(const shared_ptr &server, - const shared_ptr &response, const shared_ptr &ifs); +void default_resource_send(const shared_ptr &response, const shared_ptr &ifs); int main() { //HTTP-server at port 8080 using 1 thread @@ -139,7 +138,7 @@ int main() { //Will respond with content in the web/-directory, and its subdirectories. //Default file: index.html //Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server - server->default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { + server->default_resource["GET"] = [](shared_ptr &response, shared_ptr &request) { try { auto web_root_path = boost::filesystem::canonical("web"); auto path = boost::filesystem::canonical(web_root_path / request->path); @@ -184,7 +183,7 @@ int main() { header.emplace("Content-Length", to_string(length)); response->write(header); - default_resource_send(server, response, ifs); + default_resource_send(response, ifs); } else throw invalid_argument("could not read file"); @@ -228,17 +227,16 @@ int main() { server_thread.join(); } -void default_resource_send(const shared_ptr &server, - const shared_ptr &response, const shared_ptr &ifs) { +void default_resource_send(const shared_ptr &response, const shared_ptr &ifs) { //read and send 128 KB at a time static vector buffer(131072); // Safe when server is running on one thread streamsize read_length; if((read_length = ifs->read(&buffer[0], buffer.size()).gcount()) > 0) { response->write(&buffer[0], read_length); if(read_length == static_cast(buffer.size())) { - server->send(response, [server, response, ifs](const SimpleWeb::error_code &ec) { + response->send([response, ifs](const SimpleWeb::error_code &ec) { if(!ec) - default_resource_send(server, response, ifs); + default_resource_send(response, ifs); else cerr << "Connection interrupted" << endl; }); diff --git a/https_examples.cpp b/https_examples.cpp index ddec9ac..d8355ac 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -21,8 +21,7 @@ typedef SimpleWeb::Server HttpsServer; typedef SimpleWeb::Client HttpsClient; //Added for the default_resource example -void default_resource_send(const shared_ptr &server, - const shared_ptr &response, const shared_ptr &ifs); +void default_resource_send(const shared_ptr &response, const shared_ptr &ifs); int main() { //HTTPS-server at port 8080 using 1 thread @@ -137,7 +136,7 @@ int main() { //Will respond with content in the web/-directory, and its subdirectories. //Default file: index.html //Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server - server->default_resource["GET"] = [&server](shared_ptr &response, shared_ptr &request) { + server->default_resource["GET"] = [](shared_ptr &response, shared_ptr &request) { try { auto web_root_path = boost::filesystem::canonical("web"); auto path = boost::filesystem::canonical(web_root_path / request->path); @@ -182,7 +181,7 @@ int main() { header.emplace("Content-Length", to_string(length)); response->write(header); - default_resource_send(server, response, ifs); + default_resource_send(response, ifs); } else throw invalid_argument("could not read file"); @@ -227,17 +226,16 @@ int main() { server_thread.join(); } -void default_resource_send(const shared_ptr &server, - const shared_ptr &response, const shared_ptr &ifs) { +void default_resource_send(const shared_ptr &response, const shared_ptr &ifs) { //read and send 128 KB at a time static vector buffer(131072); // Safe when server is running on one thread streamsize read_length; if((read_length = ifs->read(&buffer[0], buffer.size()).gcount()) > 0) { response->write(&buffer[0], read_length); if(read_length == static_cast(buffer.size())) { - server->send(response, [server, response, ifs](const SimpleWeb::error_code &ec) { + response->send([response, ifs](const SimpleWeb::error_code &ec) { if(!ec) - default_resource_send(server, response, ifs); + default_resource_send(response, ifs); else cerr << "Connection interrupted" << endl; }); diff --git a/server_http.hpp b/server_http.hpp index 55fdc62..f208643 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -53,15 +53,17 @@ namespace SimpleWeb { public: virtual ~ServerBase() {} - class Response : public std::ostream { + class Response : public std::enable_shared_from_this, public std::ostream { friend class ServerBase; friend class Server; asio::streambuf streambuf; + std::shared_ptr io_service; std::shared_ptr socket; - Response(const std::shared_ptr &socket) : std::ostream(&streambuf), socket(socket) {} + Response(const std::shared_ptr &io_service, const std::shared_ptr &socket) + : std::ostream(&streambuf), io_service(io_service), socket(socket) {} template void write_header(const CaseInsensitiveMultimap &header, size_type size) { @@ -86,6 +88,15 @@ namespace SimpleWeb { return streambuf.size(); } + /// Use this function if you need to recursively send parts of a longer message + void send(const std::function &callback = nullptr) { + auto self = this->shared_from_this(); + asio::async_write(*socket, streambuf, [self, callback](const error_code &ec, size_t /*bytes_transferred*/) { + if(callback) + callback(ec); + }); + } + /// Write directly to stream buffer using std::ostream::write void write(const char_type *ptr, std::streamsize n) { std::ostream::write(ptr, n); @@ -324,14 +335,6 @@ namespace SimpleWeb { io_service->stop(); } - ///Use this function if you need to recursively send parts of a longer message - void send(const std::shared_ptr &response, const std::function &callback = nullptr) const { - asio::async_write(*response->socket, response->streambuf, [response, callback](const error_code &ec, size_t /*bytes_transferred*/) { - if(callback) - callback(ec); - }); - } - /// If you have your own asio::io_service, store its pointer here before running start(). std::shared_ptr io_service; @@ -480,9 +483,9 @@ namespace SimpleWeb { auto request = session->request; session->set_timeout(config.timeout_content); auto timer = session->timer; - auto response = std::shared_ptr(new Response(session->socket), [self, request, timer](Response *response_ptr) mutable { + auto response = std::shared_ptr(new Response(io_service, session->socket), [self, request, timer](Response *response_ptr) mutable { auto response = std::shared_ptr(response_ptr); - self->send(response, [self, response, request, timer](const error_code &ec) mutable { + response->send([self, response, request, timer](const error_code &ec) mutable { if(timer) timer->cancel(); if(!ec) {