@@ -762,7 +762,8 @@ class Stream {
762
762
virtual ~Stream() = default;
763
763
764
764
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;
766
767
767
768
virtual ssize_t read(char *ptr, size_t size) = 0;
768
769
virtual ssize_t write(const char *ptr, size_t size) = 0;
@@ -2479,7 +2480,8 @@ class BufferStream final : public Stream {
2479
2480
~BufferStream() override = default;
2480
2481
2481
2482
bool is_readable() const override;
2482
- bool is_writable() const override;
2483
+ bool wait_readable() const override;
2484
+ bool wait_writable() const override;
2483
2485
ssize_t read(char *ptr, size_t size) override;
2484
2486
ssize_t write(const char *ptr, size_t size) override;
2485
2487
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3393,7 +3395,8 @@ class SocketStream final : public Stream {
3393
3395
~SocketStream() override;
3394
3396
3395
3397
bool is_readable() const override;
3396
- bool is_writable() const override;
3398
+ bool wait_readable() const override;
3399
+ bool wait_writable() const override;
3397
3400
ssize_t read(char *ptr, size_t size) override;
3398
3401
ssize_t write(const char *ptr, size_t size) override;
3399
3402
void get_remote_ip_and_port(std::string &ip, int &port) const override;
@@ -3429,7 +3432,8 @@ class SSLSocketStream final : public Stream {
3429
3432
~SSLSocketStream() override;
3430
3433
3431
3434
bool is_readable() const override;
3432
- bool is_writable() const override;
3435
+ bool wait_readable() const override;
3436
+ bool wait_writable() const override;
3433
3437
ssize_t read(char *ptr, size_t size) override;
3434
3438
ssize_t write(const char *ptr, size_t size) override;
3435
3439
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,
4591
4595
4592
4596
data_sink.write = [&](const char *d, size_t l) -> bool {
4593
4597
if (ok) {
4594
- if (strm.is_writable() && write_data(strm, d, l)) {
4598
+ if (write_data(strm, d, l)) {
4595
4599
offset += l;
4596
4600
} else {
4597
4601
ok = false;
@@ -4600,10 +4604,10 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
4600
4604
return ok;
4601
4605
};
4602
4606
4603
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4607
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4604
4608
4605
4609
while (offset < end_offset && !is_shutting_down()) {
4606
- if (!strm.is_writable ()) {
4610
+ if (!strm.wait_writable ()) {
4607
4611
error = Error::Write;
4608
4612
return false;
4609
4613
} else if (!content_provider(offset, end_offset - offset, data_sink)) {
@@ -4641,17 +4645,17 @@ write_content_without_length(Stream &strm,
4641
4645
data_sink.write = [&](const char *d, size_t l) -> bool {
4642
4646
if (ok) {
4643
4647
offset += l;
4644
- if (!strm.is_writable() || ! write_data(strm, d, l)) { ok = false; }
4648
+ if (!write_data(strm, d, l)) { ok = false; }
4645
4649
}
4646
4650
return ok;
4647
4651
};
4648
4652
4649
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4653
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4650
4654
4651
4655
data_sink.done = [&](void) { data_available = false; };
4652
4656
4653
4657
while (data_available && !is_shutting_down()) {
4654
- if (!strm.is_writable ()) {
4658
+ if (!strm.wait_writable ()) {
4655
4659
return false;
4656
4660
} else if (!content_provider(offset, 0, data_sink)) {
4657
4661
return false;
@@ -4686,10 +4690,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4686
4690
// Emit chunked response header and footer for each chunk
4687
4691
auto chunk =
4688
4692
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; }
4693
4694
}
4694
4695
} else {
4695
4696
ok = false;
@@ -4698,7 +4699,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4698
4699
return ok;
4699
4700
};
4700
4701
4701
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4702
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4702
4703
4703
4704
auto done_with_trailer = [&](const Headers *trailer) {
4704
4705
if (!ok) { return; }
@@ -4718,8 +4719,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4718
4719
if (!payload.empty()) {
4719
4720
// Emit chunked response header and footer for each chunk
4720
4721
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())) {
4723
4723
ok = false;
4724
4724
return;
4725
4725
}
@@ -4751,7 +4751,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4751
4751
};
4752
4752
4753
4753
while (data_available && !is_shutting_down()) {
4754
- if (!strm.is_writable ()) {
4754
+ if (!strm.wait_writable ()) {
4755
4755
error = Error::Write;
4756
4756
return false;
4757
4757
} else if (!content_provider(offset, 0, data_sink)) {
@@ -6046,6 +6046,10 @@ inline SocketStream::SocketStream(
6046
6046
inline SocketStream::~SocketStream() = default;
6047
6047
6048
6048
inline bool SocketStream::is_readable() const {
6049
+ return read_buff_off_ < read_buff_content_size_;
6050
+ }
6051
+
6052
+ inline bool SocketStream::wait_readable() const {
6049
6053
if (max_timeout_msec_ <= 0) {
6050
6054
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
6051
6055
}
@@ -6058,7 +6062,7 @@ inline bool SocketStream::is_readable() const {
6058
6062
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
6059
6063
}
6060
6064
6061
- inline bool SocketStream::is_writable () const {
6065
+ inline bool SocketStream::wait_writable () const {
6062
6066
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
6063
6067
is_socket_alive(sock_);
6064
6068
}
@@ -6085,7 +6089,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
6085
6089
}
6086
6090
}
6087
6091
6088
- if (!is_readable ()) { return -1; }
6092
+ if (!wait_readable ()) { return -1; }
6089
6093
6090
6094
read_buff_off_ = 0;
6091
6095
read_buff_content_size_ = 0;
@@ -6110,7 +6114,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
6110
6114
}
6111
6115
6112
6116
inline ssize_t SocketStream::write(const char *ptr, size_t size) {
6113
- if (!is_writable ()) { return -1; }
6117
+ if (!wait_writable ()) { return -1; }
6114
6118
6115
6119
#if defined(_WIN32) && !defined(_WIN64)
6116
6120
size =
@@ -6141,7 +6145,9 @@ inline time_t SocketStream::duration() const {
6141
6145
// Buffer stream implementation
6142
6146
inline bool BufferStream::is_readable() const { return true; }
6143
6147
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; }
6145
6151
6146
6152
inline ssize_t BufferStream::read(char *ptr, size_t size) {
6147
6153
#if defined(_MSC_VER) && _MSC_VER < 1910
@@ -9204,6 +9210,10 @@ inline SSLSocketStream::SSLSocketStream(
9204
9210
inline SSLSocketStream::~SSLSocketStream() = default;
9205
9211
9206
9212
inline bool SSLSocketStream::is_readable() const {
9213
+ return SSL_pending(ssl_) > 0;
9214
+ }
9215
+
9216
+ inline bool SSLSocketStream::wait_readable() const {
9207
9217
if (max_timeout_msec_ <= 0) {
9208
9218
return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0;
9209
9219
}
@@ -9216,15 +9226,15 @@ inline bool SSLSocketStream::is_readable() const {
9216
9226
return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0;
9217
9227
}
9218
9228
9219
- inline bool SSLSocketStream::is_writable () const {
9229
+ inline bool SSLSocketStream::wait_writable () const {
9220
9230
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
9221
9231
is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_);
9222
9232
}
9223
9233
9224
9234
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
9225
9235
if (SSL_pending(ssl_) > 0) {
9226
9236
return SSL_read(ssl_, ptr, static_cast<int>(size));
9227
- } else if (is_readable ()) {
9237
+ } else if (wait_readable ()) {
9228
9238
auto ret = SSL_read(ssl_, ptr, static_cast<int>(size));
9229
9239
if (ret < 0) {
9230
9240
auto err = SSL_get_error(ssl_, ret);
@@ -9238,7 +9248,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
9238
9248
#endif
9239
9249
if (SSL_pending(ssl_) > 0) {
9240
9250
return SSL_read(ssl_, ptr, static_cast<int>(size));
9241
- } else if (is_readable ()) {
9251
+ } else if (wait_readable ()) {
9242
9252
std::this_thread::sleep_for(std::chrono::microseconds{10});
9243
9253
ret = SSL_read(ssl_, ptr, static_cast<int>(size));
9244
9254
if (ret >= 0) { return ret; }
@@ -9255,7 +9265,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
9255
9265
}
9256
9266
9257
9267
inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
9258
- if (is_writable ()) {
9268
+ if (wait_writable ()) {
9259
9269
auto handle_size = static_cast<int>(
9260
9270
std::min<size_t>(size, (std::numeric_limits<int>::max)()));
9261
9271
@@ -9270,7 +9280,7 @@ inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
9270
9280
#else
9271
9281
while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
9272
9282
#endif
9273
- if (is_writable ()) {
9283
+ if (wait_writable ()) {
9274
9284
std::this_thread::sleep_for(std::chrono::microseconds{10});
9275
9285
ret = SSL_write(ssl_, ptr, static_cast<int>(handle_size));
9276
9286
if (ret >= 0) { return ret; }
0 commit comments