blob: 107af143e2aa5af1e5bd03c59a23285454c63021 [file] [log] [blame]
Alexander Afanasyevfa2f6622016-12-25 12:28:00 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2013-2016, Regents of the University of California.
4 *
5 * This file is part of ChronoShare, a decentralized file sharing application over NDN.
6 *
7 * ChronoShare is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * ChronoShare is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License along with
16 * ChronoShare, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ChronoShare authors and contributors.
19 */
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080020//
21// connection.hpp
22// ~~~~~~~~~~~~~~
23//
24// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com)
25//
26// Distributed under the Boost Software License, Version 1.0. (See accompanying
27// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
28//
29
30#ifndef HTTP_CONNECTION_HPP
31#define HTTP_CONNECTION_HPP
32
33#include <boost/asio.hpp>
34#include <boost/array.hpp>
35#include <boost/noncopyable.hpp>
36#include <boost/shared_ptr.hpp>
37#include <boost/enable_shared_from_this.hpp>
38#include "reply.hpp"
39#include "request.hpp"
40#include "request_handler.hpp"
41#include "request_parser.hpp"
42
43namespace http {
44namespace server {
45
46class connection_manager;
47
48/// Represents a single connection from a client.
49class connection
50 : public boost::enable_shared_from_this<connection>,
51 private boost::noncopyable
52{
53public:
54 /// Construct a connection with the given io_service.
55 explicit connection(boost::asio::io_service& io_service,
56 connection_manager& manager, request_handler& handler);
57
58 /// Get the socket associated with the connection.
59 boost::asio::ip::tcp::socket& socket();
60
61 /// Start the first asynchronous operation for the connection.
62 void start();
63
64 /// Stop all asynchronous operations associated with the connection.
65 void stop();
66
67private:
68 /// Handle completion of a read operation.
69 void handle_read(const boost::system::error_code& e,
70 std::size_t bytes_transferred);
71
72 /// Handle completion of a write operation.
73 void handle_write(const boost::system::error_code& e);
74
75 /// Socket for the connection.
76 boost::asio::ip::tcp::socket socket_;
77
78 /// The manager for this connection.
79 connection_manager& connection_manager_;
80
81 /// The handler used to process the incoming request.
82 request_handler& request_handler_;
83
84 /// Buffer for incoming data.
85 boost::array<char, 8192> buffer_;
86
87 /// The incoming request.
88 request request_;
89
90 /// The parser for the incoming request.
91 request_parser request_parser_;
92
93 /// The reply to be sent back to the client.
94 reply reply_;
95};
96
97typedef boost::shared_ptr<connection> connection_ptr;
98
99} // namespace server
100} // namespace http
101
102#endif // HTTP_CONNECTION_HPP