Monero
Loading...
Searching...
No Matches
http_server_impl_base.h
Go to the documentation of this file.
1// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above copyright
9// notice, this list of conditions and the following disclaimer in the
10// documentation and/or other materials provided with the distribution.
11// * Neither the name of the Andrey N. Sabelnikov nor the
12// names of its contributors may be used to endorse or promote products
13// derived from this software without specific prior written permission.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
19// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26
27
28
29
30#pragma once
31
32
33#include <boost/thread.hpp>
34#include <boost/bind/bind.hpp>
35
36#include "cryptonote_config.h"
40
41#undef MONERO_DEFAULT_LOG_CATEGORY
42#define MONERO_DEFAULT_LOG_CATEGORY "net.http"
43
44namespace epee
45{
46
47 template<class t_child_class, class t_connection_context = epee::net_utils::connection_context_base>
50 {
51
52 public:
54 : m_net_server(epee::net_utils::e_connection_type_RPC)
55 {}
56
57 explicit http_server_impl_base(boost::asio::io_context& external_io_service)
58 : m_net_server(external_io_service)
59 {}
60
61 bool init(std::function<void(size_t, uint8_t*)> rng, const std::string& bind_port = "0", const std::string& bind_ip = "0.0.0.0",
62 const std::string& bind_ipv6_address = "::", bool use_ipv6 = false, bool require_ipv4 = true,
63 std::vector<std::string> access_control_origins = std::vector<std::string>(),
64 boost::optional<net_utils::http::login> user = boost::none,
66 const std::size_t max_public_ip_connections = DEFAULT_RPC_MAX_CONNECTIONS_PER_PUBLIC_IP,
67 const std::size_t max_private_ip_connections = DEFAULT_RPC_MAX_CONNECTIONS_PER_PRIVATE_IP,
68 const std::size_t max_connections = DEFAULT_RPC_MAX_CONNECTIONS,
69 const std::size_t response_soft_limit = DEFAULT_RPC_SOFT_LIMIT_SIZE)
70 {
71 if (max_connections < max_public_ip_connections)
72 throw std::invalid_argument{"Max public IP connections cannot be more than max connections"};
73 if (max_connections < max_private_ip_connections)
74 throw std::invalid_argument{"Max private IP connections cannot be more than max connections"};
75
76 //set self as callback handler
77 m_net_server.get_config_object().m_phandler = static_cast<t_child_class*>(this);
78 m_net_server.get_config_object().rng = std::move(rng);
79
80 //here set folder for hosting reqests
81 m_net_server.get_config_object().m_folder = "";
82
83 //set access control allow origins if configured
84 std::sort(access_control_origins.begin(), access_control_origins.end());
85 m_net_server.get_config_object().m_access_control_origins = std::move(access_control_origins);
86
87 m_net_server.get_config_object().m_user = std::move(user);
88 m_net_server.get_config_object().m_max_public_ip_connections = max_public_ip_connections;
89 m_net_server.get_config_object().m_max_private_ip_connections = max_private_ip_connections;
90 m_net_server.get_config_object().m_max_connections = max_connections;
91 m_net_server.set_response_soft_limit(response_soft_limit);
92 m_net_server.set_connection_limit(this);
93
94 MGINFO("Binding on " << bind_ip << " (IPv4):" << bind_port);
95 if (use_ipv6)
96 {
97 MGINFO("Binding on " << bind_ipv6_address << " (IPv6):" << bind_port);
98 }
99 bool res = m_net_server.init_server(bind_port, bind_ip, bind_port, bind_ipv6_address, use_ipv6, require_ipv4, std::move(ssl_options));
100 if(!res)
101 {
102 LOG_ERROR("Failed to bind server");
103 return false;
104 }
105 return true;
106 }
107
108 bool run(size_t threads_count, bool wait = true)
109 {
110 //go to loop
111 MINFO("Run net_service loop( " << threads_count << " threads)...");
112 if(!m_net_server.run_server(threads_count, wait))
113 {
114 LOG_ERROR("Failed to run net tcp server!");
115 }
116
117 if(wait)
118 MINFO("net_service loop stopped.");
119 return true;
120 }
121
122 bool deinit()
123 {
124 return m_net_server.deinit_server();
125 }
126
128 {
129 return m_net_server.timed_wait_server_stop(ms);
130 }
131
133 {
134 m_net_server.send_stop_signal();
135 return true;
136 }
137
139 {
140 return m_net_server.get_binded_port();
141 }
142
144 {
145 return m_net_server.get_connections_count();
146 }
147
148 protected:
149
150 virtual bool is_host_limit(const net_utils::network_address& na) override final
151 {
152 auto& config = m_net_server.get_config_object();
154 if (config.m_max_connections <= config.m_connection_count)
155 return true;
156
157 const bool is_private = na.is_loopback() || na.is_local();
158 const auto elem = config.m_connections.find(na.host_str());
159 if (elem != config.m_connections.end())
160 {
161 if (is_private)
162 return config.m_max_private_ip_connections <= elem->second;
163 else
164 return config.m_max_public_ip_connections <= elem->second;
165 }
166 return false;
167 }
168
170 };
171}
the connection templated-class for one peer connection
bool init(std::function< void(size_t, uint8_t *)> rng, const std::string &bind_port="0", const std::string &bind_ip="0.0.0.0", const std::string &bind_ipv6_address="::", bool use_ipv6=false, bool require_ipv4=true, std::vector< std::string > access_control_origins=std::vector< std::string >(), boost::optional< net_utils::http::login > user=boost::none, net_utils::ssl_options_t ssl_options=net_utils::ssl_support_t::e_ssl_support_autodetect, const std::size_t max_public_ip_connections=DEFAULT_RPC_MAX_CONNECTIONS_PER_PUBLIC_IP, const std::size_t max_private_ip_connections=DEFAULT_RPC_MAX_CONNECTIONS_PER_PRIVATE_IP, const std::size_t max_connections=DEFAULT_RPC_MAX_CONNECTIONS, const std::size_t response_soft_limit=DEFAULT_RPC_SOFT_LIMIT_SIZE)
Definition http_server_impl_base.h:61
bool send_stop_signal()
Definition http_server_impl_base.h:132
long get_connections_count() const
Definition http_server_impl_base.h:143
bool run(size_t threads_count, bool wait=true)
Definition http_server_impl_base.h:108
int get_binded_port()
Definition http_server_impl_base.h:138
http_server_impl_base(boost::asio::io_context &external_io_service)
Definition http_server_impl_base.h:57
bool timed_wait_server_stop(uint64_t ms)
Definition http_server_impl_base.h:127
virtual bool is_host_limit(const net_utils::network_address &na) override final
Definition http_server_impl_base.h:150
http_server_impl_base()
Definition http_server_impl_base.h:53
net_utils::boosted_tcp_server< net_utils::http::http_custom_handler< t_connection_context > > m_net_server
Definition http_server_impl_base.h:169
bool deinit()
Definition http_server_impl_base.h:122
Definition abstract_tcp_server2.h:347
Definition net_utils_base.h:225
Definition net_ssl.h:77
#define DEFAULT_RPC_MAX_CONNECTIONS_PER_PRIVATE_IP
Definition cryptonote_config.h:131
#define DEFAULT_RPC_SOFT_LIMIT_SIZE
Definition cryptonote_config.h:133
#define DEFAULT_RPC_MAX_CONNECTIONS
Definition cryptonote_config.h:132
#define DEFAULT_RPC_MAX_CONNECTIONS_PER_PUBLIC_IP
Definition cryptonote_config.h:130
const char * res
Definition hmac_keccak.cpp:42
Definition cryptonote_config.h:221
Definition abstract_http_client.h:36
@ e_ssl_support_autodetect
Definition net_ssl.h:52
TODO: (mj-xmr) This will be reduced in an another PR.
Definition byte_slice.h:40
unsigned char uint8_t
Definition stdint.h:124
unsigned __int64 uint64_t
Definition stdint.h:136
Definition http_protocol_handler.h:157
Definition abstract_tcp_server2.h:83
#define CRITICAL_REGION_LOCAL(x)
Definition syncobj.h:153