@@ -195,16 +195,6 @@ using Headers = std::multimap<std::string, std::string, detail::ci>;
195
195
using Params = std::multimap<std::string, std::string>;
196
196
using Match = std::smatch;
197
197
198
- using DataSink = std::function<void (const char *data, size_t data_len)>;
199
-
200
- using Done = std::function<void ()>;
201
-
202
- using ContentProvider =
203
- std::function<void (size_t offset, size_t length, DataSink sink)>;
204
-
205
- using ContentProviderWithCloser =
206
- std::function<void (size_t offset, size_t length, DataSink sink, Done done)>;
207
-
208
198
using Progress = std::function<bool (uint64_t current, uint64_t total)>;
209
199
210
200
struct Response ;
@@ -219,6 +209,20 @@ struct MultipartFormData {
219
209
using MultipartFormDataItems = std::vector<MultipartFormData>;
220
210
using MultipartFormDataMap = std::multimap<std::string, MultipartFormData>;
221
211
212
+ class DataSink {
213
+ public:
214
+ DataSink () = default ;
215
+ DataSink (const DataSink &) = delete ;
216
+ DataSink (const DataSink &&) = delete ;
217
+
218
+ std::function<void (const char *data, size_t data_len)> write;
219
+ std::function<void ()> done;
220
+ // TODO: std::function<bool()> is_alive;
221
+ };
222
+
223
+ using ContentProvider =
224
+ std::function<void (size_t offset, size_t length, DataSink &sink)>;
225
+
222
226
using ContentReceiver =
223
227
std::function<bool (const char *data, size_t data_length)>;
224
228
@@ -310,11 +314,12 @@ struct Response {
310
314
311
315
void set_content_provider (
312
316
size_t length,
313
- std::function<void (size_t offset, size_t length, DataSink sink)> provider,
317
+ std::function<void (size_t offset, size_t length, DataSink &sink)>
318
+ provider,
314
319
std::function<void()> resource_releaser = [] {});
315
320
316
321
void set_chunked_content_provider (
317
- std::function<void (size_t offset, DataSink sink, Done done )> provider,
322
+ std::function<void (size_t offset, DataSink & sink)> provider,
318
323
std::function<void()> resource_releaser = [] {});
319
324
320
325
Response () : status(-1 ), content_length(0 ) {}
@@ -327,7 +332,7 @@ struct Response {
327
332
328
333
// private members...
329
334
size_t content_length;
330
- ContentProviderWithCloser content_provider;
335
+ ContentProvider content_provider;
331
336
std::function<void ()> content_provider_resource_releaser;
332
337
};
333
338
@@ -1876,47 +1881,69 @@ inline int write_headers(Stream &strm, const T &info, const Headers &headers) {
1876
1881
return write_len;
1877
1882
}
1878
1883
1879
- inline ssize_t write_content (Stream &strm,
1880
- ContentProviderWithCloser content_provider,
1884
+ inline ssize_t write_content (Stream &strm, ContentProvider content_provider,
1881
1885
size_t offset, size_t length) {
1882
1886
size_t begin_offset = offset;
1883
1887
size_t end_offset = offset + length;
1884
1888
while (offset < end_offset) {
1885
1889
ssize_t written_length = 0 ;
1886
- content_provider (
1887
- offset, end_offset - offset,
1888
- [&](const char *d, size_t l) {
1889
- offset += l;
1890
- written_length = strm.write (d, l);
1891
- },
1892
- [&](void ) { written_length = -1 ; });
1890
+
1891
+ DataSink data_sink;
1892
+ data_sink.write = [&](const char *d, size_t l) {
1893
+ offset += l;
1894
+ written_length = strm.write (d, l);
1895
+ };
1896
+ data_sink.done = [&](void ) { written_length = -1 ; };
1897
+
1898
+ content_provider (offset, end_offset - offset,
1899
+ // [&](const char *d, size_t l) {
1900
+ // offset += l;
1901
+ // written_length = strm.write(d, l);
1902
+ // },
1903
+ // [&](void) { written_length = -1; }
1904
+ data_sink);
1893
1905
if (written_length < 0 ) { return written_length; }
1894
1906
}
1895
1907
return static_cast <ssize_t >(offset - begin_offset);
1896
1908
}
1897
1909
1898
- inline ssize_t
1899
- write_content_chunked (Stream &strm,
1900
- ContentProviderWithCloser content_provider) {
1910
+ inline ssize_t write_content_chunked (Stream &strm,
1911
+ ContentProvider content_provider) {
1901
1912
size_t offset = 0 ;
1902
1913
auto data_available = true ;
1903
1914
ssize_t total_written_length = 0 ;
1904
1915
while (data_available) {
1905
1916
ssize_t written_length = 0 ;
1917
+
1918
+ DataSink data_sink;
1919
+ data_sink.write = [&](const char *d, size_t l) {
1920
+ data_available = l > 0 ;
1921
+ offset += l;
1922
+
1923
+ // Emit chunked response header and footer for each chunk
1924
+ auto chunk = from_i_to_hex (l) + " \r\n " + std::string (d, l) + " \r\n " ;
1925
+ written_length = strm.write (chunk);
1926
+ };
1927
+ data_sink.done = [&](void ) {
1928
+ data_available = false ;
1929
+ written_length = strm.write (" 0\r\n\r\n " );
1930
+ };
1931
+
1906
1932
content_provider (
1907
1933
offset, 0 ,
1908
- [&](const char *d, size_t l) {
1909
- data_available = l > 0 ;
1910
- offset += l;
1911
-
1912
- // Emit chunked response header and footer for each chunk
1913
- auto chunk = from_i_to_hex (l) + " \r\n " + std::string (d, l) + " \r\n " ;
1914
- written_length = strm.write (chunk);
1915
- },
1916
- [&](void ) {
1917
- data_available = false ;
1918
- written_length = strm.write (" 0\r\n\r\n " );
1919
- });
1934
+ // [&](const char *d, size_t l) {
1935
+ // data_available = l > 0;
1936
+ // offset += l;
1937
+ //
1938
+ // // Emit chunked response header and footer for each chunk
1939
+ // auto chunk = from_i_to_hex(l) + "\r\n" + std::string(d, l) +
1940
+ // "\r\n"; written_length = strm.write(chunk);
1941
+ // },
1942
+ // [&](void) {
1943
+ // data_available = false;
1944
+ // written_length = strm.write("0\r\n\r\n");
1945
+ // }
1946
+ data_sink);
1920
1947
1921
1948
if (written_length < 0 ) { return written_length; }
1922
1949
total_written_length += written_length;
@@ -2652,21 +2679,23 @@ inline void Response::set_content(const std::string &s,
2652
2679
2653
2680
inline void Response::set_content_provider (
2654
2681
size_t length,
2655
- std::function<void (size_t offset, size_t length, DataSink sink)> provider,
2682
+ std::function<void (size_t offset, size_t length, DataSink & sink)> provider,
2656
2683
std::function<void()> resource_releaser) {
2657
2684
assert (length > 0 );
2658
2685
content_length = length;
2659
- content_provider = [provider](size_t offset, size_t length, DataSink sink,
2660
- Done) { provider (offset, length, sink); };
2686
+ content_provider = [provider](size_t offset, size_t length, DataSink &sink) {
2687
+ provider (offset, length, sink);
2688
+ };
2661
2689
content_provider_resource_releaser = resource_releaser;
2662
2690
}
2663
2691
2664
2692
inline void Response::set_chunked_content_provider (
2665
- std::function<void (size_t offset, DataSink sink, Done done )> provider,
2693
+ std::function<void (size_t offset, DataSink & sink)> provider,
2666
2694
std::function<void()> resource_releaser) {
2667
2695
content_length = 0 ;
2668
- content_provider = [provider](size_t offset, size_t , DataSink sink,
2669
- Done done) { provider (offset, sink, done); };
2696
+ content_provider = [provider](size_t offset, size_t , DataSink &sink) {
2697
+ provider (offset, sink);
2698
+ };
2670
2699
content_provider_resource_releaser = resource_releaser;
2671
2700
}
2672
2701
@@ -3731,12 +3760,15 @@ inline bool Client::write_request(Stream &strm, const Request &req,
3731
3760
if (req.content_provider ) {
3732
3761
size_t offset = 0 ;
3733
3762
size_t end_offset = req.content_length ;
3763
+
3764
+ DataSink data_sink;
3765
+ data_sink.write = [&](const char *d, size_t l) {
3766
+ auto written_length = strm.write (d, l);
3767
+ offset += written_length;
3768
+ };
3769
+
3734
3770
while (offset < end_offset) {
3735
- req.content_provider (offset, end_offset - offset,
3736
- [&](const char *d, size_t l) {
3737
- auto written_length = strm.write (d, l);
3738
- offset += written_length;
3739
- });
3771
+ req.content_provider (offset, end_offset - offset, data_sink);
3740
3772
}
3741
3773
}
3742
3774
} else {
@@ -3761,12 +3793,15 @@ inline std::shared_ptr<Response> Client::send_with_content_provider(
3761
3793
if (compress_) {
3762
3794
if (content_provider) {
3763
3795
size_t offset = 0 ;
3796
+
3797
+ DataSink data_sink;
3798
+ data_sink.write = [&](const char *data, size_t data_len) {
3799
+ req.body .append (data, data_len);
3800
+ offset += data_len;
3801
+ };
3802
+
3764
3803
while (offset < content_length) {
3765
- content_provider (offset, content_length - offset,
3766
- [&](const char *data, size_t data_len) {
3767
- req.body .append (data, data_len);
3768
- offset += data_len;
3769
- });
3804
+ content_provider (offset, content_length - offset, data_sink);
3770
3805
}
3771
3806
} else {
3772
3807
req.body = body;
0 commit comments