Skip to content

Commit 550f728

Browse files
Refactor streams: rename is_* to wait_* for clarity (#2069)
- Replace is_readable() with wait_readable() and is_writable() with wait_writable() in the Stream interface. - Implement a new is_readable() function with semantics that more closely reflect its name. It returns immediately whether data is available for reading, without waiting. - Update call sites of is_writable(), removing redundant checks.
1 parent a4b2c61 commit 550f728

File tree

3 files changed

+45
-33
lines changed

3 files changed

+45
-33
lines changed

httplib.h

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,8 @@ class Stream {
751751
virtual ~Stream() = default;
752752

753753
virtual bool is_readable() const = 0;
754-
virtual bool is_writable() const = 0;
754+
virtual bool wait_readable() const = 0;
755+
virtual bool wait_writable() const = 0;
755756

756757
virtual ssize_t read(char *ptr, size_t size) = 0;
757758
virtual ssize_t write(const char *ptr, size_t size) = 0;
@@ -2466,7 +2467,8 @@ class BufferStream final : public Stream {
24662467
~BufferStream() override = default;
24672468

24682469
bool is_readable() const override;
2469-
bool is_writable() const override;
2470+
bool wait_readable() const override;
2471+
bool wait_writable() const override;
24702472
ssize_t read(char *ptr, size_t size) override;
24712473
ssize_t write(const char *ptr, size_t size) override;
24722474
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3380,7 +3382,8 @@ class SocketStream final : public Stream {
33803382
~SocketStream() override;
33813383

33823384
bool is_readable() const override;
3383-
bool is_writable() const override;
3385+
bool wait_readable() const override;
3386+
bool wait_writable() const override;
33843387
ssize_t read(char *ptr, size_t size) override;
33853388
ssize_t write(const char *ptr, size_t size) override;
33863389
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3416,7 +3419,8 @@ class SSLSocketStream final : public Stream {
34163419
~SSLSocketStream() override;
34173420

34183421
bool is_readable() const override;
3419-
bool is_writable() const override;
3422+
bool wait_readable() const override;
3423+
bool wait_writable() const override;
34203424
ssize_t read(char *ptr, size_t size) override;
34213425
ssize_t write(const char *ptr, size_t size) override;
34223426
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -4578,7 +4582,7 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
45784582

45794583
data_sink.write = [&](const char *d, size_t l) -> bool {
45804584
if (ok) {
4581-
if (strm.is_writable() && write_data(strm, d, l)) {
4585+
if (write_data(strm, d, l)) {
45824586
offset += l;
45834587
} else {
45844588
ok = false;
@@ -4587,10 +4591,10 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
45874591
return ok;
45884592
};
45894593

4590-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4594+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
45914595

45924596
while (offset < end_offset && !is_shutting_down()) {
4593-
if (!strm.is_writable()) {
4597+
if (!strm.wait_writable()) {
45944598
error = Error::Write;
45954599
return false;
45964600
} else if (!content_provider(offset, end_offset - offset, data_sink)) {
@@ -4628,17 +4632,17 @@ write_content_without_length(Stream &strm,
46284632
data_sink.write = [&](const char *d, size_t l) -> bool {
46294633
if (ok) {
46304634
offset += l;
4631-
if (!strm.is_writable() || !write_data(strm, d, l)) { ok = false; }
4635+
if (!write_data(strm, d, l)) { ok = false; }
46324636
}
46334637
return ok;
46344638
};
46354639

4636-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4640+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
46374641

46384642
data_sink.done = [&](void) { data_available = false; };
46394643

46404644
while (data_available && !is_shutting_down()) {
4641-
if (!strm.is_writable()) {
4645+
if (!strm.wait_writable()) {
46424646
return false;
46434647
} else if (!content_provider(offset, 0, data_sink)) {
46444648
return false;
@@ -4673,10 +4677,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
46734677
// Emit chunked response header and footer for each chunk
46744678
auto chunk =
46754679
from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
4676-
if (!strm.is_writable() ||
4677-
!write_data(strm, chunk.data(), chunk.size())) {
4678-
ok = false;
4679-
}
4680+
if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; }
46804681
}
46814682
} else {
46824683
ok = false;
@@ -4685,7 +4686,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
46854686
return ok;
46864687
};
46874688

4688-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4689+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
46894690

46904691
auto done_with_trailer = [&](const Headers *trailer) {
46914692
if (!ok) { return; }
@@ -4705,8 +4706,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
47054706
if (!payload.empty()) {
47064707
// Emit chunked response header and footer for each chunk
47074708
auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
4708-
if (!strm.is_writable() ||
4709-
!write_data(strm, chunk.data(), chunk.size())) {
4709+
if (!write_data(strm, chunk.data(), chunk.size())) {
47104710
ok = false;
47114711
return;
47124712
}
@@ -4738,7 +4738,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
47384738
};
47394739

47404740
while (data_available && !is_shutting_down()) {
4741-
if (!strm.is_writable()) {
4741+
if (!strm.wait_writable()) {
47424742
error = Error::Write;
47434743
return false;
47444744
} else if (!content_provider(offset, 0, data_sink)) {
@@ -6029,6 +6029,10 @@ inline SocketStream::SocketStream(
60296029
inline SocketStream::~SocketStream() = default;
60306030

60316031
inline bool SocketStream::is_readable() const {
6032+
return read_buff_off_ < read_buff_content_size_;
6033+
}
6034+
6035+
inline bool SocketStream::wait_readable() const {
60326036
if (max_timeout_msec_ <= 0) {
60336037
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
60346038
}
@@ -6041,7 +6045,7 @@ inline bool SocketStream::is_readable() const {
60416045
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
60426046
}
60436047

6044-
inline bool SocketStream::is_writable() const {
6048+
inline bool SocketStream::wait_writable() const {
60456049
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
60466050
is_socket_alive(sock_);
60476051
}
@@ -6068,7 +6072,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
60686072
}
60696073
}
60706074

6071-
if (!is_readable()) { return -1; }
6075+
if (!wait_readable()) { return -1; }
60726076

60736077
read_buff_off_ = 0;
60746078
read_buff_content_size_ = 0;
@@ -6093,7 +6097,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
60936097
}
60946098

60956099
inline ssize_t SocketStream::write(const char *ptr, size_t size) {
6096-
if (!is_writable()) { return -1; }
6100+
if (!wait_writable()) { return -1; }
60976101

60986102
#if defined(_WIN32) && !defined(_WIN64)
60996103
size =
@@ -6124,7 +6128,9 @@ inline time_t SocketStream::duration() const {
61246128
// Buffer stream implementation
61256129
inline bool BufferStream::is_readable() const { return true; }
61266130

6127-
inline bool BufferStream::is_writable() const { return true; }
6131+
inline bool BufferStream::wait_readable() const { return true; }
6132+
6133+
inline bool BufferStream::wait_writable() const { return true; }
61286134

61296135
inline ssize_t BufferStream::read(char *ptr, size_t size) {
61306136
#if defined(_MSC_VER) && _MSC_VER < 1910
@@ -9161,6 +9167,10 @@ inline SSLSocketStream::SSLSocketStream(
91619167
inline SSLSocketStream::~SSLSocketStream() = default;
91629168

91639169
inline bool SSLSocketStream::is_readable() const {
9170+
return SSL_pending(ssl_) > 0;
9171+
}
9172+
9173+
inline bool SSLSocketStream::wait_readable() const {
91649174
if (max_timeout_msec_ <= 0) {
91659175
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
91669176
}
@@ -9173,15 +9183,15 @@ inline bool SSLSocketStream::is_readable() const {
91739183
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
91749184
}
91759185

9176-
inline bool SSLSocketStream::is_writable() const {
9186+
inline bool SSLSocketStream::wait_writable() const {
91779187
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
91789188
is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_);
91799189
}
91809190

91819191
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
91829192
if (SSL_pending(ssl_) > 0) {
91839193
return SSL_read(ssl_, ptr, static_cast<int>(size));
9184-
} else if (is_readable()) {
9194+
} else if (wait_readable()) {
91859195
auto ret = SSL_read(ssl_, ptr, static_cast<int>(size));
91869196
if (ret < 0) {
91879197
auto err = SSL_get_error(ssl_, ret);
@@ -9195,7 +9205,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
91959205
#endif
91969206
if (SSL_pending(ssl_) > 0) {
91979207
return SSL_read(ssl_, ptr, static_cast<int>(size));
9198-
} else if (is_readable()) {
9208+
} else if (wait_readable()) {
91999209
std::this_thread::sleep_for(std::chrono::microseconds{10});
92009210
ret = SSL_read(ssl_, ptr, static_cast<int>(size));
92019211
if (ret >= 0) { return ret; }
@@ -9212,7 +9222,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
92129222
}
92139223

92149224
inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
9215-
if (is_writable()) {
9225+
if (wait_writable()) {
92169226
auto handle_size = static_cast<int>(
92179227
std::min<size_t>(size, (std::numeric_limits<int>::max)()));
92189228

@@ -9227,7 +9237,7 @@ inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
92279237
#else
92289238
while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
92299239
#endif
9230-
if (is_writable()) {
9240+
if (wait_writable()) {
92319241
std::this_thread::sleep_for(std::chrono::microseconds{10});
92329242
ret = SSL_write(ssl_, ptr, static_cast<int>(handle_size));
92339243
if (ret >= 0) { return ret; }

test/fuzzing/server_fuzzer.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ class FuzzedStream : public httplib::Stream {
2525

2626
bool is_readable() const override { return true; }
2727

28-
bool is_writable() const override { return true; }
28+
bool wait_readable() const override { return true; }
29+
30+
bool wait_writable() const override { return true; }
2931

3032
void get_remote_ip_and_port(std::string &ip, int &port) const override {
3133
ip = "127.0.0.1";

test/test.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ TEST_F(UnixSocketTest, abstract) {
156156
}
157157
#endif
158158

159-
TEST(SocketStream, is_writable_UNIX) {
159+
TEST(SocketStream, wait_writable_UNIX) {
160160
int fds[2];
161161
ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
162162

@@ -167,17 +167,17 @@ TEST(SocketStream, is_writable_UNIX) {
167167
};
168168
asSocketStream(fds[0], [&](Stream &s0) {
169169
EXPECT_EQ(s0.socket(), fds[0]);
170-
EXPECT_TRUE(s0.is_writable());
170+
EXPECT_TRUE(s0.wait_writable());
171171

172172
EXPECT_EQ(0, close(fds[1]));
173-
EXPECT_FALSE(s0.is_writable());
173+
EXPECT_FALSE(s0.wait_writable());
174174

175175
return true;
176176
});
177177
EXPECT_EQ(0, close(fds[0]));
178178
}
179179

180-
TEST(SocketStream, is_writable_INET) {
180+
TEST(SocketStream, wait_writable_INET) {
181181
sockaddr_in addr;
182182
memset(&addr, 0, sizeof(addr));
183183
addr.sin_family = AF_INET;
@@ -212,7 +212,7 @@ TEST(SocketStream, is_writable_INET) {
212212
};
213213
asSocketStream(disconnected_svr_sock, [&](Stream &ss) {
214214
EXPECT_EQ(ss.socket(), disconnected_svr_sock);
215-
EXPECT_FALSE(ss.is_writable());
215+
EXPECT_FALSE(ss.wait_writable());
216216

217217
return true;
218218
});

0 commit comments

Comments
 (0)