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

Lines changed: 29 additions & 7 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy