@@ -227,6 +227,23 @@ 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
+ strand.wrap (
235
+ boost::bind (
236
+ callback
237
+ , input
238
+ , boost::system::error_code ()
239
+ , data_end - new_start
240
+ , async_connection<Tag,Handler>::shared_from_this ())
241
+ )
242
+ );
243
+ new_start = read_buffer_.begin ();
244
+ return ;
245
+ }
246
+
230
247
socket ().async_read_some (
231
248
asio::buffer (read_buffer_)
232
249
, strand.wrap (
@@ -250,6 +267,8 @@ namespace boost { namespace network { namespace http {
250
267
thread_pool ().post (
251
268
boost::bind (
252
269
callback
270
+ , boost::make_iterator_range (read_buffer_.begin ()
271
+ ,read_buffer_.begin () + bytes_transferred)
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,11 @@ 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 = new_start + bytes_transferred;
320
340
switch (state) {
321
341
case method:
322
342
input_range = boost::make_iterator_range (
323
- new_start, read_buffer_. end () );
343
+ new_start, data_end );
324
344
fusion::tie (parsed_ok, result_range) = parser.parse_until (
325
345
request_parser_type::method_done, input_range);
326
346
if (!parsed_ok) {
@@ -343,7 +363,7 @@ namespace boost { namespace network { namespace http {
343
363
}
344
364
case uri:
345
365
input_range = boost::make_iterator_range (
346
- new_start, read_buffer_. end () );
366
+ new_start, data_end );
347
367
fusion::tie (parsed_ok, result_range) = parser.parse_until (
348
368
request_parser_type::uri_done,
349
369
input_range);
@@ -367,7 +387,7 @@ namespace boost { namespace network { namespace http {
367
387
}
368
388
case version:
369
389
input_range = boost::make_iterator_range (
370
- new_start, read_buffer_. end () );
390
+ new_start, data_end );
371
391
fusion::tie (parsed_ok, result_range) = parser.parse_until (
372
392
request_parser_type::version_done,
373
393
input_range);
@@ -391,7 +411,7 @@ namespace boost { namespace network { namespace http {
391
411
}
392
412
case headers:
393
413
input_range = boost::make_iterator_range (
394
- new_start, read_buffer_. end () );
414
+ new_start, data_end );
395
415
fusion::tie (parsed_ok, result_range) = parser.parse_until (
396
416
request_parser_type::headers_done,
397
417
input_range);
0 commit comments