Skip to content

Commit afce9b5

Browse files
Refactor streams: rename is_* to wait_* for clarity
- 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 2b790ac commit afce9b5

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
@@ -762,7 +762,8 @@ class Stream {
762762
virtual ~Stream() = default;
763763

764764
virtual bool is_readable() const = 0;
765-
virtual bool is_writable() const = 0;
765+
virtual bool wait_readable() const = 0;
766+
virtual bool wait_writable() const = 0;
766767

767768
virtual ssize_t read(char *ptr, size_t size) = 0;
768769
virtual ssize_t write(const char *ptr, size_t size) = 0;
@@ -2479,7 +2480,8 @@ class BufferStream final : public Stream {
24792480
~BufferStream() override = default;
24802481

24812482
bool is_readable() const override;
2482-
bool is_writable() const override;
2483+
bool wait_readable() const override;
2484+
bool wait_writable() const override;
24832485
ssize_t read(char *ptr, size_t size) override;
24842486
ssize_t write(const char *ptr, size_t size) override;
24852487
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3393,7 +3395,8 @@ class SocketStream final : public Stream {
33933395
~SocketStream() override;
33943396

33953397
bool is_readable() const override;
3396-
bool is_writable() const override;
3398+
bool wait_readable() const override;
3399+
bool wait_writable() const override;
33973400
ssize_t read(char *ptr, size_t size) override;
33983401
ssize_t write(const char *ptr, size_t size) override;
33993402
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3429,7 +3432,8 @@ class SSLSocketStream final : public Stream {
34293432
~SSLSocketStream() override;
34303433

34313434
bool is_readable() const override;
3432-
bool is_writable() const override;
3435+
bool wait_readable() const override;
3436+
bool wait_writable() const override;
34333437
ssize_t read(char *ptr, size_t size) override;
34343438
ssize_t write(const char *ptr, size_t size) override;
34353439
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -4591,7 +4595,7 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
45914595

45924596
data_sink.write = [&](const char *d, size_t l) -> bool {
45934597
if (ok) {
4594-
if (strm.is_writable() && write_data(strm, d, l)) {
4598+
if (write_data(strm, d, l)) {
45954599
offset += l;
45964600
} else {
45974601
ok = false;
@@ -4600,10 +4604,10 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
46004604
return ok;
46014605
};
46024606

4603-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4607+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
46044608

46054609
while (offset < end_offset && !is_shutting_down()) {
4606-
if (!strm.is_writable()) {
4610+
if (!strm.wait_writable()) {
46074611
error = Error::Write;
46084612
return false;
46094613
} else if (!content_provider(offset, end_offset - offset, data_sink)) {
@@ -4641,17 +4645,17 @@ write_content_without_length(Stream &strm,
46414645
data_sink.write = [&](const char *d, size_t l) -> bool {
46424646
if (ok) {
46434647
offset += l;
4644-
if (!strm.is_writable() || !write_data(strm, d, l)) { ok = false; }
4648+
if (!write_data(strm, d, l)) { ok = false; }
46454649
}
46464650
return ok;
46474651
};
46484652

4649-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4653+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
46504654

46514655
data_sink.done = [&](void) { data_available = false; };
46524656

46534657
while (data_available && !is_shutting_down()) {
4654-
if (!strm.is_writable()) {
4658+
if (!strm.wait_writable()) {
46554659
return false;
46564660
} else if (!content_provider(offset, 0, data_sink)) {
46574661
return false;
@@ -4686,10 +4690,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
46864690
// Emit chunked response header and footer for each chunk
46874691
auto chunk =
46884692
from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
4689-
if (!strm.is_writable() ||
4690-
!write_data(strm, chunk.data(), chunk.size())) {
4691-
ok = false;
4692-
}
4693+
if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; }
46934694
}
46944695
} else {
46954696
ok = false;
@@ -4698,7 +4699,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
46984699
return ok;
46994700
};
47004701

4701-
data_sink.is_writable = [&]() -> bool { return strm.is_writable(); };
4702+
data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); };
47024703

47034704
auto done_with_trailer = [&](const Headers *trailer) {
47044705
if (!ok) { return; }
@@ -4718,8 +4719,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
47184719
if (!payload.empty()) {
47194720
// Emit chunked response header and footer for each chunk
47204721
auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n";
4721-
if (!strm.is_writable() ||
4722-
!write_data(strm, chunk.data(), chunk.size())) {
4722+
if (!write_data(strm, chunk.data(), chunk.size())) {
47234723
ok = false;
47244724
return;
47254725
}
@@ -4751,7 +4751,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
47514751
};
47524752

47534753
while (data_available && !is_shutting_down()) {
4754-
if (!strm.is_writable()) {
4754+
if (!strm.wait_writable()) {
47554755
error = Error::Write;
47564756
return false;
47574757
} else if (!content_provider(offset, 0, data_sink)) {
@@ -6046,6 +6046,10 @@ inline SocketStream::SocketStream(
60466046
inline SocketStream::~SocketStream() = default;
60476047

60486048
inline bool SocketStream::is_readable() const {
6049+
return read_buff_off_ < read_buff_content_size_;
6050+
}
6051+
6052+
inline bool SocketStream::wait_readable() const {
60496053
if (max_timeout_msec_ <= 0) {
60506054
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
60516055
}
@@ -6058,7 +6062,7 @@ inline bool SocketStream::is_readable() const {
60586062
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
60596063
}
60606064

6061-
inline bool SocketStream::is_writable() const {
6065+
inline bool SocketStream::wait_writable() const {
60626066
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
60636067
is_socket_alive(sock_);
60646068
}
@@ -6085,7 +6089,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
60856089
}
60866090
}
60876091

6088-
if (!is_readable()) { return -1; }
6092+
if (!wait_readable()) { return -1; }
60896093

60906094
read_buff_off_ = 0;
60916095
read_buff_content_size_ = 0;
@@ -6110,7 +6114,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
61106114
}
61116115

61126116
inline ssize_t SocketStream::write(const char *ptr, size_t size) {
6113-
if (!is_writable()) { return -1; }
6117+
if (!wait_writable()) { return -1; }
61146118

61156119
#if defined(_WIN32) && !defined(_WIN64)
61166120
size =
@@ -6141,7 +6145,9 @@ inline time_t SocketStream::duration() const {
61416145
// Buffer stream implementation
61426146
inline bool BufferStream::is_readable() const { return true; }
61436147

6144-
inline bool BufferStream::is_writable() const { return true; }
6148+
inline bool BufferStream::wait_readable() const { return true; }
6149+
6150+
inline bool BufferStream::wait_writable() const { return true; }
61456151

61466152
inline ssize_t BufferStream::read(char *ptr, size_t size) {
61476153
#if defined(_MSC_VER) && _MSC_VER < 1910
@@ -9204,6 +9210,10 @@ inline SSLSocketStream::SSLSocketStream(
92049210
inline SSLSocketStream::~SSLSocketStream() = default;
92059211

92069212
inline bool SSLSocketStream::is_readable() const {
9213+
return SSL_pending(ssl_) > 0;
9214+
}
9215+
9216+
inline bool SSLSocketStream::wait_readable() const {
92079217
if (max_timeout_msec_ <= 0) {
92089218
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
92099219
}
@@ -9216,15 +9226,15 @@ inline bool SSLSocketStream::is_readable() const {
92169226
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
92179227
}
92189228

9219-
inline bool SSLSocketStream::is_writable() const {
9229+
inline bool SSLSocketStream::wait_writable() const {
92209230
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
92219231
is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_);
92229232
}
92239233

92249234
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
92259235
if (SSL_pending(ssl_) > 0) {
92269236
return SSL_read(ssl_, ptr, static_cast<int>(size));
9227-
} else if (is_readable()) {
9237+
} else if (wait_readable()) {
92289238
auto ret = SSL_read(ssl_, ptr, static_cast<int>(size));
92299239
if (ret < 0) {
92309240
auto err = SSL_get_error(ssl_, ret);
@@ -9238,7 +9248,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
92389248
#endif
92399249
if (SSL_pending(ssl_) > 0) {
92409250
return SSL_read(ssl_, ptr, static_cast<int>(size));
9241-
} else if (is_readable()) {
9251+
} else if (wait_readable()) {
92429252
std::this_thread::sleep_for(std::chrono::microseconds{10});
92439253
ret = SSL_read(ssl_, ptr, static_cast<int>(size));
92449254
if (ret >= 0) { return ret; }
@@ -9255,7 +9265,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
92559265
}
92569266

92579267
inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
9258-
if (is_writable()) {
9268+
if (wait_writable()) {
92599269
auto handle_size = static_cast<int>(
92609270
std::min<size_t>(size, (std::numeric_limits<int>::max)()));
92619271

@@ -9270,7 +9280,7 @@ inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
92709280
#else
92719281
while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
92729282
#endif
9273-
if (is_writable()) {
9283+
if (wait_writable()) {
92749284
std::this_thread::sleep_for(std::chrono::microseconds{10});
92759285
ret = SSL_write(ssl_, ptr, static_cast<int>(handle_size));
92769286
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)