diff --git a/examples/server/httplib.h b/examples/server/httplib.h index f360bd93e..025946180 100644 --- a/examples/server/httplib.h +++ b/examples/server/httplib.h @@ -457,6 +457,7 @@ public: std::function write; std::function is_writable; + std::function is_alive; std::function done; std::function done_with_trailer; std::ostream os; @@ -639,6 +640,7 @@ public: virtual bool is_readable() const = 0; virtual bool is_writable() const = 0; + virtual bool is_alive() const = 0; virtual ssize_t read(char *ptr, size_t size) = 0; virtual ssize_t write(const char *ptr, size_t size) = 0; @@ -2135,6 +2137,7 @@ public: bool is_readable() const override; bool is_writable() const override; + bool is_alive() const override; ssize_t read(char *ptr, size_t size) override; ssize_t write(const char *ptr, size_t size) override; void get_remote_ip_and_port(std::string &ip, int &port) const override; @@ -2945,6 +2948,7 @@ public: bool is_readable() const override; bool is_writable() const override; + bool is_alive() const override; ssize_t read(char *ptr, size_t size) override; ssize_t write(const char *ptr, size_t size) override; void get_remote_ip_and_port(std::string &ip, int &port) const override; @@ -2975,6 +2979,7 @@ public: bool is_readable() const override; bool is_writable() const override; + bool is_alive() const override; ssize_t read(char *ptr, size_t size) override; ssize_t write(const char *ptr, size_t size) override; void get_remote_ip_and_port(std::string &ip, int &port) const override; @@ -4088,6 +4093,7 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider, }; data_sink.is_writable = [&]() -> bool { return strm.is_writable(); }; + data_sink.is_alive = [&]() -> bool { return strm.is_alive(); }; while (offset < end_offset && !is_shutting_down()) { if (!strm.is_writable()) { @@ -4134,6 +4140,7 @@ write_content_without_length(Stream &strm, }; data_sink.is_writable = [&]() -> bool { return strm.is_writable(); }; + data_sink.is_alive = [&]() -> bool { return strm.is_alive(); }; data_sink.done = [&](void) { data_available = false; }; @@ -4186,6 +4193,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider, }; data_sink.is_writable = [&]() -> bool { return strm.is_writable(); }; + data_sink.is_alive = [&]() -> bool { return strm.is_alive(); }; auto done_with_trailer = [&](const Headers *trailer) { if (!ok) { return; } @@ -5484,6 +5492,10 @@ inline bool SocketStream::is_writable() const { is_socket_alive(sock_); } +inline bool SocketStream::is_alive() const { + return is_socket_alive(sock_); +} + inline ssize_t SocketStream::read(char *ptr, size_t size) { #ifdef _WIN32 size = @@ -5558,6 +5570,8 @@ inline bool BufferStream::is_readable() const { return true; } inline bool BufferStream::is_writable() const { return true; } +inline bool BufferStream::is_alive() const { return true; } + inline ssize_t BufferStream::read(char *ptr, size_t size) { #if defined(_MSC_VER) && _MSC_VER < 1910 auto len_read = buffer._Copy_s(ptr, size, size, position); @@ -8348,6 +8362,10 @@ inline bool SSLSocketStream::is_writable() const { is_socket_alive(sock_); } +inline bool SSLSocketStream::is_alive() const { + return is_socket_alive(sock_); +} + inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { if (SSL_pending(ssl_) > 0) { return SSL_read(ssl_, ptr, static_cast(size)); diff --git a/examples/server/server.cpp b/examples/server/server.cpp index 7972e5565..8f8a91ad5 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -2445,7 +2445,7 @@ static void handle_tasks( }; if (!stream) { res.set_content_provider(MIMETYPE_JSON, [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) { - auto is_alive = [&sink]() { return sink.is_writable(); }; + auto is_alive = [&sink]() { return sink.is_alive(); }; state->task_ids = create_tasks(is_alive); payload(state->task_ids, sink); ctx_server.queue_results.remove_waiting_task_ids(state->task_ids); @@ -2453,7 +2453,7 @@ static void handle_tasks( }, resource_releaser); } else { res.set_chunked_content_provider("text/event-stream", [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) { - auto is_alive = [&sink]() { return sink.is_writable(); }; + auto is_alive = [&sink]() { return sink.is_alive(); }; state->task_ids = create_tasks(is_alive); payload(state->task_ids, sink); ctx_server.queue_results.remove_waiting_task_ids(state->task_ids); diff --git a/tests/.DS_Store b/tests/.DS_Store new file mode 100644 index 000000000..9baef261e Binary files /dev/null and b/tests/.DS_Store differ