Skip to content

Commit 42f5465

Browse files
author
ochafik
committed
server: introduce supposedly lighterweight is_alive in httplib (yhirose/cpp-httplib#1956)
1 parent 43e306e commit 42f5465

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

examples/server/httplib.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ class DataSink {
457457

458458
std::function<bool(const char *data, size_t data_len)> write;
459459
std::function<bool()> is_writable;
460+
std::function<bool()> is_alive;
460461
std::function<void()> done;
461462
std::function<void(const Headers &trailer)> done_with_trailer;
462463
std::ostream os;
@@ -639,6 +640,7 @@ class Stream {
639640

640641
virtual bool is_readable() const = 0;
641642
virtual bool is_writable() const = 0;
643+
virtual bool is_alive() const = 0;
642644

643645
virtual ssize_t read(char *ptr, size_t size) = 0;
644646
virtual ssize_t write(const char *ptr, size_t size) = 0;
@@ -2135,6 +2137,7 @@ class BufferStream final : public Stream {
21352137

21362138
bool is_readable() const override;
21372139
bool is_writable() const override;
2140+
bool is_alive() const override;
21382141
ssize_t read(char *ptr, size_t size) override;
21392142
ssize_t write(const char *ptr, size_t size) override;
21402143
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -2945,6 +2948,7 @@ class SocketStream final : public Stream {
29452948

29462949
bool is_readable() const override;
29472950
bool is_writable() const override;
2951+
bool is_alive() const override;
29482952
ssize_t read(char *ptr, size_t size) override;
29492953
ssize_t write(const char *ptr, size_t size) override;
29502954
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -2975,6 +2979,7 @@ class SSLSocketStream final : public Stream {
29752979

29762980
bool is_readable() const override;
29772981
bool is_writable() const override;
2982+
bool is_alive() const override;
29782983
ssize_t read(char *ptr, size_t size) override;
29792984
ssize_t write(const char *ptr, size_t size) override;
29802985
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,
40884093
};
40894094

40904095
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4096+
data_sink.is_alive = [&]() -> bool { return strm.is_alive(); };
40914097

40924098
while (offset < end_offset && !is_shutting_down()) {
40934099
if (!strm.is_writable()) {
@@ -4134,6 +4140,7 @@ write_content_without_length(Stream &strm,
41344140
};
41354141

41364142
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4143+
data_sink.is_alive = [&]() -> bool { return strm.is_alive(); };
41374144

41384145
data_sink.done = [&](void) { data_available = false; };
41394146

@@ -4186,6 +4193,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
41864193
};
41874194

41884195
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4196+
data_sink.is_alive = [&]() -> bool { return strm.is_alive(); };
41894197

41904198
auto done_with_trailer = [&](const Headers *trailer) {
41914199
if (!ok) { return; }
@@ -5484,6 +5492,10 @@ inline bool SocketStream::is_writable() const {
54845492
is_socket_alive(sock_);
54855493
}
54865494

5495+
inline bool SocketStream::is_alive() const {
5496+
return is_socket_alive(sock_);
5497+
}
5498+
54875499
inline ssize_t SocketStream::read(char *ptr, size_t size) {
54885500
#ifdef _WIN32
54895501
size =
@@ -5558,6 +5570,8 @@ inline bool BufferStream::is_readable() const { return true; }
55585570

55595571
inline bool BufferStream::is_writable() const { return true; }
55605572

5573+
inline bool BufferStream::is_alive() const { return true; }
5574+
55615575
inline ssize_t BufferStream::read(char *ptr, size_t size) {
55625576
#if defined(_MSC_VER) && _MSC_VER < 1910
55635577
auto len_read = buffer._Copy_s(ptr, size, size, position);
@@ -8348,6 +8362,10 @@ inline bool SSLSocketStream::is_writable() const {
83488362
is_socket_alive(sock_);
83498363
}
83508364

8365+
inline bool SSLSocketStream::is_alive() const {
8366+
return is_socket_alive(sock_);
8367+
}
8368+
83518369
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
83528370
if (SSL_pending(ssl_) > 0) {
83538371
return SSL_read(ssl_, ptr, static_cast<int>(size));

examples/server/server.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,15 +2445,15 @@ static void handle_tasks(
24452445
};
24462446
if (!stream) {
24472447
res.set_content_provider(MIMETYPE_JSON, [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) {
2448-
auto is_alive = [&sink]() { return sink.is_writable(); };
2448+
auto is_alive = [&sink]() { return sink.is_alive(); };
24492449
state->task_ids = create_tasks(is_alive);
24502450
payload(state->task_ids, sink);
24512451
ctx_server.queue_results.remove_waiting_task_ids(state->task_ids);
24522452
return false;
24532453
}, resource_releaser);
24542454
} else {
24552455
res.set_chunked_content_provider("text/event-stream", [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) {
2456-
auto is_alive = [&sink]() { return sink.is_writable(); };
2456+
auto is_alive = [&sink]() { return sink.is_alive(); };
24572457
state->task_ids = create_tasks(is_alive);
24582458
payload(state->task_ids, sink);
24592459
ctx_server.queue_results.remove_waiting_task_ids(state->task_ids);

tests/.DS_Store

8 KB
Binary file not shown.

0 commit comments

Comments
 (0)