From 39076721636a6ad00acf3f85d82d88ac1fe5705e Mon Sep 17 00:00:00 2001 From: ochafik Date: Fri, 4 Oct 2024 05:08:54 +0100 Subject: [PATCH] Add {Stream,DataSink}::is_alive --- httplib.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/httplib.h b/httplib.h index 121ce34..6f4efc7 100644 --- a/httplib.h +++ b/httplib.h @@ -530,6 +530,7 @@ public: std::function write; std::function is_writable; + std::function is_alive; std::function done; std::function done_with_trailer; std::ostream os; @@ -722,6 +723,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; @@ -2333,6 +2335,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; @@ -3205,6 +3208,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; @@ -3235,6 +3239,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; @@ -4410,6 +4415,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()) { @@ -4456,6 +4462,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; }; @@ -4508,6 +4515,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; } @@ -5821,6 +5829,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 = @@ -5895,6 +5907,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); @@ -8904,6 +8918,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));