blob: cfac5f6ce2b605bfe2dabed9fc1212d4f99b6216 [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
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080033#include "reply.hpp"
34#include "request.hpp"
35#include "request_handler.hpp"
36#include "request_parser.hpp"
Alexander Afanasyevcaf61b12016-12-25 14:18:52 -080037
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080038#include <boost/array.hpp>
39#include <boost/asio.hpp>
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080040#include <boost/noncopyable.hpp>
Alexander Afanasyevcaf61b12016-12-25 14:18:52 -080041
42#include <memory>
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080043
44namespace http {
45namespace server {
46
47class connection_manager;
48
49/// Represents a single connection from a client.
Alexander Afanasyevcaf61b12016-12-25 14:18:52 -080050class connection : public std::enable_shared_from_this<connection>, private boost::noncopyable
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080051{
52public:
53 /// Construct a connection with the given io_service.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080054 explicit connection(boost::asio::io_service& io_service, connection_manager& manager,
55 request_handler& handler);
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080056
57 /// Get the socket associated with the connection.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080058 boost::asio::ip::tcp::socket&
59 socket();
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080060
61 /// Start the first asynchronous operation for the connection.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080062 void
63 start();
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080064
65 /// Stop all asynchronous operations associated with the connection.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080066 void
67 stop();
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080068
69private:
70 /// Handle completion of a read operation.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080071 void
72 handle_read(const boost::system::error_code& e, std::size_t bytes_transferred);
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080073
74 /// Handle completion of a write operation.
Alexander Afanasyeveda3b7a2016-12-25 11:26:40 -080075 void
76 handle_write(const boost::system::error_code& e);
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -080077
78 /// Socket for the connection.
79 boost::asio::ip::tcp::socket socket_;
80
81 /// The manager for this connection.
82 connection_manager& connection_manager_;
83
84 /// The handler used to process the incoming request.
85 request_handler& request_handler_;
86
87 /// Buffer for incoming data.
88 boost::array<char, 8192> buffer_;
89
90 /// The incoming request.
91 request request_;
92
93 /// The parser for the incoming request.
94 request_parser request_parser_;
95
96 /// The reply to be sent back to the client.
97 reply reply_;
98};
99
Alexander Afanasyevcaf61b12016-12-25 14:18:52 -0800100typedef std::shared_ptr<connection> connection_ptr;
Zhenkai Zhua9a7e1d2013-02-25 18:29:07 -0800101
102} // namespace server
103} // namespace http
104
105#endif // HTTP_CONNECTION_HPP