@@ -751,7 +751,8 @@ class Stream {
751
751
virtual ~Stream () = default ;
752
752
753
753
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;
755
756
756
757
virtual ssize_t read (char *ptr, size_t size) = 0;
757
758
virtual ssize_t write (const char *ptr, size_t size) = 0;
@@ -2466,7 +2467,8 @@ class BufferStream final : public Stream {
2466
2467
~BufferStream () override = default ;
2467
2468
2468
2469
bool is_readable () const override ;
2469
- bool is_writable () const override ;
2470
+ bool wait_readable () const override ;
2471
+ bool wait_writable () const override ;
2470
2472
ssize_t read (char *ptr, size_t size) override ;
2471
2473
ssize_t write (const char *ptr, size_t size) override ;
2472
2474
void get_remote_ip_and_port (std::string &ip, int &port) const override ;
@@ -3380,7 +3382,8 @@ class SocketStream final : public Stream {
3380
3382
~SocketStream () override ;
3381
3383
3382
3384
bool is_readable () const override ;
3383
- bool is_writable () const override ;
3385
+ bool wait_readable () const override ;
3386
+ bool wait_writable () const override ;
3384
3387
ssize_t read (char *ptr, size_t size) override ;
3385
3388
ssize_t write (const char *ptr, size_t size) override ;
3386
3389
void get_remote_ip_and_port (std::string &ip, int &port) const override ;
@@ -3416,7 +3419,8 @@ class SSLSocketStream final : public Stream {
3416
3419
~SSLSocketStream () override ;
3417
3420
3418
3421
bool is_readable () const override ;
3419
- bool is_writable () const override ;
3422
+ bool wait_readable () const override ;
3423
+ bool wait_writable () const override ;
3420
3424
ssize_t read (char *ptr, size_t size) override ;
3421
3425
ssize_t write (const char *ptr, size_t size) override ;
3422
3426
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,
4578
4582
4579
4583
data_sink.write = [&](const char *d, size_t l) -> bool {
4580
4584
if (ok) {
4581
- if (strm. is_writable () && write_data (strm, d, l)) {
4585
+ if (write_data (strm, d, l)) {
4582
4586
offset += l;
4583
4587
} else {
4584
4588
ok = false ;
@@ -4587,10 +4591,10 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
4587
4591
return ok;
4588
4592
};
4589
4593
4590
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4594
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4591
4595
4592
4596
while (offset < end_offset && !is_shutting_down ()) {
4593
- if (!strm.is_writable ()) {
4597
+ if (!strm.wait_writable ()) {
4594
4598
error = Error::Write;
4595
4599
return false ;
4596
4600
} else if (!content_provider (offset, end_offset - offset, data_sink)) {
@@ -4628,17 +4632,17 @@ write_content_without_length(Stream &strm,
4628
4632
data_sink.write = [&](const char *d, size_t l) -> bool {
4629
4633
if (ok) {
4630
4634
offset += l;
4631
- if (!strm. is_writable () || ! write_data (strm, d, l)) { ok = false ; }
4635
+ if (!write_data (strm, d, l)) { ok = false ; }
4632
4636
}
4633
4637
return ok;
4634
4638
};
4635
4639
4636
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4640
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4637
4641
4638
4642
data_sink.done = [&](void ) { data_available = false ; };
4639
4643
4640
4644
while (data_available && !is_shutting_down ()) {
4641
- if (!strm.is_writable ()) {
4645
+ if (!strm.wait_writable ()) {
4642
4646
return false ;
4643
4647
} else if (!content_provider (offset, 0 , data_sink)) {
4644
4648
return false ;
@@ -4673,10 +4677,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4673
4677
// Emit chunked response header and footer for each chunk
4674
4678
auto chunk =
4675
4679
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 ; }
4680
4681
}
4681
4682
} else {
4682
4683
ok = false ;
@@ -4685,7 +4686,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4685
4686
return ok;
4686
4687
};
4687
4688
4688
- data_sink.is_writable = [&]() -> bool { return strm.is_writable (); };
4689
+ data_sink.is_writable = [&]() -> bool { return strm.wait_writable (); };
4689
4690
4690
4691
auto done_with_trailer = [&](const Headers *trailer) {
4691
4692
if (!ok) { return ; }
@@ -4705,8 +4706,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4705
4706
if (!payload.empty ()) {
4706
4707
// Emit chunked response header and footer for each chunk
4707
4708
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 ())) {
4710
4710
ok = false ;
4711
4711
return ;
4712
4712
}
@@ -4738,7 +4738,7 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
4738
4738
};
4739
4739
4740
4740
while (data_available && !is_shutting_down ()) {
4741
- if (!strm.is_writable ()) {
4741
+ if (!strm.wait_writable ()) {
4742
4742
error = Error::Write;
4743
4743
return false ;
4744
4744
} else if (!content_provider (offset, 0 , data_sink)) {
@@ -6029,6 +6029,10 @@ inline SocketStream::SocketStream(
6029
6029
inline SocketStream::~SocketStream () = default ;
6030
6030
6031
6031
inline bool SocketStream::is_readable () const {
6032
+ return read_buff_off_ < read_buff_content_size_;
6033
+ }
6034
+
6035
+ inline bool SocketStream::wait_readable () const {
6032
6036
if (max_timeout_msec_ <= 0 ) {
6033
6037
return select_read (sock_, read_timeout_sec_, read_timeout_usec_) > 0 ;
6034
6038
}
@@ -6041,7 +6045,7 @@ inline bool SocketStream::is_readable() const {
6041
6045
return select_read (sock_, read_timeout_sec, read_timeout_usec) > 0 ;
6042
6046
}
6043
6047
6044
- inline bool SocketStream::is_writable () const {
6048
+ inline bool SocketStream::wait_writable () const {
6045
6049
return select_write (sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
6046
6050
is_socket_alive (sock_);
6047
6051
}
@@ -6068,7 +6072,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
6068
6072
}
6069
6073
}
6070
6074
6071
- if (!is_readable ()) { return -1 ; }
6075
+ if (!wait_readable ()) { return -1 ; }
6072
6076
6073
6077
read_buff_off_ = 0 ;
6074
6078
read_buff_content_size_ = 0 ;
@@ -6093,7 +6097,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) {
6093
6097
}
6094
6098
6095
6099
inline ssize_t SocketStream::write (const char *ptr, size_t size) {
6096
- if (!is_writable ()) { return -1 ; }
6100
+ if (!wait_writable ()) { return -1 ; }
6097
6101
6098
6102
#if defined(_WIN32) && !defined(_WIN64)
6099
6103
size =
@@ -6124,7 +6128,9 @@ inline time_t SocketStream::duration() const {
6124
6128
// Buffer stream implementation
6125
6129
inline bool BufferStream::is_readable () const { return true ; }
6126
6130
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 ; }
6128
6134
6129
6135
inline ssize_t BufferStream::read (char *ptr, size_t size) {
6130
6136
#if defined(_MSC_VER) && _MSC_VER < 1910
@@ -9161,6 +9167,10 @@ inline SSLSocketStream::SSLSocketStream(
9161
9167
inline SSLSocketStream::~SSLSocketStream () = default ;
9162
9168
9163
9169
inline bool SSLSocketStream::is_readable () const {
9170
+ return SSL_pending (ssl_) > 0 ;
9171
+ }
9172
+
9173
+ inline bool SSLSocketStream::wait_readable () const {
9164
9174
if (max_timeout_msec_ <= 0 ) {
9165
9175
return select_read (sock_, read_timeout_sec_, read_timeout_usec_) > 0 ;
9166
9176
}
@@ -9173,15 +9183,15 @@ inline bool SSLSocketStream::is_readable() const {
9173
9183
return select_read (sock_, read_timeout_sec, read_timeout_usec) > 0 ;
9174
9184
}
9175
9185
9176
- inline bool SSLSocketStream::is_writable () const {
9186
+ inline bool SSLSocketStream::wait_writable () const {
9177
9187
return select_write (sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
9178
9188
is_socket_alive (sock_) && !is_ssl_peer_could_be_closed (ssl_, sock_);
9179
9189
}
9180
9190
9181
9191
inline ssize_t SSLSocketStream::read (char *ptr, size_t size) {
9182
9192
if (SSL_pending (ssl_) > 0 ) {
9183
9193
return SSL_read (ssl_, ptr, static_cast <int >(size));
9184
- } else if (is_readable ()) {
9194
+ } else if (wait_readable ()) {
9185
9195
auto ret = SSL_read (ssl_, ptr, static_cast <int >(size));
9186
9196
if (ret < 0 ) {
9187
9197
auto err = SSL_get_error (ssl_, ret);
@@ -9195,7 +9205,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
9195
9205
#endif
9196
9206
if (SSL_pending (ssl_) > 0 ) {
9197
9207
return SSL_read (ssl_, ptr, static_cast <int >(size));
9198
- } else if (is_readable ()) {
9208
+ } else if (wait_readable ()) {
9199
9209
std::this_thread::sleep_for (std::chrono::microseconds{10 });
9200
9210
ret = SSL_read (ssl_, ptr, static_cast <int >(size));
9201
9211
if (ret >= 0 ) { return ret; }
@@ -9212,7 +9222,7 @@ inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
9212
9222
}
9213
9223
9214
9224
inline ssize_t SSLSocketStream::write (const char *ptr, size_t size) {
9215
- if (is_writable ()) {
9225
+ if (wait_writable ()) {
9216
9226
auto handle_size = static_cast <int >(
9217
9227
std::min<size_t >(size, (std::numeric_limits<int >::max)()));
9218
9228
@@ -9227,7 +9237,7 @@ inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
9227
9237
#else
9228
9238
while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
9229
9239
#endif
9230
- if (is_writable ()) {
9240
+ if (wait_writable ()) {
9231
9241
std::this_thread::sleep_for (std::chrono::microseconds{10 });
9232
9242
ret = SSL_write (ssl_, ptr, static_cast <int >(handle_size));
9233
9243
if (ret >= 0 ) { return ret; }
0 commit comments