Skip to content

Commit 30dac6f

Browse files
committed
Merge branch '0.9-devel' of https://github.com/omalashenko/cpp-netlib into omalashenko-0.9-devel
2 parents 1013faa + 02d6e81 commit 30dac6f

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

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

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,21 @@ namespace boost { namespace network { namespace http {
227227

228228
void read(read_callback_function callback) {
229229
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+
boost::bind(
235+
callback
236+
, input
237+
, boost::system::error_code()
238+
, std::distance(new_start, data_end)
239+
, async_connection<Tag,Handler>::shared_from_this())
240+
);
241+
new_start = read_buffer_.begin();
242+
return;
243+
}
244+
230245
socket().async_read_some(
231246
asio::buffer(read_buffer_)
232247
, strand.wrap(
@@ -247,9 +262,13 @@ namespace boost { namespace network { namespace http {
247262

248263
void wrap_read_handler(read_callback_function callback, boost::system::error_code const & ec, std::size_t bytes_transferred) {
249264
if (ec) error_encountered = in_place<boost::system::system_error>(ec);
265+
buffer_type::const_iterator data_start = read_buffer_.begin()
266+
,data_end = read_buffer_.begin();
267+
std::advance(data_end, bytes_transferred);
250268
thread_pool().post(
251269
boost::bind(
252270
callback
271+
, boost::make_iterator_range(data_start, data_end)
253272
, ec
254273
, bytes_transferred
255274
, async_connection<Tag,Handler>::shared_from_this()));
@@ -279,7 +298,7 @@ namespace boost { namespace network { namespace http {
279298
status_t status;
280299
request_parser_type parser;
281300
request request_;
282-
buffer_type::iterator new_start;
301+
buffer_type::iterator new_start, data_end;
283302
string_type partial_parsed;
284303
optional<boost::system::system_error> error_encountered;
285304
pending_actions_list pending_actions;
@@ -317,10 +336,12 @@ namespace boost { namespace network { namespace http {
317336
if (!ec) {
318337
logic::tribool parsed_ok;
319338
iterator_range<buffer_type::iterator> result_range, input_range;
339+
data_end = read_buffer_.begin();
340+
std::advance(data_end, bytes_transferred);
320341
switch (state) {
321342
case method:
322343
input_range = boost::make_iterator_range(
323-
new_start, read_buffer_.end());
344+
new_start, data_end);
324345
fusion::tie(parsed_ok, result_range) = parser.parse_until(
325346
request_parser_type::method_done, input_range);
326347
if (!parsed_ok) {
@@ -343,7 +364,7 @@ namespace boost { namespace network { namespace http {
343364
}
344365
case uri:
345366
input_range = boost::make_iterator_range(
346-
new_start, read_buffer_.end());
367+
new_start, data_end);
347368
fusion::tie(parsed_ok, result_range) = parser.parse_until(
348369
request_parser_type::uri_done,
349370
input_range);
@@ -367,7 +388,7 @@ namespace boost { namespace network { namespace http {
367388
}
368389
case version:
369390
input_range = boost::make_iterator_range(
370-
new_start, read_buffer_.end());
391+
new_start, data_end);
371392
fusion::tie(parsed_ok, result_range) = parser.parse_until(
372393
request_parser_type::version_done,
373394
input_range);
@@ -391,7 +412,7 @@ namespace boost { namespace network { namespace http {
391412
}
392413
case headers:
393414
input_range = boost::make_iterator_range(
394-
new_start, read_buffer_.end());
415+
new_start, data_end);
395416
fusion::tie(parsed_ok, result_range) = parser.parse_until(
396417
request_parser_type::headers_done,
397418
input_range);

0 commit comments

Comments
 (0)