Monero
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 
37 #include "http_protocol_handler.h"
39 
40 #undef MONERO_DEFAULT_LOG_CATEGORY
41 #define MONERO_DEFAULT_LOG_CATEGORY "net.http"
42 
43 namespace epee
44 {
45 
46  template<class t_child_class, class t_connection_context = epee::net_utils::connection_context_base>
48  {
49 
50  public:
53  {}
54 
55  explicit http_server_impl_base(boost::asio::io_service& external_io_service)
56  : m_net_server(external_io_service)
57  {}
58 
59  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",
60  const std::string& bind_ipv6_address = "::", bool use_ipv6 = false, bool require_ipv4 = true,
61  std::vector<std::string> access_control_origins = std::vector<std::string>(),
62  boost::optional<net_utils::http::login> user = boost::none,
64  {
65 
66  //set self as callback handler
67  m_net_server.get_config_object().m_phandler = static_cast<t_child_class*>(this);
68  m_net_server.get_config_object().rng = std::move(rng);
69 
70  //here set folder for hosting reqests
71  m_net_server.get_config_object().m_folder = "";
72 
73  //set access control allow origins if configured
74  std::sort(access_control_origins.begin(), access_control_origins.end());
75  m_net_server.get_config_object().m_access_control_origins = std::move(access_control_origins);
76 
77  m_net_server.get_config_object().m_user = std::move(user);
78 
79  MGINFO("Binding on " << bind_ip << " (IPv4):" << bind_port);
80  if (use_ipv6)
81  {
82  MGINFO("Binding on " << bind_ipv6_address << " (IPv6):" << bind_port);
83  }
84  bool res = m_net_server.init_server(bind_port, bind_ip, bind_port, bind_ipv6_address, use_ipv6, require_ipv4, std::move(ssl_options));
85  if(!res)
86  {
87  LOG_ERROR("Failed to bind server");
88  return false;
89  }
90  return true;
91  }
92 
93  bool run(size_t threads_count, bool wait = true)
94  {
95  //go to loop
96  MINFO("Run net_service loop( " << threads_count << " threads)...");
97  if(!m_net_server.run_server(threads_count, wait))
98  {
99  LOG_ERROR("Failed to run net tcp server!");
100  }
101 
102  if(wait)
103  MINFO("net_service loop stopped.");
104  return true;
105  }
106 
107  bool deinit()
108  {
109  return m_net_server.deinit_server();
110  }
111 
113  {
114  return m_net_server.timed_wait_server_stop(ms);
115  }
116 
118  {
119  m_net_server.send_stop_signal();
120  return true;
121  }
122 
124  {
125  return m_net_server.get_binded_port();
126  }
127 
129  {
130  return m_net_server.get_connections_count();
131  }
132 
133  protected:
135  };
136 }
const char * res
Definition: hmac_keccak.cpp:42
net_utils::boosted_tcp_server< net_utils::http::http_custom_handler< t_connection_context > > m_net_server
Definition: http_server_impl_base.h:134
Definition: net_ssl.h:75
Definition: abstract_tcp_server2.h:322
bool deinit()
Definition: http_server_impl_base.h:107
::std::string string
Definition: gtest-port.h:1097
unsigned char uint8_t
Definition: stdint.h:124
boost::asio::io_service io_service
Definition: levin.cpp:303
Definition: http_server_impl_base.h:47
int get_binded_port()
Definition: http_server_impl_base.h:123
Definition: http_protocol_handler.h:152
the connection templated-class for one peer connection
unsigned __int64 uint64_t
Definition: stdint.h:136
http_server_impl_base(boost::asio::io_service &external_io_service)
Definition: http_server_impl_base.h:55
bool run(size_t threads_count, bool wait=true)
Definition: http_server_impl_base.h:93
TODO: (mj-xmr) This will be reduced in an another PR.
Definition: byte_slice.h:39
const T & move(const T &t)
Definition: gtest-port.h:1317
Definition: connection_basic.hpp:95
http_server_impl_base()
Definition: http_server_impl_base.h:51
long get_connections_count() const
Definition: http_server_impl_base.h:128
bool timed_wait_server_stop(uint64_t ms)
Definition: http_server_impl_base.h:112
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)
Definition: http_server_impl_base.h:59
bool send_stop_signal()
Definition: http_server_impl_base.h:117