@@ -34,16 +34,22 @@ struct request_context {
34
34
boost::asio::streambuf request_buffer_;
35
35
boost::asio::streambuf response_buffer_;
36
36
37
+ // TODO configure chunked transfer encoding
38
+ bool chunked_;
39
+
37
40
// TODO configure deadline timer for timeouts
41
+ bool timedout_;
38
42
39
43
std::uint64_t total_bytes_written_, total_bytes_read_;
40
44
41
45
request_context (std::shared_ptr<client_connection::async_connection> connection,
42
- request request,
43
- request_options options)
46
+ request request,
47
+ request_options options)
44
48
: connection_(connection)
45
49
, request_(request)
46
50
, options_(options)
51
+ , chunked_(false )
52
+ , timedout_(false )
47
53
, total_bytes_written_(0 )
48
54
, total_bytes_read_(0 ) { }
49
55
@@ -57,7 +63,7 @@ struct client::impl {
57
63
std::unique_ptr<client_connection::async_connection> mock_connection,
58
64
client_options options);
59
65
60
- ~impl () noexcept ;
66
+ ~impl ();
61
67
62
68
std::future<response> execute (std::shared_ptr<request_context> context);
63
69
@@ -68,6 +74,10 @@ struct client::impl {
68
74
void write_request (const boost::system::error_code &ec,
69
75
std::shared_ptr<request_context> context);
70
76
77
+ void write_body (const boost::system::error_code &ec,
78
+ std::size_t bytes_written,
79
+ std::shared_ptr<request_context> context);
80
+
71
81
void read_response (const boost::system::error_code &ec,
72
82
std::size_t bytes_written,
73
83
std::shared_ptr<request_context> context);
@@ -117,7 +127,7 @@ client::impl::impl(std::unique_ptr<client_connection::async_resolver> mock_resol
117
127
118
128
}
119
129
120
- client::impl::~impl () noexcept {
130
+ client::impl::~impl () {
121
131
sentinel_.reset ();
122
132
lifetime_thread_.join ();
123
133
}
@@ -186,14 +196,37 @@ void client::impl::write_request(const boost::system::error_code &ec,
186
196
context->response_promise_ .set_exception (std::make_exception_ptr (client_exception (client_error::invalid_request)));
187
197
}
188
198
199
+ context->connection_ ->async_write (context->request_buffer_ ,
200
+ strand_.wrap ([=] (const boost::system::error_code &ec,
201
+ std::size_t bytes_written) {
202
+ write_body (ec, bytes_written, context);
203
+ }));
204
+ }
205
+
206
+ void client::impl::write_body (const boost::system::error_code &ec,
207
+ std::size_t bytes_written,
208
+ std::shared_ptr<request_context> context) {
209
+ if (ec) {
210
+ context->response_promise_ .set_exception (std::make_exception_ptr (std::system_error (ec.value (), std::system_category ())));
211
+ return ;
212
+ }
213
+
214
+ context->total_bytes_written_ += bytes_written;
215
+ if (auto progress = context->options_ .progress ()) {
216
+ progress (client_message::transfer_direction::bytes_written, context->total_bytes_written_ );
217
+ }
218
+
219
+ std::ostream request_stream (&context->request_buffer_ );
189
220
// TODO write payload to request_buffer_
221
+ if (!request_stream) {
222
+ context->response_promise_ .set_exception (std::make_exception_ptr (client_exception (client_error::invalid_request)));
223
+ }
190
224
191
225
context->connection_ ->async_write (context->request_buffer_ ,
192
- strand_.wrap ([=] (const boost::system::error_code &ec,
193
- std::size_t bytes_written) {
194
- // TODO write chunked or write body
195
- read_response (ec, bytes_written, context);
196
- }));
226
+ strand_.wrap ([=] (const boost::system::error_code &ec,
227
+ std::size_t bytes_written) {
228
+ read_response (ec, bytes_written, context);
229
+ }));
197
230
}
198
231
199
232
void client::impl::read_response (const boost::system::error_code &ec,
@@ -335,7 +368,7 @@ client::client(std::unique_ptr<client_connection::async_resolver> mock_resolver,
335
368
336
369
}
337
370
338
- client::~client () noexcept {
371
+ client::~client () {
339
372
delete pimpl_;
340
373
}
341
374
0 commit comments