]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp03/http/server3/connection.cpp
5 // Copyright (c) 2003-2016 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_service
& io_service
,
20 request_handler
& handler
)
21 : strand_(io_service
),
23 request_handler_(handler
)
27 boost::asio::ip::tcp::socket
& connection::socket()
32 void connection::start()
34 socket_
.async_read_some(boost::asio::buffer(buffer_
),
36 boost::bind(&connection::handle_read
, shared_from_this(),
37 boost::asio::placeholders::error
,
38 boost::asio::placeholders::bytes_transferred
)));
41 void connection::handle_read(const boost::system::error_code
& e
,
42 std::size_t bytes_transferred
)
46 boost::tribool result
;
47 boost::tie(result
, boost::tuples::ignore
) = request_parser_
.parse(
48 request_
, buffer_
.data(), buffer_
.data() + bytes_transferred
);
52 request_handler_
.handle_request(request_
, reply_
);
53 boost::asio::async_write(socket_
, reply_
.to_buffers(),
55 boost::bind(&connection::handle_write
, shared_from_this(),
56 boost::asio::placeholders::error
)));
60 reply_
= reply::stock_reply(reply::bad_request
);
61 boost::asio::async_write(socket_
, reply_
.to_buffers(),
63 boost::bind(&connection::handle_write
, shared_from_this(),
64 boost::asio::placeholders::error
)));
68 socket_
.async_read_some(boost::asio::buffer(buffer_
),
70 boost::bind(&connection::handle_read
, shared_from_this(),
71 boost::asio::placeholders::error
,
72 boost::asio::placeholders::bytes_transferred
)));
76 // If an error occurs then no new asynchronous operations are started. This
77 // means that all shared_ptr references to the connection object will
78 // disappear and the object will be destroyed automatically after this
79 // handler returns. The connection class's destructor closes the socket.
82 void connection::handle_write(const boost::system::error_code
& e
)
86 // Initiate graceful connection closure.
87 boost::system::error_code ignored_ec
;
88 socket_
.shutdown(boost::asio::ip::tcp::socket::shutdown_both
, ignored_ec
);
91 // No new asynchronous operations are started. This means that all shared_ptr
92 // references to the connection object will disappear and the object will be
93 // destroyed automatically after this handler returns. The connection class's
94 // destructor closes the socket.
97 } // namespace server3