server: introduce supposedly lighterweight is_alive in httplib (https://github.com/yhirose/cpp-httplib/pull/1956)

This commit is contained in:
ochafik 2024-10-04 05:18:39 +01:00
parent 43e306e08f
commit 42f546500f
3 changed files with 20 additions and 2 deletions

View file

@ -457,6 +457,7 @@ public:
std::function<bool(const char *data, size_t data_len)> write;
std::function<bool()> is_writable;
std::function<bool()> is_alive;
std::function<void()> done;
std::function<void(const Headers &trailer)> 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<int>(size));

View file

@ -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);

BIN
tests/.DS_Store vendored Normal file

Binary file not shown.