From fa1efed7f01c69fe2ff3d10f6917561b0d5c7cc8 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 2 Sep 2015 21:02:06 +0200 Subject: [PATCH] Now closes file if connection is interrupted in default_resource example. Also some minor cleanup. --- CMakeLists.txt | 2 +- http_examples.cpp | 11 ++++++++--- https_examples.cpp | 11 ++++++++--- server_http.hpp | 28 ++++++++++++++-------------- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b54ca8..9545282 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required (VERSION 2.8) project (Simple-Web-Server) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -Wall") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) diff --git a/http_examples.cpp b/http_examples.cpp index de92d40..1e0fa3d 100644 --- a/http_examples.cpp +++ b/http_examples.cpp @@ -109,9 +109,14 @@ int main() { if(length>buffer_size) { vector buffer(buffer_size); size_t read_length; - while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { - response.stream.write(&buffer[0], read_length); - response << HttpServer::flush; + try { + while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { + response.stream.write(&buffer[0], read_length); + response << HttpServer::flush; + } + } + catch(const exception &e) { + cerr << "Connection interrupted, closing file" << endl; } } else diff --git a/https_examples.cpp b/https_examples.cpp index bc3082a..6ce5dd0 100644 --- a/https_examples.cpp +++ b/https_examples.cpp @@ -109,9 +109,14 @@ int main() { if(length>buffer_size) { vector buffer(buffer_size); size_t read_length; - while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { - response.stream.write(&buffer[0], read_length); - response << HttpsServer::flush; + try { + while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { + response.stream.write(&buffer[0], read_length); + response << HttpsServer::flush; + } + } + catch(const exception &e) { + cerr << "Connection interrupted, closing file" << endl; } } else diff --git a/server_http.hpp b/server_http.hpp index f305ee9..cb9a3bb 100644 --- a/server_http.hpp +++ b/server_http.hpp @@ -88,9 +88,7 @@ namespace SimpleWeb { remote_endpoint_address=socket.lowest_layer().remote_endpoint().address().to_string(); remote_endpoint_port=socket.lowest_layer().remote_endpoint().port(); } - catch(const std::exception& e) { - std::cerr << e.what() << std::endl; - } + catch(const std::exception& e) {} } }; @@ -222,20 +220,22 @@ namespace SimpleWeb { std::shared_ptr timer; if(timeout_content>0) timer=set_timeout_on_socket(socket, timeout_content); + unsigned long long content_length; try { - boost::asio::async_read(*socket, request->streambuf, - boost::asio::transfer_exactly(stoull(it->second)-num_additional_bytes), - [this, socket, request, timer] - (const boost::system::error_code& ec, size_t /*bytes_transferred*/) { - if(timeout_content>0) - timer->cancel(); - if(!ec) - find_resource(socket, request); - }); + content_length=stoull(it->second); } - catch(const std::exception& e) { - std::cerr << e.what() << std::endl; + catch(const std::exception &e) { + return; } + boost::asio::async_read(*socket, request->streambuf, + boost::asio::transfer_exactly(content_length-num_additional_bytes), + [this, socket, request, timer] + (const boost::system::error_code& ec, size_t /*bytes_transferred*/) { + if(timeout_content>0) + timer->cancel(); + if(!ec) + find_resource(socket, request); + }); } else { find_resource(socket, request);