]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp11/http/server/connection.cpp
5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #include "connection.hpp"
14 #include "connection_manager.hpp"
15 #include "request_handler.hpp"
20 connection::connection(boost::asio::ip::tcp::socket socket
,
21 connection_manager
& manager
, request_handler
& handler
)
22 : socket_(std::move(socket
)),
23 connection_manager_(manager
),
24 request_handler_(handler
)
28 void connection::start()
33 void connection::stop()
38 void connection::do_read()
40 auto self(shared_from_this());
41 socket_
.async_read_some(boost::asio::buffer(buffer_
),
42 [this, self
](boost::system::error_code ec
, std::size_t bytes_transferred
)
46 request_parser::result_type result
;
47 std::tie(result
, std::ignore
) = request_parser_
.parse(
48 request_
, buffer_
.data(), buffer_
.data() + bytes_transferred
);
50 if (result
== request_parser::good
)
52 request_handler_
.handle_request(request_
, reply_
);
55 else if (result
== request_parser::bad
)
57 reply_
= reply::stock_reply(reply::bad_request
);
65 else if (ec
!= boost::asio::error::operation_aborted
)
67 connection_manager_
.stop(shared_from_this());
72 void connection::do_write()
74 auto self(shared_from_this());
75 boost::asio::async_write(socket_
, reply_
.to_buffers(),
76 [this, self
](boost::system::error_code ec
, std::size_t)
80 // Initiate graceful connection closure.
81 boost::system::error_code ignored_ec
;
82 socket_
.shutdown(boost::asio::ip::tcp::socket::shutdown_both
,
86 if (ec
!= boost::asio::error::operation_aborted
)
88 connection_manager_
.stop(shared_from_this());