forked from benkuper/juce_simpleweb
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimpleWebSocketServer.h
More file actions
195 lines (143 loc) · 7.53 KB
/
SimpleWebSocketServer.h
File metadata and controls
195 lines (143 loc) · 7.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/*
==============================================================================
juce_SimpleWebSocket.h
Created: 17 Jun 2020 11:22:54pm
Author: bkupe
==============================================================================
*/
#pragma once
#define USE_STANDALONE_ASIO 1
#define NOGDI
#define ASIO_DISABLE_SERIAL_PORT 1
using WsServer = SimpleWeb::SocketServer<SimpleWeb::WS>;
using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
#if SIMPLEWEB_SECURE_SUPPORTED
using WssServer = SimpleWeb::SocketServer<SimpleWeb::WSS>;
using HttpsServer = SimpleWeb::Server<SimpleWeb::HTTPS>;
#endif
class SimpleWebSocketServerBase :
public juce::Thread
{
public:
SimpleWebSocketServerBase();
virtual ~SimpleWebSocketServerBase();
juce::File rootPath;
juce::String localAddress;
int port;
bool allowAddressReuse;
juce::String wsSuffix;
bool isConnected;
bool isConnecting;
juce::CriticalSection serverLock;
void start(int port = 8080, const juce::String& wsSuffix = "", const juce::String& _localAddress = "", bool allowAddressReuse = false);
virtual void send(const juce::String& message) {}
virtual void send(const char* data, int numData) {}
void send(const juce::MemoryBlock& data);
virtual void sendTo(const juce::String& message, const juce::String& id) {}
virtual void sendTo(const juce::MemoryBlock& data, const juce::String& id) {}
virtual void sendExclude(const juce::String& message, const juce::StringArray excludeIds) {}
virtual void sendExclude(const juce::MemoryBlock& data, const juce::StringArray excludeIds) {}
void serveFile(const juce::File& file, std::shared_ptr<HttpServer::Response> response);
void serveFile(const juce::File& file, std::shared_ptr<HttpsServer::Response> response);
void stop();
void closeConnection(const juce::String& id, int code = 1000, const juce::String& reason = "YouKnowWhy");
virtual void stopInternal() {}
virtual void closeConnectionInternal(const juce::String& id, int code, const juce::String& reason) {}
virtual int getNumActiveConnections() const { return 0; }
void run() override;
virtual void initServer() {}
class Listener
{
public:
/** Destructor. */
virtual ~Listener() {}
virtual void serverInitSuccess() {}
virtual void serverInitError(const juce::String& id) {}
virtual void connectionOpened(const juce::String& id) {}
virtual void messageReceived(const juce::String& id, const juce::String& message) {}
virtual void dataReceived(const juce::String& id, const juce::MemoryBlock& data) {}
virtual void connectionClosed(const juce::String& id, int status, const juce::String& reason) {}
virtual void connectionError(const juce::String& id, const juce::String& message) {}
};
juce::ListenerList<Listener> webSocketListeners;
void addWebSocketListener(Listener* newListener) { webSocketListeners.add(newListener); }
void removeWebSocketListener(Listener* listener) { webSocketListeners.remove(listener); }
class RequestHandler
{
public:
virtual ~RequestHandler() {}
virtual bool handleHTTPRequest(std::shared_ptr<HttpServer::Response> response, std::shared_ptr<HttpServer::Request> request) { return false; };
#if SIMPLEWEB_SECURE_SUPPORTED
virtual bool handleHTTPSRequest(std::shared_ptr<HttpsServer::Response> response, std::shared_ptr<HttpsServer::Request> request) { return false; };
#endif
};
/// @brief Add a new http request handler. Incoming requests will be forwarded to handlers in the order they've been added
/// until one successfully handles it.
void addHTTPRequestHandler(RequestHandler* newHandler);
void removeHTTPRequestHandler(RequestHandler* handlerToRemove);
protected:
juce::Array<RequestHandler*> handlers;
};
class SimpleWebSocketServer :
public SimpleWebSocketServerBase
{
public:
SimpleWebSocketServer();
~SimpleWebSocketServer();
std::unique_ptr<WsServer> ws;
std::unique_ptr<HttpServer> http;
std::shared_ptr<asio::io_service> ioService;
juce::HashMap<juce::String, std::shared_ptr<WsServer::Connection>, juce::DefaultHashFunctions, juce::CriticalSection> connectionMap;
virtual void send(const juce::String& message) override;
virtual void send(const char* data, int numData) override;
virtual void sendTo(const juce::String& message, const juce::String& id) override;
virtual void sendTo(const juce::MemoryBlock& data, const juce::String& id) override;
virtual void sendExclude(const juce::String& message, const juce::StringArray excludeIds) override;
virtual void sendExclude(const juce::MemoryBlock& data, const juce::StringArray excludeIds) override;
virtual void stopInternal() override;
virtual void closeConnectionInternal(const juce::String& id, int code, const juce::String& reason) override;
void initServer() override;
void onMessageCallback(std::shared_ptr<WsServer::Connection> connection, std::shared_ptr<WsServer::InMessage> in_message);
void onNewConnectionCallback(std::shared_ptr<WsServer::Connection> connection);
void onConnectionCloseCallback(std::shared_ptr<WsServer::Connection> connection, int status, const std::string& /*reason*/);
void onErrorCallback(std::shared_ptr<WsServer::Connection> connection, const SimpleWeb::error_code& ec);
void httpStartCallback(unsigned short port);
void onHTTPUpgrade(std::unique_ptr<SimpleWeb::HTTP>& socket, std::shared_ptr<HttpServer::Request> request);
void httpDefaultCallback(std::shared_ptr<HttpServer::Response> response, std::shared_ptr<HttpServer::Request> request);
juce::String getConnectionString(std::shared_ptr<WsServer::Connection> connection) const;
virtual int getNumActiveConnections() const override;
};
#if SIMPLEWEB_SECURE_SUPPORTED
class SecureWebSocketServer :
public SimpleWebSocketServerBase
{
public:
SecureWebSocketServer(const juce::String& certFile, const juce::String& privateKeyFile, const juce::String& verifyFile = juce::String());
~SecureWebSocketServer();
juce::String certFile;
juce::String keyFile;
juce::String verifyFile;
std::unique_ptr<WssServer> ws;
std::unique_ptr<HttpsServer> http;
std::shared_ptr<asio::io_service> ioService;
juce::HashMap<juce::String, std::shared_ptr<WssServer::Connection>> connectionMap;
virtual void send(const juce::String& message) override;
virtual void send(const char* data, int numData) override;
virtual void sendTo(const juce::String& message, const juce::String& id) override;
virtual void sendTo(const juce::MemoryBlock& data, const juce::String& id) override;
virtual void sendExclude(const juce::String& message, const juce::StringArray excludeIds) override;
virtual void sendExclude(const juce::MemoryBlock& data, const juce::StringArray excludeIds) override;
virtual void stopInternal() override;
virtual void closeConnectionInternal(const juce::String& id, int code, const juce::String& reason) override;
void initServer() override;
void onMessageCallback(std::shared_ptr<WssServer::Connection> connection, std::shared_ptr<WssServer::InMessage> in_message);
void onNewConnectionCallback(std::shared_ptr<WssServer::Connection> connection);
void onConnectionCloseCallback(std::shared_ptr<WssServer::Connection> connection, int status, const std::string& /*reason*/);
void onErrorCallback(std::shared_ptr<WssServer::Connection> connection, const SimpleWeb::error_code& ec);
void httpStartCallback(unsigned short port);
void onHTTPUpgrade(std::unique_ptr<SimpleWeb::HTTPS>& socket, std::shared_ptr<HttpsServer::Request> request);
void httpDefaultCallback(std::shared_ptr<HttpsServer::Response> response, std::shared_ptr<HttpsServer::Request> request);
juce::String getConnectionString(std::shared_ptr<WssServer::Connection> connection) const;
virtual int getNumActiveConnections() const override;
};
#endif