|
@@ -25,7 +25,7 @@
|
|
|
#include <fstream>
|
|
#include <fstream>
|
|
|
#include <functional>
|
|
#include <functional>
|
|
|
#include <websocketpp/common/thread.hpp>
|
|
#include <websocketpp/common/thread.hpp>
|
|
|
-#include <websocketpp/config/asio_no_tls.hpp>
|
|
|
|
|
|
|
+#include <websocketpp/config/asio.hpp>
|
|
|
#include <websocketpp/server.hpp>
|
|
#include <websocketpp/server.hpp>
|
|
|
|
|
|
|
|
#include "asio.hpp"
|
|
#include "asio.hpp"
|
|
@@ -34,12 +34,16 @@
|
|
|
#include "nlohmann/json.hpp"
|
|
#include "nlohmann/json.hpp"
|
|
|
#include "tclap/CmdLine.h"
|
|
#include "tclap/CmdLine.h"
|
|
|
typedef websocketpp::server<websocketpp::config::asio> server;
|
|
typedef websocketpp::server<websocketpp::config::asio> server;
|
|
|
|
|
+typedef websocketpp::server<websocketpp::config::asio_tls> wss_server;
|
|
|
typedef server::message_ptr message_ptr;
|
|
typedef server::message_ptr message_ptr;
|
|
|
using websocketpp::lib::bind;
|
|
using websocketpp::lib::bind;
|
|
|
using websocketpp::lib::placeholders::_1;
|
|
using websocketpp::lib::placeholders::_1;
|
|
|
using websocketpp::lib::placeholders::_2;
|
|
using websocketpp::lib::placeholders::_2;
|
|
|
|
|
+
|
|
|
typedef websocketpp::lib::lock_guard<websocketpp::lib::mutex> scoped_lock;
|
|
typedef websocketpp::lib::lock_guard<websocketpp::lib::mutex> scoped_lock;
|
|
|
typedef websocketpp::lib::unique_lock<websocketpp::lib::mutex> unique_lock;
|
|
typedef websocketpp::lib::unique_lock<websocketpp::lib::mutex> unique_lock;
|
|
|
|
|
+typedef websocketpp::lib::shared_ptr<websocketpp::lib::asio::ssl::context>
|
|
|
|
|
+ context_ptr;
|
|
|
|
|
|
|
|
typedef struct {
|
|
typedef struct {
|
|
|
std::string msg;
|
|
std::string msg;
|
|
@@ -51,25 +55,55 @@ typedef struct {
|
|
|
std::shared_ptr<std::vector<char>> samples;
|
|
std::shared_ptr<std::vector<char>> samples;
|
|
|
} FUNASR_MESSAGE;
|
|
} FUNASR_MESSAGE;
|
|
|
|
|
|
|
|
|
|
+// See https://wiki.mozilla.org/Security/Server_Side_TLS for more details about
|
|
|
|
|
+// the TLS modes. The code below demonstrates how to implement both the modern
|
|
|
|
|
+enum tls_mode { MOZILLA_INTERMEDIATE = 1, MOZILLA_MODERN = 2 };
|
|
|
class WebSocketServer {
|
|
class WebSocketServer {
|
|
|
public:
|
|
public:
|
|
|
- WebSocketServer(asio::io_context& io_decoder, server* server_)
|
|
|
|
|
- : io_decoder_(io_decoder), server_(server_) {
|
|
|
|
|
- // set message handle
|
|
|
|
|
- server_->set_message_handler(
|
|
|
|
|
- [this](websocketpp::connection_hdl hdl, message_ptr msg) {
|
|
|
|
|
- on_message(hdl, msg);
|
|
|
|
|
- });
|
|
|
|
|
- // set open handle
|
|
|
|
|
- server_->set_open_handler(
|
|
|
|
|
- [this](websocketpp::connection_hdl hdl) { on_open(hdl); });
|
|
|
|
|
- // set close handle
|
|
|
|
|
- server_->set_close_handler(
|
|
|
|
|
- [this](websocketpp::connection_hdl hdl) { on_close(hdl); });
|
|
|
|
|
- // begin accept
|
|
|
|
|
- server_->start_accept();
|
|
|
|
|
- // not print log
|
|
|
|
|
- server_->clear_access_channels(websocketpp::log::alevel::all);
|
|
|
|
|
|
|
+ WebSocketServer(asio::io_context& io_decoder, bool is_ssl, server* server,
|
|
|
|
|
+ wss_server* wss_server, std::string& s_certfile,
|
|
|
|
|
+ std::string& s_keyfile)
|
|
|
|
|
+ : io_decoder_(io_decoder),
|
|
|
|
|
+ is_ssl(is_ssl),
|
|
|
|
|
+ server_(server),
|
|
|
|
|
+ wss_server_(wss_server) {
|
|
|
|
|
+ if (is_ssl) {
|
|
|
|
|
+ std::cout << "certfile path is " << s_certfile << std::endl;
|
|
|
|
|
+ wss_server->set_tls_init_handler(
|
|
|
|
|
+ bind<context_ptr>(&WebSocketServer::on_tls_init, this,
|
|
|
|
|
+ MOZILLA_INTERMEDIATE, ::_1, s_certfile, s_keyfile));
|
|
|
|
|
+ wss_server_->set_message_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl, message_ptr msg) {
|
|
|
|
|
+ on_message(hdl, msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ // set open handle
|
|
|
|
|
+ wss_server_->set_open_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl) { on_open(hdl); });
|
|
|
|
|
+ // set close handle
|
|
|
|
|
+ wss_server_->set_close_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl) { on_close(hdl); });
|
|
|
|
|
+ // begin accept
|
|
|
|
|
+ wss_server_->start_accept();
|
|
|
|
|
+ // not print log
|
|
|
|
|
+ wss_server_->clear_access_channels(websocketpp::log::alevel::all);
|
|
|
|
|
+
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // set message handle
|
|
|
|
|
+ server_->set_message_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl, message_ptr msg) {
|
|
|
|
|
+ on_message(hdl, msg);
|
|
|
|
|
+ });
|
|
|
|
|
+ // set open handle
|
|
|
|
|
+ server_->set_open_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl) { on_open(hdl); });
|
|
|
|
|
+ // set close handle
|
|
|
|
|
+ server_->set_close_handler(
|
|
|
|
|
+ [this](websocketpp::connection_hdl hdl) { on_close(hdl); });
|
|
|
|
|
+ // begin accept
|
|
|
|
|
+ server_->start_accept();
|
|
|
|
|
+ // not print log
|
|
|
|
|
+ server_->clear_access_channels(websocketpp::log::alevel::all);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
void do_decoder(const std::vector<char>& buffer,
|
|
void do_decoder(const std::vector<char>& buffer,
|
|
|
websocketpp::connection_hdl& hdl, const nlohmann::json& msg);
|
|
websocketpp::connection_hdl& hdl, const nlohmann::json& msg);
|
|
@@ -78,6 +112,8 @@ class WebSocketServer {
|
|
|
void on_message(websocketpp::connection_hdl hdl, message_ptr msg);
|
|
void on_message(websocketpp::connection_hdl hdl, message_ptr msg);
|
|
|
void on_open(websocketpp::connection_hdl hdl);
|
|
void on_open(websocketpp::connection_hdl hdl);
|
|
|
void on_close(websocketpp::connection_hdl hdl);
|
|
void on_close(websocketpp::connection_hdl hdl);
|
|
|
|
|
+ context_ptr on_tls_init(tls_mode mode, websocketpp::connection_hdl hdl,
|
|
|
|
|
+ std::string& s_certfile, std::string& s_keyfile);
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
void check_and_clean_connection();
|
|
void check_and_clean_connection();
|
|
@@ -85,7 +121,9 @@ class WebSocketServer {
|
|
|
// std::ofstream fout;
|
|
// std::ofstream fout;
|
|
|
FUNASR_HANDLE asr_hanlde; // asr engine handle
|
|
FUNASR_HANDLE asr_hanlde; // asr engine handle
|
|
|
bool isonline = false; // online or offline engine, now only support offline
|
|
bool isonline = false; // online or offline engine, now only support offline
|
|
|
- server* server_; // websocket server
|
|
|
|
|
|
|
+ bool is_ssl = true;
|
|
|
|
|
+ server* server_; // websocket server
|
|
|
|
|
+ wss_server* wss_server_; // websocket server
|
|
|
|
|
|
|
|
// use map to keep the received samples data from one connection in offline
|
|
// use map to keep the received samples data from one connection in offline
|
|
|
// engine. if for online engline, a data struct is needed(TODO)
|
|
// engine. if for online engline, a data struct is needed(TODO)
|