@@ -225,6 +225,21 @@ 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
+ boost::bind (
233
+ callback
234
+ , input
235
+ , boost::system::error_code ()
236
+ , std::distance (new_start, data_end)
237
+ , async_connection<Tag,Handler>::shared_from_this ())
238
+ );
239
+ new_start = read_buffer_.begin ();
240
+ return ;
241
+ }
242
+
228
243
socket ().async_read_some (
229
244
asio::buffer (read_buffer_)
230
245
, strand.wrap (
@@ -245,9 +260,13 @@ namespace boost { namespace network { namespace http {
245
260
246
261
void wrap_read_handler (read_callback_function callback, boost::system::error_code const & ec, std::size_t bytes_transferred) {
247
262
if (ec) error_encountered = in_place<boost::system ::system_error>(ec);
263
+ buffer_type::const_iterator data_start = read_buffer_.begin ()
264
+ ,data_end = read_buffer_.begin ();
265
+ std::advance (data_end, bytes_transferred);
248
266
thread_pool ().post (
249
267
boost::bind (
250
268
callback
269
+ , boost::make_iterator_range (data_start, data_end)
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,12 @@ 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 = read_buffer_.begin ();
338
+ std::advance (data_end, bytes_transferred);
318
339
switch (state) {
319
340
case method:
320
341
input_range = boost::make_iterator_range (
321
- new_start, read_buffer_. end () );
342
+ new_start, data_end );
322
343
fusion::tie (parsed_ok, result_range) = parser.parse_until (
323
344
request_parser_type::method_done, input_range);
324
345
if (!parsed_ok) {
@@ -341,7 +362,7 @@ namespace boost { namespace network { namespace http {
341
362
}
342
363
case uri:
343
364
input_range = boost::make_iterator_range (
344
- new_start, read_buffer_. end () );
365
+ new_start, data_end );
345
366
fusion::tie (parsed_ok, result_range) = parser.parse_until (
346
367
request_parser_type::uri_done,
347
368
input_range);
@@ -365,7 +386,7 @@ namespace boost { namespace network { namespace http {
365
386
}
366
387
case version:
367
388
input_range = boost::make_iterator_range (
368
- new_start, read_buffer_. end () );
389
+ new_start, data_end );
369
390
fusion::tie (parsed_ok, result_range) = parser.parse_until (
370
391
request_parser_type::version_done,
371
392
input_range);
@@ -388,6 +409,7 @@ namespace boost { namespace network { namespace http {
388
409
request_.http_version_major = fusion::get<0 >(version_pair);
389
410
request_.http_version_minor = fusion::get<1 >(version_pair);
390
411
new_start = boost::end (result_range);
412
+ partial_parsed.clear ();
391
413
} else {
392
414
partial_parsed.append (
393
415
boost::begin (result_range),
@@ -398,7 +420,7 @@ namespace boost { namespace network { namespace http {
398
420
}
399
421
case headers:
400
422
input_range = boost::make_iterator_range (
401
- new_start, read_buffer_. end () );
423
+ new_start, data_end );
402
424
fusion::tie (parsed_ok, result_range) = parser.parse_until (
403
425
request_parser_type::headers_done,
404
426
input_range);
@@ -409,7 +431,6 @@ namespace boost { namespace network { namespace http {
409
431
partial_parsed.append (
410
432
boost::begin (result_range),
411
433
boost::end (result_range));
412
- trim (partial_parsed);
413
434
parse_headers (partial_parsed, request_.headers );
414
435
new_start = boost::end (result_range);
415
436
thread_pool ().post (
@@ -479,9 +500,10 @@ namespace boost { namespace network { namespace http {
479
500
*(
480
501
+(alnum|(punct-' :' ))
481
502
>> lit (" : " )
482
- >> +(alnum|space|punct)
503
+ >> +(( alnum|space|punct) - ' \r ' - ' \n ' )
483
504
>> lit (" \r\n " )
484
505
)
506
+ >> lit (" \r\n " )
485
507
, container
486
508
);
487
509
}
0 commit comments