The function Server::send was moved to Server::Response::send
This commit is contained in:
parent
a69e32290f
commit
cc1a8fc614
3 changed files with 27 additions and 28 deletions
|
|
@ -23,8 +23,7 @@ typedef SimpleWeb::Server<SimpleWeb::HTTP> HttpServer;
|
|||
typedef SimpleWeb::Client<SimpleWeb::HTTP> HttpClient;
|
||||
|
||||
//Added for the default_resource example
|
||||
void default_resource_send(const shared_ptr<HttpServer> &server,
|
||||
const shared_ptr<HttpServer::Response> &response, const shared_ptr<ifstream> &ifs);
|
||||
void default_resource_send(const shared_ptr<HttpServer::Response> &response, const shared_ptr<ifstream> &ifs);
|
||||
|
||||
int main() {
|
||||
//HTTP-server at port 8080 using 1 thread
|
||||
|
|
@ -139,7 +138,7 @@ int main() {
|
|||
//Will respond with content in the web/-directory, and its subdirectories.
|
||||
//Default file: index.html
|
||||
//Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server
|
||||
server->default_resource["GET"] = [&server](shared_ptr<HttpServer::Response> &response, shared_ptr<HttpServer::Request> &request) {
|
||||
server->default_resource["GET"] = [](shared_ptr<HttpServer::Response> &response, shared_ptr<HttpServer::Request> &request) {
|
||||
try {
|
||||
auto web_root_path = boost::filesystem::canonical("web");
|
||||
auto path = boost::filesystem::canonical(web_root_path / request->path);
|
||||
|
|
@ -184,7 +183,7 @@ int main() {
|
|||
|
||||
header.emplace("Content-Length", to_string(length));
|
||||
response->write(header);
|
||||
default_resource_send(server, response, ifs);
|
||||
default_resource_send(response, ifs);
|
||||
}
|
||||
else
|
||||
throw invalid_argument("could not read file");
|
||||
|
|
@ -228,17 +227,16 @@ int main() {
|
|||
server_thread.join();
|
||||
}
|
||||
|
||||
void default_resource_send(const shared_ptr<HttpServer> &server,
|
||||
const shared_ptr<HttpServer::Response> &response, const shared_ptr<ifstream> &ifs) {
|
||||
void default_resource_send(const shared_ptr<HttpServer::Response> &response, const shared_ptr<ifstream> &ifs) {
|
||||
//read and send 128 KB at a time
|
||||
static vector<char> buffer(131072); // Safe when server is running on one thread
|
||||
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](const SimpleWeb::error_code &ec) {
|
||||
response->send([response, ifs](const SimpleWeb::error_code &ec) {
|
||||
if(!ec)
|
||||
default_resource_send(server, response, ifs);
|
||||
default_resource_send(response, ifs);
|
||||
else
|
||||
cerr << "Connection interrupted" << endl;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -21,8 +21,7 @@ typedef SimpleWeb::Server<SimpleWeb::HTTPS> HttpsServer;
|
|||
typedef SimpleWeb::Client<SimpleWeb::HTTPS> HttpsClient;
|
||||
|
||||
//Added for the default_resource example
|
||||
void default_resource_send(const shared_ptr<HttpsServer> &server,
|
||||
const shared_ptr<HttpsServer::Response> &response, const shared_ptr<ifstream> &ifs);
|
||||
void default_resource_send(const shared_ptr<HttpsServer::Response> &response, const shared_ptr<ifstream> &ifs);
|
||||
|
||||
int main() {
|
||||
//HTTPS-server at port 8080 using 1 thread
|
||||
|
|
@ -137,7 +136,7 @@ int main() {
|
|||
//Will respond with content in the web/-directory, and its subdirectories.
|
||||
//Default file: index.html
|
||||
//Can for instance be used to retrieve an HTML 5 client that uses REST-resources on this server
|
||||
server->default_resource["GET"] = [&server](shared_ptr<HttpsServer::Response> &response, shared_ptr<HttpsServer::Request> &request) {
|
||||
server->default_resource["GET"] = [](shared_ptr<HttpsServer::Response> &response, shared_ptr<HttpsServer::Request> &request) {
|
||||
try {
|
||||
auto web_root_path = boost::filesystem::canonical("web");
|
||||
auto path = boost::filesystem::canonical(web_root_path / request->path);
|
||||
|
|
@ -182,7 +181,7 @@ int main() {
|
|||
|
||||
header.emplace("Content-Length", to_string(length));
|
||||
response->write(header);
|
||||
default_resource_send(server, response, ifs);
|
||||
default_resource_send(response, ifs);
|
||||
}
|
||||
else
|
||||
throw invalid_argument("could not read file");
|
||||
|
|
@ -227,17 +226,16 @@ int main() {
|
|||
server_thread.join();
|
||||
}
|
||||
|
||||
void default_resource_send(const shared_ptr<HttpsServer> &server,
|
||||
const shared_ptr<HttpsServer::Response> &response, const shared_ptr<ifstream> &ifs) {
|
||||
void default_resource_send(const shared_ptr<HttpsServer::Response> &response, const shared_ptr<ifstream> &ifs) {
|
||||
//read and send 128 KB at a time
|
||||
static vector<char> buffer(131072); // Safe when server is running on one thread
|
||||
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](const SimpleWeb::error_code &ec) {
|
||||
response->send([response, ifs](const SimpleWeb::error_code &ec) {
|
||||
if(!ec)
|
||||
default_resource_send(server, response, ifs);
|
||||
default_resource_send(response, ifs);
|
||||
else
|
||||
cerr << "Connection interrupted" << endl;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -53,15 +53,17 @@ namespace SimpleWeb {
|
|||
public:
|
||||
virtual ~ServerBase() {}
|
||||
|
||||
class Response : public std::ostream {
|
||||
class Response : public std::enable_shared_from_this<Response>, public std::ostream {
|
||||
friend class ServerBase<socket_type>;
|
||||
friend class Server<socket_type>;
|
||||
|
||||
asio::streambuf streambuf;
|
||||
|
||||
std::shared_ptr<asio::io_service> io_service;
|
||||
std::shared_ptr<socket_type> socket;
|
||||
|
||||
Response(const std::shared_ptr<socket_type> &socket) : std::ostream(&streambuf), socket(socket) {}
|
||||
Response(const std::shared_ptr<asio::io_service> &io_service, const std::shared_ptr<socket_type> &socket)
|
||||
: std::ostream(&streambuf), io_service(io_service), socket(socket) {}
|
||||
|
||||
template <class size_type>
|
||||
void write_header(const CaseInsensitiveMultimap &header, size_type size) {
|
||||
|
|
@ -86,6 +88,15 @@ namespace SimpleWeb {
|
|||
return streambuf.size();
|
||||
}
|
||||
|
||||
/// Use this function if you need to recursively send parts of a longer message
|
||||
void send(const std::function<void(const error_code &)> &callback = nullptr) {
|
||||
auto self = this->shared_from_this();
|
||||
asio::async_write(*socket, streambuf, [self, callback](const error_code &ec, size_t /*bytes_transferred*/) {
|
||||
if(callback)
|
||||
callback(ec);
|
||||
});
|
||||
}
|
||||
|
||||
/// Write directly to stream buffer using std::ostream::write
|
||||
void write(const char_type *ptr, std::streamsize n) {
|
||||
std::ostream::write(ptr, n);
|
||||
|
|
@ -324,14 +335,6 @@ namespace SimpleWeb {
|
|||
io_service->stop();
|
||||
}
|
||||
|
||||
///Use this function if you need to recursively send parts of a longer message
|
||||
void send(const std::shared_ptr<Response> &response, const std::function<void(const error_code &)> &callback = nullptr) const {
|
||||
asio::async_write(*response->socket, response->streambuf, [response, callback](const error_code &ec, size_t /*bytes_transferred*/) {
|
||||
if(callback)
|
||||
callback(ec);
|
||||
});
|
||||
}
|
||||
|
||||
/// If you have your own asio::io_service, store its pointer here before running start().
|
||||
std::shared_ptr<asio::io_service> io_service;
|
||||
|
||||
|
|
@ -480,9 +483,9 @@ namespace SimpleWeb {
|
|||
auto request = session->request;
|
||||
session->set_timeout(config.timeout_content);
|
||||
auto timer = session->timer;
|
||||
auto response = std::shared_ptr<Response>(new Response(session->socket), [self, request, timer](Response *response_ptr) mutable {
|
||||
auto response = std::shared_ptr<Response>(new Response(io_service, session->socket), [self, request, timer](Response *response_ptr) mutable {
|
||||
auto response = std::shared_ptr<Response>(response_ptr);
|
||||
self->send(response, [self, response, request, timer](const error_code &ec) mutable {
|
||||
response->send([self, response, request, timer](const error_code &ec) mutable {
|
||||
if(timer)
|
||||
timer->cancel();
|
||||
if(!ec) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue