@@ -340,7 +340,6 @@ class DataSink {
340
340
341
341
std::function<bool (const char *data, size_t data_len)> write;
342
342
std::function<void ()> done;
343
- std::function<bool ()> is_writable;
344
343
std::ostream os;
345
344
346
345
private:
@@ -3632,7 +3631,7 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
3632
3631
3633
3632
data_sink.write = [&](const char *d, size_t l) -> bool {
3634
3633
if (ok) {
3635
- if (write_data (strm, d, l)) {
3634
+ if (strm. is_writable () && write_data (strm, d, l)) {
3636
3635
offset += l;
3637
3636
} else {
3638
3637
ok = false ;
@@ -3641,14 +3640,14 @@ inline bool write_content(Stream &strm, const ContentProvider &content_provider,
3641
3640
return ok;
3642
3641
};
3643
3642
3644
- data_sink.is_writable = [&](void ) { return ok && strm.is_writable (); };
3645
-
3646
3643
while (offset < end_offset && !is_shutting_down ()) {
3647
- if (!content_provider (offset, end_offset - offset, data_sink)) {
3644
+ if (!strm.is_writable ()) {
3645
+ error = Error::Write;
3646
+ return false ;
3647
+ } else if (!content_provider (offset, end_offset - offset, data_sink)) {
3648
3648
error = Error::Canceled;
3649
3649
return false ;
3650
- }
3651
- if (!ok) {
3650
+ } else if (!ok) {
3652
3651
error = Error::Write;
3653
3652
return false ;
3654
3653
}
@@ -3680,18 +3679,21 @@ write_content_without_length(Stream &strm,
3680
3679
data_sink.write = [&](const char *d, size_t l) -> bool {
3681
3680
if (ok) {
3682
3681
offset += l;
3683
- if (!write_data (strm, d, l)) { ok = false ; }
3682
+ if (!strm. is_writable () || ! write_data (strm, d, l)) { ok = false ; }
3684
3683
}
3685
3684
return ok;
3686
3685
};
3687
3686
3688
3687
data_sink.done = [&](void ) { data_available = false ; };
3689
3688
3690
- data_sink.is_writable = [&](void ) { return ok && strm.is_writable (); };
3691
-
3692
3689
while (data_available && !is_shutting_down ()) {
3693
- if (!content_provider (offset, 0 , data_sink)) { return false ; }
3694
- if (!ok) { return false ; }
3690
+ if (!strm.is_writable ()) {
3691
+ return false ;
3692
+ } else if (!content_provider (offset, 0 , data_sink)) {
3693
+ return false ;
3694
+ } else if (!ok) {
3695
+ return false ;
3696
+ }
3695
3697
}
3696
3698
return true ;
3697
3699
}
@@ -3720,7 +3722,10 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
3720
3722
// Emit chunked response header and footer for each chunk
3721
3723
auto chunk =
3722
3724
from_i_to_hex (payload.size ()) + " \r\n " + payload + " \r\n " ;
3723
- if (!write_data (strm, chunk.data (), chunk.size ())) { ok = false ; }
3725
+ if (!strm.is_writable () ||
3726
+ !write_data (strm, chunk.data (), chunk.size ())) {
3727
+ ok = false ;
3728
+ }
3724
3729
}
3725
3730
} else {
3726
3731
ok = false ;
@@ -3759,14 +3764,14 @@ write_content_chunked(Stream &strm, const ContentProvider &content_provider,
3759
3764
}
3760
3765
};
3761
3766
3762
- data_sink.is_writable = [&](void ) { return ok && strm.is_writable (); };
3763
-
3764
3767
while (data_available && !is_shutting_down ()) {
3765
- if (!content_provider (offset, 0 , data_sink)) {
3768
+ if (!strm.is_writable ()) {
3769
+ error = Error::Write;
3770
+ return false ;
3771
+ } else if (!content_provider (offset, 0 , data_sink)) {
3766
3772
error = Error::Canceled;
3767
3773
return false ;
3768
- }
3769
- if (!ok) {
3774
+ } else if (!ok) {
3770
3775
error = Error::Write;
3771
3776
return false ;
3772
3777
}
@@ -6544,8 +6549,6 @@ inline std::unique_ptr<Response> ClientImpl::send_with_content_provider(
6544
6549
return ok;
6545
6550
};
6546
6551
6547
- data_sink.is_writable = [&](void ) { return ok && true ; };
6548
-
6549
6552
while (ok && offset < content_length) {
6550
6553
if (!content_provider (offset, content_length - offset, data_sink)) {
6551
6554
error = Error::Canceled;
@@ -6717,7 +6720,6 @@ inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider(
6717
6720
bool has_data = true ;
6718
6721
cur_sink.write = sink.write ;
6719
6722
cur_sink.done = [&]() { has_data = false ; };
6720
- cur_sink.is_writable = sink.is_writable ;
6721
6723
6722
6724
if (!provider_items[cur_item].provider (offset - cur_start, cur_sink))
6723
6725
return false ;
0 commit comments