Response stream now subclass std::ostream. Also some cleanup of default_resource example.

This commit is contained in:
eidheim 2015-09-06 17:59:02 +02:00
commit c58b7a788e
3 changed files with 88 additions and 112 deletions

View file

@ -14,7 +14,7 @@ namespace SimpleWeb {
template <class socket_type>
class ServerBase {
public:
class Response {
class Response : public std::ostream {
friend class ServerBase<socket_type>;
private:
boost::asio::yield_context& yield;
@ -24,8 +24,12 @@ namespace SimpleWeb {
socket_type &socket;
Response(boost::asio::io_service& io_service, socket_type &socket, boost::asio::yield_context& yield):
yield(yield), socket(socket), stream(&streambuf) {}
std::ostream(&streambuf), yield(yield), socket(socket) {}
public:
size_t size() {
return streambuf.size();
}
void flush() {
boost::system::error_code ec;
boost::asio::async_write(socket, streambuf, yield[ec]);
@ -33,28 +37,6 @@ namespace SimpleWeb {
if(ec)
throw std::runtime_error(ec.message());
}
public:
std::ostream stream;
size_t size() {
return streambuf.size();
}
template <class T>
Response& operator<<(const T& t) {
stream << t;
return *this;
}
Response& operator<<(std::ostream& (*manip)(std::ostream&)) {
stream << manip;
return *this;
}
Response& operator<<(Response& (*manip)(Response&)) {
return manip(*this);
}
};
static Response& flush(Response& r) {
@ -307,11 +289,13 @@ namespace SimpleWeb {
return;
}
try {
response.flush();
}
catch(const std::exception &e) {
return;
if(response.size()>0) {
try {
response.flush();
}
catch(const std::exception &e) {
return;
}
}
if(timeout_content>0)
timer->cancel();