Skip to content

Commit 5253bac

Browse files
committed
Merge branch '0.8-devel' of https://github.com/omalashenko/cpp-netlib into omalashenko-0.8-devel
2 parents a0f2b7e + 23cbc8c commit 5253bac

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

boost/network/protocol/http/server/async_connection.hpp

+29-7
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,21 @@ namespace boost { namespace network { namespace http {
225225

226226
void read(read_callback_function callback) {
227227
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+
228243
socket().async_read_some(
229244
asio::buffer(read_buffer_)
230245
, strand.wrap(
@@ -245,9 +260,13 @@ namespace boost { namespace network { namespace http {
245260

246261
void wrap_read_handler(read_callback_function callback, boost::system::error_code const & ec, std::size_t bytes_transferred) {
247262
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);
248266
thread_pool().post(
249267
boost::bind(
250268
callback
269+
, boost::make_iterator_range(data_start, data_end)
251270
, ec
252271
, bytes_transferred
253272
, async_connection<Tag,Handler>::shared_from_this()));
@@ -277,7 +296,7 @@ namespace boost { namespace network { namespace http {
277296
status_t status;
278297
request_parser_type parser;
279298
request request_;
280-
buffer_type::iterator new_start;
299+
buffer_type::iterator new_start, data_end;
281300
string_type partial_parsed;
282301
optional<boost::system::system_error> error_encountered;
283302
pending_actions_list pending_actions;
@@ -315,10 +334,12 @@ namespace boost { namespace network { namespace http {
315334
if (!ec) {
316335
logic::tribool parsed_ok;
317336
iterator_range<buffer_type::iterator> result_range, input_range;
337+
data_end = read_buffer_.begin();
338+
std::advance(data_end, bytes_transferred);
318339
switch (state) {
319340
case method:
320341
input_range = boost::make_iterator_range(
321-
new_start, read_buffer_.end());
342+
new_start, data_end);
322343
fusion::tie(parsed_ok, result_range) = parser.parse_until(
323344
request_parser_type::method_done, input_range);
324345
if (!parsed_ok) {
@@ -341,7 +362,7 @@ namespace boost { namespace network { namespace http {
341362
}
342363
case uri:
343364
input_range = boost::make_iterator_range(
344-
new_start, read_buffer_.end());
365+
new_start, data_end);
345366
fusion::tie(parsed_ok, result_range) = parser.parse_until(
346367
request_parser_type::uri_done,
347368
input_range);
@@ -365,7 +386,7 @@ namespace boost { namespace network { namespace http {
365386
}
366387
case version:
367388
input_range = boost::make_iterator_range(
368-
new_start, read_buffer_.end());
389+
new_start, data_end);
369390
fusion::tie(parsed_ok, result_range) = parser.parse_until(
370391
request_parser_type::version_done,
371392
input_range);
@@ -388,6 +409,7 @@ namespace boost { namespace network { namespace http {
388409
request_.http_version_major = fusion::get<0>(version_pair);
389410
request_.http_version_minor = fusion::get<1>(version_pair);
390411
new_start = boost::end(result_range);
412+
partial_parsed.clear();
391413
} else {
392414
partial_parsed.append(
393415
boost::begin(result_range),
@@ -398,7 +420,7 @@ namespace boost { namespace network { namespace http {
398420
}
399421
case headers:
400422
input_range = boost::make_iterator_range(
401-
new_start, read_buffer_.end());
423+
new_start, data_end);
402424
fusion::tie(parsed_ok, result_range) = parser.parse_until(
403425
request_parser_type::headers_done,
404426
input_range);
@@ -409,7 +431,6 @@ namespace boost { namespace network { namespace http {
409431
partial_parsed.append(
410432
boost::begin(result_range),
411433
boost::end(result_range));
412-
trim(partial_parsed);
413434
parse_headers(partial_parsed, request_.headers);
414435
new_start = boost::end(result_range);
415436
thread_pool().post(
@@ -479,9 +500,10 @@ namespace boost { namespace network { namespace http {
479500
*(
480501
+(alnum|(punct-':'))
481502
>> lit(": ")
482-
>> +(alnum|space|punct)
503+
>> +((alnum|space|punct) - '\r' - '\n')
483504
>> lit("\r\n")
484505
)
506+
>> lit("\r\n")
485507
, container
486508
);
487509
}

0 commit comments

Comments
 (0)