Now closes file if connection is interrupted in default_resource example. Also some minor cleanup.

This commit is contained in:
eidheim 2015-09-02 21:02:06 +02:00
commit fa1efed7f0
4 changed files with 31 additions and 21 deletions

View file

@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 2.8) cmake_minimum_required (VERSION 2.8)
project (Simple-Web-Server) 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_ID}" STREQUAL "GNU")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)

View file

@ -109,9 +109,14 @@ int main() {
if(length>buffer_size) { if(length>buffer_size) {
vector<char> buffer(buffer_size); vector<char> buffer(buffer_size);
size_t read_length; size_t read_length;
while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { try {
response.stream.write(&buffer[0], read_length); while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) {
response << HttpServer::flush; response.stream.write(&buffer[0], read_length);
response << HttpServer::flush;
}
}
catch(const exception &e) {
cerr << "Connection interrupted, closing file" << endl;
} }
} }
else else

View file

@ -109,9 +109,14 @@ int main() {
if(length>buffer_size) { if(length>buffer_size) {
vector<char> buffer(buffer_size); vector<char> buffer(buffer_size);
size_t read_length; size_t read_length;
while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) { try {
response.stream.write(&buffer[0], read_length); while((read_length=ifs.read(&buffer[0], buffer_size).gcount())>0) {
response << HttpsServer::flush; response.stream.write(&buffer[0], read_length);
response << HttpsServer::flush;
}
}
catch(const exception &e) {
cerr << "Connection interrupted, closing file" << endl;
} }
} }
else else

View file

@ -88,9 +88,7 @@ namespace SimpleWeb {
remote_endpoint_address=socket.lowest_layer().remote_endpoint().address().to_string(); remote_endpoint_address=socket.lowest_layer().remote_endpoint().address().to_string();
remote_endpoint_port=socket.lowest_layer().remote_endpoint().port(); remote_endpoint_port=socket.lowest_layer().remote_endpoint().port();
} }
catch(const std::exception& e) { catch(const std::exception& e) {}
std::cerr << e.what() << std::endl;
}
} }
}; };
@ -222,20 +220,22 @@ namespace SimpleWeb {
std::shared_ptr<boost::asio::deadline_timer> timer; std::shared_ptr<boost::asio::deadline_timer> timer;
if(timeout_content>0) if(timeout_content>0)
timer=set_timeout_on_socket(socket, timeout_content); timer=set_timeout_on_socket(socket, timeout_content);
unsigned long long content_length;
try { try {
boost::asio::async_read(*socket, request->streambuf, content_length=stoull(it->second);
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);
});
} }
catch(const std::exception& e) { catch(const std::exception &e) {
std::cerr << e.what() << std::endl; 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 { else {
find_resource(socket, request); find_resource(socket, request);