]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp03/http/server2/connection.cpp
5 // Copyright (c) 2003-2019 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"
13 #include <boost/bind.hpp>
14 #include "request_handler.hpp"
19 connection::connection(boost::asio::io_context
& io_context
,
20 request_handler
& handler
)
21 : socket_(io_context
),
22 request_handler_(handler
)
26 boost::asio::ip::tcp::socket
& connection::socket()
31 void connection::start()
33 socket_
.async_read_some(boost::asio::buffer(buffer_
),
34 boost::bind(&connection::handle_read
, shared_from_this(),
35 boost::asio::placeholders::error
,
36 boost::asio::placeholders::bytes_transferred
));
39 void connection::handle_read(const boost::system::error_code
& e
,
40 std::size_t bytes_transferred
)
44 boost::tribool result
;
45 boost::tie(result
, boost::tuples::ignore
) = request_parser_
.parse(
46 request_
, buffer_
.data(), buffer_
.data() + bytes_transferred
);
50 request_handler_
.handle_request(request_
, reply_
);
51 boost::asio::async_write(socket_
, reply_
.to_buffers(),
52 boost::bind(&connection::handle_write
, shared_from_this(),
53 boost::asio::placeholders::error
));
57 reply_
= reply::stock_reply(reply::bad_request
);
58 boost::asio::async_write(socket_
, reply_
.to_buffers(),
59 boost::bind(&connection::handle_write
, shared_from_this(),
60 boost::asio::placeholders::error
));
64 socket_
.async_read_some(boost::asio::buffer(buffer_
),
65 boost::bind(&connection::handle_read
, shared_from_this(),
66 boost::asio::placeholders::error
,
67 boost::asio::placeholders::bytes_transferred
));
71 // If an error occurs then no new asynchronous operations are started. This
72 // means that all shared_ptr references to the connection object will
73 // disappear and the object will be destroyed automatically after this
74 // handler returns. The connection class's destructor closes the socket.
77 void connection::handle_write(const boost::system::error_code
& e
)
81 // Initiate graceful connection closure.
82 boost::system::error_code ignored_ec
;
83 socket_
.shutdown(boost::asio::ip::tcp::socket::shutdown_both
, ignored_ec
);
86 // No new asynchronous operations are started. This means that all shared_ptr
87 // references to the connection object will disappear and the object will be
88 // destroyed automatically after this handler returns. The connection class's
89 // destructor closes the socket.
92 } // namespace server2