Fixes to the default_resource examples

This commit is contained in:
eidheim 2016-06-28 22:52:12 +02:00
commit c7284acd8f
3 changed files with 55 additions and 31 deletions

View file

@ -19,6 +19,10 @@ using namespace boost::property_tree;
typedef SimpleWeb::Server<SimpleWeb::HTTPS> HttpsServer;
typedef SimpleWeb::Client<SimpleWeb::HTTPS> HttpsClient;
//Added for the default_resource example
void default_resource_send(const HttpsServer &server, shared_ptr<HttpsServer::Response> response,
shared_ptr<ifstream> ifs, shared_ptr<vector<char> > 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<vector<char>>(buffer_size);
auto send_callback=make_shared<std::function<void(const boost::system::error_code&)> >(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<HttpsServer::Response> response,
shared_ptr<ifstream> ifs, shared_ptr<vector<char> > 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<streamsize>(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;
});
}
}
}