@@ -225,6 +225,23 @@ namespace boost { namespace network { namespace http {
225
225
226
226
void read (read_callback_function callback) {
227
227
if (error_encountered) boost::throw_exception (boost::system::system_error (*error_encountered));
228
+ if (new_start != read_buffer_.begin ())
229
+ {
230
+ input_range input = boost::make_iterator_range (new_start, read_buffer_.end ());
231
+ thread_pool ().post (
232
+ strand.wrap (
233
+ boost::bind (
234
+ callback
235
+ , input
236
+ , boost::system::error_code ()
237
+ , data_end - new_start
238
+ , async_connection<Tag,Handler>::shared_from_this ())
239
+ )
240
+ );
241
+ new_start = read_buffer_.begin ();
242
+ return ;
243
+ }
244
+
228
245
socket ().async_read_some (
229
246
asio::buffer (read_buffer_)
230
247
, strand.wrap (
@@ -248,6 +265,8 @@ namespace boost { namespace network { namespace http {
248
265
thread_pool ().post (
249
266
boost::bind (
250
267
callback
268
+ , boost::make_iterator_range (read_buffer_.begin ()
269
+ ,read_buffer_.begin () + bytes_transferred)
251
270
, ec
252
271
, bytes_transferred
253
272
, async_connection<Tag,Handler>::shared_from_this ()));
@@ -277,7 +296,7 @@ namespace boost { namespace network { namespace http {
277
296
status_t status;
278
297
request_parser_type parser;
279
298
request request_;
280
- buffer_type::iterator new_start;
299
+ buffer_type::iterator new_start, data_end ;
281
300
string_type partial_parsed;
282
301
optional<boost::system::system_error> error_encountered;
283
302
pending_actions_list pending_actions;
@@ -315,10 +334,11 @@ namespace boost { namespace network { namespace http {
315
334
if (!ec) {
316
335
logic::tribool parsed_ok;
317
336
iterator_range<buffer_type::iterator> result_range, input_range;
337
+ data_end = new_start + bytes_transferred;
318
338
switch (state) {
319
339
case method:
320
340
input_range = boost::make_iterator_range (
321
- new_start, read_buffer_. end () );
341
+ new_start, data_end );
322
342
fusion::tie (parsed_ok, result_range) = parser.parse_until (
323
343
request_parser_type::method_done, input_range);
324
344
if (!parsed_ok) {
@@ -341,7 +361,7 @@ namespace boost { namespace network { namespace http {
341
361
}
342
362
case uri:
343
363
input_range = boost::make_iterator_range (
344
- new_start, read_buffer_. end () );
364
+ new_start, data_end );
345
365
fusion::tie (parsed_ok, result_range) = parser.parse_until (
346
366
request_parser_type::uri_done,
347
367
input_range);
@@ -365,7 +385,7 @@ namespace boost { namespace network { namespace http {
365
385
}
366
386
case version:
367
387
input_range = boost::make_iterator_range (
368
- new_start, read_buffer_. end () );
388
+ new_start, data_end );
369
389
fusion::tie (parsed_ok, result_range) = parser.parse_until (
370
390
request_parser_type::version_done,
371
391
input_range);
@@ -399,7 +419,7 @@ namespace boost { namespace network { namespace http {
399
419
}
400
420
case headers:
401
421
input_range = boost::make_iterator_range (
402
- new_start, read_buffer_. end () );
422
+ new_start, data_end );
403
423
fusion::tie (parsed_ok, result_range) = parser.parse_until (
404
424
request_parser_type::headers_done,
405
425
input_range);
0 commit comments