Fixes to the default_resource examples
This commit is contained in:
parent
dc466e7d1d
commit
c7284acd8f
3 changed files with 55 additions and 31 deletions
|
|
@ -19,6 +19,10 @@ using namespace boost::property_tree;
|
||||||
typedef SimpleWeb::Server<SimpleWeb::HTTP> HttpServer;
|
typedef SimpleWeb::Server<SimpleWeb::HTTP> HttpServer;
|
||||||
typedef SimpleWeb::Client<SimpleWeb::HTTP> HttpClient;
|
typedef SimpleWeb::Client<SimpleWeb::HTTP> HttpClient;
|
||||||
|
|
||||||
|
//Added for the default_resource example
|
||||||
|
void default_resource_send(const HttpServer &server, shared_ptr<HttpServer::Response> response,
|
||||||
|
shared_ptr<ifstream> ifs, shared_ptr<vector<char> > buffer);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
//HTTP-server at port 8080 using 1 thread
|
//HTTP-server at port 8080 using 1 thread
|
||||||
//Unless you do more heavy non-threaded processing in the resources,
|
//Unless you do more heavy non-threaded processing in the resources,
|
||||||
|
|
@ -104,29 +108,21 @@ int main() {
|
||||||
|
|
||||||
if(ifs) {
|
if(ifs) {
|
||||||
//read and send 128 KB at a time
|
//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 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);
|
ifs->seekg(0, ios::end);
|
||||||
auto length=ifs->tellg();
|
auto length=ifs->tellg();
|
||||||
|
|
||||||
ifs->seekg(0, ios::beg);
|
ifs->seekg(0, ios::beg);
|
||||||
|
|
||||||
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << length << "\r\n\r\n";
|
*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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -160,3 +156,19 @@ int main() {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void default_resource_send(const HttpServer &server, shared_ptr<HttpServer::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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ using namespace boost::property_tree;
|
||||||
typedef SimpleWeb::Server<SimpleWeb::HTTPS> HttpsServer;
|
typedef SimpleWeb::Server<SimpleWeb::HTTPS> HttpsServer;
|
||||||
typedef SimpleWeb::Client<SimpleWeb::HTTPS> HttpsClient;
|
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() {
|
int main() {
|
||||||
//HTTPS-server at port 8080 using 1 thread
|
//HTTPS-server at port 8080 using 1 thread
|
||||||
//Unless you do more heavy non-threaded processing in the resources,
|
//Unless you do more heavy non-threaded processing in the resources,
|
||||||
|
|
@ -104,29 +108,21 @@ int main() {
|
||||||
|
|
||||||
if(ifs) {
|
if(ifs) {
|
||||||
//read and send 128 KB at a time
|
//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 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);
|
ifs->seekg(0, ios::end);
|
||||||
auto length=ifs->tellg();
|
auto length=ifs->tellg();
|
||||||
|
|
||||||
ifs->seekg(0, ios::beg);
|
ifs->seekg(0, ios::beg);
|
||||||
|
|
||||||
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << length << "\r\n\r\n";
|
*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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -161,3 +157,19 @@ int main() {
|
||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -181,7 +181,7 @@ namespace SimpleWeb {
|
||||||
io_service.stop();
|
io_service.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(std::shared_ptr<Response> response, const std::function<void(const boost::system::error_code&)>& callback=nullptr) {
|
void send(std::shared_ptr<Response> response, const std::function<void(const boost::system::error_code&)>& callback=nullptr) const {
|
||||||
boost::asio::async_write(*response->socket, response->streambuf, [this, response, callback](const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
|
boost::asio::async_write(*response->socket, response->streambuf, [this, response, callback](const boost::system::error_code& ec, size_t /*bytes_transferred*/) {
|
||||||
if(callback)
|
if(callback)
|
||||||
callback(ec);
|
callback(ec);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue