CppServer  1.0.0.0
C++ Server Library
web_server.cpp
Go to the documentation of this file.
1 
10 
11 namespace CppServer {
12 namespace Asio {
13 
14 WebServer::WebServer(std::shared_ptr<Service> service, int port)
15  : _service(service),
16  _server(std::make_shared<restbed::Service>()),
17  _settings(std::make_shared<restbed::Settings>()),
18  _started(false)
19 {
20  assert((service != nullptr) && "ASIO service is invalid!");
21  if (service == nullptr)
22  throw CppCommon::ArgumentException("ASIO service is invalid!");
23 
24  // Use external IO service
25  _server->set_external_io_service(_service->service());
26 
27  // Prepare Web server settings
28  _settings->set_port(port);
29 }
30 
31 WebServer::WebServer(std::shared_ptr<Service> service, const std::string& address, int port)
32  : _service(service),
33  _server(std::make_shared<restbed::Service>()),
34  _settings(std::make_shared<restbed::Settings>()),
35  _started(false)
36 {
37  assert((service != nullptr) && "ASIO service is invalid!");
38  if (service == nullptr)
39  throw CppCommon::ArgumentException("ASIO service is invalid!");
40 
41  // Use external IO service
42  _server->set_external_io_service(_service->service());
43 
44  // Prepare Web server settings
45  _settings->set_bind_address(address);
46  _settings->set_port(port);
47 }
48 
50 {
51  assert(!IsStarted() && "Web server is already started!");
52  if (IsStarted())
53  return false;
54 
55  // Post the start routine
56  auto self(this->shared_from_this());
57  _service->service()->post([this, self]()
58  {
59  // Start the Restbed server
60  _server->start(_settings);
61 
62  // Update the started flag
63  _started = true;
64 
65  // Call the server started handler
66  onStarted();
67  });
68 
69  return true;
70 }
71 
73 {
74  assert(IsStarted() && "Web server is not started!");
75  if (!IsStarted())
76  return false;
77 
78  // Post the stopped routine
79  auto self(this->shared_from_this());
80  _service->service()->post([this, self]()
81  {
82  // Stop the Restbed server
83  _server->stop();
84 
85  // Update the started flag
86  _started = false;
87 
88  // Call the server stopped handler
89  onStopped();
90  });
91 
92  return true;
93 }
94 
96 {
97  if (!Stop())
98  return false;
99 
100  while (IsStarted())
101  CppCommon::Thread::Yield();
102 
103  return Start();
104 }
105 
106 } // namespace Asio
107 } // namespace CppServer
std::shared_ptr< Service > & service() noexcept
Get the Asio service.
Definition: web_server.h:52
HTTP Web server definition.
Asio service.
Definition: service.h:34
C++ Server project definitions.
Definition: asio.h:24
virtual void onStarted()
Handle server started notification.
Definition: web_server.h:79
WebServer(std::shared_ptr< Service > service, int port)
Initialize HTTP Web server with a given Asio service and port number.
Definition: web_server.cpp:14
bool IsStarted() const noexcept
Is the server started?
Definition: web_server.h:59
bool Restart()
Restart the server.
Definition: web_server.cpp:95
virtual void onStopped()
Handle server stopped notification.
Definition: web_server.h:81
bool Start()
Start the server.
Definition: web_server.cpp:49
bool Stop()
Stop the server.
Definition: web_server.cpp:72