18 #include <hicn/transport/interfaces/socket_consumer.h>
19 #include <hicn/transport/utils/event_thread.h>
21 #include "forwarder_config.h"
22 #include "http_session.h"
23 #include "icn_receiver.h"
25 #define ASIO_STANDALONE
27 #include <asio/version.hpp>
28 #include <unordered_set>
32 using AcceptCallback = std::function<void(asio::ip::tcp::socket&&)>;
34 TcpListener(asio::io_service& io_service,
short port, AcceptCallback callback)
35 : acceptor_(io_service),
36 #if ((ASIO_VERSION / 100 % 1000) < 12)
40 acceptor_.open(asio::ip::tcp::v4());
41 typedef asio::detail::socket_option::boolean<SOL_SOCKET, SO_REUSEPORT>
43 acceptor_.set_option(reuse_port(
true));
44 acceptor_.bind(asio::ip::tcp::endpoint(
45 asio::ip::address::from_string(
"127.0.0.1"), port));
51 #if ((ASIO_VERSION / 100 % 1000) >= 12)
52 acceptor_.async_accept(
53 [
this](std::error_code ec, asio::ip::tcp::socket socket) {
55 acceptor_.async_accept(socket_, [
this](std::error_code ec) {
56 auto socket = std::move(socket_);
59 callback_(std::move(socket));
65 void stop() { acceptor_.close(); }
67 asio::ip::tcp::acceptor acceptor_;
68 #if ((ASIO_VERSION / 100 % 1000) < 12)
69 asio::ip::tcp::socket socket_;
71 AcceptCallback callback_;
76 class HTTPClientConnectionCallback;
82 void stopAndJoinThread() { thread_.stop(); }
83 virtual void stop() = 0;
90 friend class HTTPClientConnectionCallback;
93 TcpReceiver(std::uint16_t port,
const std::string& prefix,
94 const std::string& ipv6_first_word);
99 void onNewConnection(asio::ip::tcp::socket&& socket);
100 void onClientDisconnect(HTTPClientConnectionCallback* client);
102 template <
typename Callback>
103 void parseHicnHeader(std::string& hicn_header, Callback&& callback) {
104 forwarder_config_.parseHicnHeader(hicn_header,
105 std::forward<Callback>(callback));
110 std::string ipv6_first_word_;
111 std::string prefix_hash_;
112 std::deque<HTTPClientConnectionCallback*> http_clients_;
113 std::unordered_set<HTTPClientConnectionCallback*> used_http_clients_;
120 template <
typename... Args>
123 icn_consum_producer_(thread_.getIoService(),
124 std::forward<Args>(args)...) {
125 icn_consum_producer_.run();
128 void stop()
override {
129 thread_.add([
this]() {
131 icn_consum_producer_.stop();
141 enum Server { CREATE };
142 enum Client { WRAP_BUFFER };
146 std::string first_ipv6_word;
148 virtual void printParams() { std::cout <<
"Parameters: " << std::endl; };
152 short tcp_listen_port;
153 void printParams()
override {
154 std::cout <<
"Running HTTP/TCP -> HTTP/hICN proxy." << std::endl;
155 CommonParams::printParams();
157 <<
"HTTP listen port: " << tcp_listen_port << std::endl;
159 <<
"Consumer Prefix: " << prefix << std::endl;
161 <<
"Prefix first word: " << first_ipv6_word << std::endl;
166 std::string origin_address;
167 std::string origin_port;
168 std::string cache_size;
170 std::string content_lifetime;
173 void printParams()
override {
174 std::cout <<
"Running HTTP/hICN -> HTTP/TCP proxy." << std::endl;
175 CommonParams::printParams();
177 <<
"Origin address: " << origin_address << std::endl;
179 <<
"Origin port: " << origin_port << std::endl;
181 <<
"Producer cache size: " << cache_size << std::endl;
183 <<
"hICN MTU: " << mtu << std::endl;
185 <<
"Default content lifetime: " << content_lifetime
188 <<
"Producer Prefix: " << prefix << std::endl;
190 <<
"Prefix first word: " << first_ipv6_word << std::endl;
192 <<
"Use manifest: " << manifest << std::endl;
199 void run() { main_io_context_.run(); }
203 void setupSignalHandler();
205 std::vector<std::unique_ptr<Receiver>> receivers_;
206 asio::io_service main_io_context_;
207 asio::signal_set signals_;