@@ -227,6 +227,21 @@ namespace boost { namespace network { namespace http {
227
227
228
228
void read (read_callback_function callback) {
229
229
if (error_encountered) boost::throw_exception (boost::system::system_error (*error_encountered));
230
+ if (new_start != read_buffer_.begin ())
231
+ {
232
+ input_range input = boost::make_iterator_range (new_start, read_buffer_.end ());
233
+ thread_pool ().post (
234
+ boost::bind (
235
+ callback
236
+ , input
237
+ , boost::system::error_code ()
238
+ , std::distance (new_start, data_end)
239
+ , async_connection<Tag,Handler>::shared_from_this ())
240
+ );
241
+ new_start = read_buffer_.begin ();
242
+ return ;
243
+ }
244
+
230
245
socket ().async_read_some (
231
246
asio::buffer (read_buffer_)
232
247
, strand.wrap (
@@ -247,9 +262,13 @@ namespace boost { namespace network { namespace http {
247
262
248
263
void wrap_read_handler (read_callback_function callback, boost::system::error_code const & ec, std::size_t bytes_transferred) {
249
264
if (ec) error_encountered = in_place<boost::system::system_error>(ec);
265
+ buffer_type::const_iterator data_start = read_buffer_.begin ()
266
+ ,data_end = read_buffer_.begin ();
267
+ std::advance (data_end, bytes_transferred);
250
268
thread_pool ().post (
251
269
boost::bind (
252
270
callback
271
+ , boost::make_iterator_range (data_start, data_end)
253
272
, ec
254
273
, bytes_transferred
255
274
, async_connection<Tag,Handler>::shared_from_this ()));
@@ -279,7 +298,7 @@ namespace boost { namespace network { namespace http {
279
298
status_t status;
280
299
request_parser_type parser;
281
300
request request_;
282
- buffer_type::iterator new_start;
301
+ buffer_type::iterator new_start, data_end ;
283
302
string_type partial_parsed;
284
303
optional<boost::system::system_error> error_encountered;
285
304
pending_actions_list pending_actions;
@@ -317,10 +336,12 @@ namespace boost { namespace network { namespace http {
317
336
if (!ec) {
318
337
logic::tribool parsed_ok;
319
338
iterator_range<buffer_type::iterator> result_range, input_range;
339
+ data_end = read_buffer_.begin ();
340
+ std::advance (data_end, bytes_transferred);
320
341
switch (state) {
321
342
case method:
322
343
input_range = boost::make_iterator_range (
323
- new_start, read_buffer_. end () );
344
+ new_start, data_end );
324
345
fusion::tie (parsed_ok, result_range) = parser.parse_until (
325
346
request_parser_type::method_done, input_range);
326
347
if (!parsed_ok) {
@@ -343,7 +364,7 @@ namespace boost { namespace network { namespace http {
343
364
}
344
365
case uri:
345
366
input_range = boost::make_iterator_range (
346
- new_start, read_buffer_. end () );
367
+ new_start, data_end );
347
368
fusion::tie (parsed_ok, result_range) = parser.parse_until (
348
369
request_parser_type::uri_done,
349
370
input_range);
@@ -367,7 +388,7 @@ namespace boost { namespace network { namespace http {
367
388
}
368
389
case version:
369
390
input_range = boost::make_iterator_range (
370
- new_start, read_buffer_. end () );
391
+ new_start, data_end );
371
392
fusion::tie (parsed_ok, result_range) = parser.parse_until (
372
393
request_parser_type::version_done,
373
394
input_range);
@@ -391,7 +412,7 @@ namespace boost { namespace network { namespace http {
391
412
}
392
413
case headers:
393
414
input_range = boost::make_iterator_range (
394
- new_start, read_buffer_. end () );
415
+ new_start, data_end );
395
416
fusion::tie (parsed_ok, result_range) = parser.parse_until (
396
417
request_parser_type::headers_done,
397
418
input_range);
0 commit comments