From 42f546500fe4eba7c68d272f1abfa875cc708c79 Mon Sep 17 00:00:00 2001 From: ochafik Date: Fri, 4 Oct 2024 05:18:39 +0100 Subject: [PATCH] `server`: introduce supposedly lighterweight is_alive in httplib (https://github.com/yhirose/cpp-httplib/pull/1956) --- examples/server/httplib.h | 18 ++++++++++++++++++ examples/server/server.cpp | 4 ++-- tests/.DS_Store | Bin 0 -> 8196 bytes 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 tests/.DS_Store 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 0000000000000000000000000000000000000000..9baef261ea77e8aec20a8434c24c60399e395110 GIT binary patch literal 8196 zcmeHMO>fgc5S>j^lBhz-fr?6Su!Oj^kVX|B;(!U^$N`K%2vD%&sC99?A$G_i3i1V^ zaO1{L;K+>wcYZW=z8+=I z3a|qIr2_PRu&@!@22+jd)qzeO0TA;TR)+lwbr3Csw!u^*j-Ux$il|G4IbsN1j&aN6 z*#=XMx*UW#dl1^C$7sVaf7JcQw4$F#*~Nm zg26tc*sb;{2KOS8g|-gq=u^ zH3MPZ0&x5{Mz6AT{J0f*xI9YU;`q$zMWKvVF-GxuNT3Zd`XyALk0_yskr11U@iv?T z9~`(3H^bFsrzJaGtOD`*^^5&gcVweszKs-X-@bqNboJx4{m$SYa)$0&mcctBQqJ)2 zKmZY}Bk!r4VSM`O?iE>{@tfxxUv4R$yWFQEe{tJ;RhAEoZQ^rk8y|_!j-KTbHi^7^ z?6nXh^c0`UQ~Wsl^58RN`Om(Uo6q@x>&ohK_}Q|0<;q`4uRj_6J}hj6w!u^*g(%MZ zKMBFc3LHTNX7rjD==^_U=kNbVkQpzT6<`JSs({EhoJJk9)vi9JigtMm+hc5Gl$UB$ kCFr*OA%NFg|1iY9g{f3y8%#A~1dTrgC>hwX0)JJ3pI46gjsO4v literal 0 HcmV?d00001