@@ -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(
60466046inline SocketStream::~SocketStream () = default ;
60476047
60486048inline 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
61126116inline 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
61426146inline 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
61466152inline ssize_t BufferStream::read (char *ptr, size_t size) {
61476153#if defined(_MSC_VER) && _MSC_VER < 1910
@@ -9204,6 +9210,10 @@ inline SSLSocketStream::SSLSocketStream(
92049210inline SSLSocketStream::~SSLSocketStream () = default ;
92059211
92069212inline 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
92249234inline 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
92579267inline 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; }
0 commit comments