Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5253bac

Browse files
committed
Merge branch '0.8-devel' ofhttps://github.com/omalashenko/cpp-netlib into omalashenko-0.8-devel
2 parentsa0f2b7e +23cbc8c commit5253bac

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
voidread(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
voidwrap_read_handler(read_callback_function callback, boost::system::error_codeconst & 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)

[8]ページ先頭

©2009-2025 Movatter.jp