From c7284acd8fb305f8123053ba9a33d0fd7d85c29c Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 28 Jun 2016 22:52:12 +0200 Subject: [PATCH] Fixes to the default_resource examples --- http_examples.cpp | 42 +++++++++++++++++++++++++++--------------- https_examples.cpp | 42 +++++++++++++++++++++++++++--------------- server_http.hpp | 2 +- 3 files changed, 55 insertions(+), 31 deletions(-) diff --git a/http_examples.cpp b/http_examples.cpp index d82a10b..9ee6753 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -19,6 +19,10 @@ using namespace boost::property_tree; typedef SimpleWeb::Server HttpServer; typedef SimpleWeb::Client HttpClient; +//Added for the default_resource example +void default_resource_send(const HttpServer &server, shared_ptr response, + shared_ptr ifs, shared_ptr > buffer); + int main() { //HTTP-server at port 8080 using 1 thread //Unless you do more heavy non-threaded processing in the resources, @@ -104,29 +108,21 @@ int main() { if(ifs) { //read and send 128 KB at a time - size_t buffer_size=131072; + streamsize buffer_size=131072; auto buffer=make_shared>(buffer_size); - auto send_callback=make_shared >(nullptr); - *send_callback=[&server, response, ifs, buffer, buffer_size, send_callback](const boost::system::error_code &ec) { - if(!ec) { - streamsize read_length; - if((read_length=ifs->read(&(*buffer)[0], buffer_size).gcount())>0) { - response->write(&(*buffer)[0], read_length); - server.send(response, *send_callback); - } - } - else - cerr << "Connection interrupted" << endl; - }; - ifs->seekg(0, ios::end); auto length=ifs->tellg(); ifs->seekg(0, ios::beg); *response << "HTTP/1.1 200 OK\r\nContent-Length: " << length << "\r\n\r\n"; - server.send(response, *send_callback); + server.send(response, [&server, response, ifs, buffer](const boost::system::error_code &ec) { + if(!ec) + default_resource_send(server, response, ifs, buffer); + else + cerr << "Connection interrupted" << endl; + }); return; } } @@ -160,3 +156,19 @@ int main() { return 0; } + +void default_resource_send(const HttpServer &server, shared_ptr response, + shared_ptr ifs, shared_ptr > buffer) { + 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, buffer](const boost::system::error_code &ec) { + if(!ec) + default_resource_send(server, response, ifs, buffer); + else + cerr << "Connection interrupted" << endl; + }); + } + } +} diff --git a/https_examples.cpp b/https_examples.cpp index d4d4588..7097083 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -19,6 +19,10 @@ using namespace boost::property_tree; typedef SimpleWeb::Server HttpsServer; typedef SimpleWeb::Client HttpsClient; +//Added for the default_resource example +void default_resource_send(const HttpsServer &server, shared_ptr response, + shared_ptr ifs, shared_ptr > buffer); + int main() { //HTTPS-server at port 8080 using 1 thread //Unless you do more heavy non-threaded processing in the resources, @@ -104,29 +108,21 @@ int main() { if(ifs) { //read and send 128 KB at a time - size_t buffer_size=131072; + streamsize buffer_size=131072; auto buffer=make_shared>(buffer_size); - auto send_callback=make_shared >(nullptr); - *send_callback=[&server, response, ifs, buffer, buffer_size, send_callback](const boost::system::error_code &ec) { - if(!ec) { - streamsize read_length; - if((read_length=ifs->read(&(*buffer)[0], buffer_size).gcount())>0) { - response->write(&(*buffer)[0], read_length); - server.send(response, *send_callback); - } - } - else - cerr << "Connection interrupted" << endl; - }; - ifs->seekg(0, ios::end); auto length=ifs->tellg(); ifs->seekg(0, ios::beg); *response << "HTTP/1.1 200 OK\r\nContent-Length: " << length << "\r\n\r\n"; - server.send(response, *send_callback); + server.send(response, [&server, response, ifs, buffer](const boost::system::error_code &ec) { + if(!ec) + default_resource_send(server, response, ifs, buffer); + else + cerr << "Connection interrupted" << endl; + }); return; } } @@ -161,3 +157,19 @@ int main() { return 0; } + +void default_resource_send(const HttpsServer &server, shared_ptr response, + shared_ptr ifs, shared_ptr > buffer) { + 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, buffer](const boost::system::error_code &ec) { + if(!ec) + default_resource_send(server, response, ifs, buffer); + else + cerr << "Connection interrupted" << endl; + }); + } + } +} diff --git a/server_http.hpp b/server_http.hpp index 7ea09db..18dc0ee 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -181,7 +181,7 @@ namespace SimpleWeb { io_service.stop(); } - void send(std::shared_ptr response, const std::function& callback=nullptr) { + void send(std::shared_ptr response, const std::function& callback=nullptr) const { boost::asio::async_write(*response->socket, response->streambuf, [this, response, callback](const boost::system::error_code& ec, size_t /*bytes_transferred*/) { if(callback) callback(ec);