summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/client_wss.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/client_wss.hpp')
-rw-r--r--src/lib/util/client_wss.hpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/lib/util/client_wss.hpp b/src/lib/util/client_wss.hpp
new file mode 100644
index 00000000000..ae00c0346cb
--- /dev/null
+++ b/src/lib/util/client_wss.hpp
@@ -0,0 +1,75 @@
+// license:MIT
+// copyright-holders:Ole Christian Eidheim, Miodrag Milanovic
+#ifndef CLIENT_WSS_HPP
+#define CLIENT_WSS_HPP
+
+#include "client_ws.hpp"
+#include "asio/ssl.hpp"
+
+namespace webpp {
+ using WSS = asio::ssl::stream<asio::ip::tcp::socket>;
+
+ template<>
+ class SocketClient<WSS> : public SocketClientBase<WSS> {
+ public:
+ explicit SocketClient(const std::string& server_port_path, bool verify_certificate=true,
+ const std::string& cert_file=std::string(), const std::string& private_key_file=std::string(),
+ const std::string& verify_file=std::string()) :
+ SocketClientBase(server_port_path, 443),
+ context(asio::ssl::context::tlsv12) {
+ if(cert_file.size()>0 && private_key_file.size()>0) {
+ context.use_certificate_chain_file(cert_file);
+ context.use_private_key_file(private_key_file, asio::ssl::context::pem);
+ }
+
+ if (verify_certificate)
+ context.set_verify_callback(asio::ssl::rfc2818_verification(host));
+
+ if (verify_file.size() > 0)
+ context.load_verify_file(verify_file);
+ else
+ context.set_default_verify_paths();
+
+ if (verify_file.size()>0 || verify_certificate)
+ context.set_verify_mode(asio::ssl::verify_peer);
+ else
+ context.set_verify_mode(asio::ssl::verify_none);
+ };
+
+ protected:
+ asio::ssl::context context;
+
+ void connect() override {
+ asio::ip::tcp::resolver::query query(host, std::to_string(port));
+
+ resolver->async_resolve(query, [this]
+ (const std::error_code &ec, asio::ip::tcp::resolver::iterator it){
+ if(!ec) {
+ connection=std::shared_ptr<Connection>(new Connection(new WSS(*io_context, context)));
+
+ asio::async_connect(connection->socket->lowest_layer(), it, [this]
+ (const std::error_code &ec, asio::ip::tcp::resolver::iterator /*it*/){
+ if(!ec) {
+ asio::ip::tcp::no_delay option(true);
+ connection->socket->lowest_layer().set_option(option);
+
+ connection->socket->async_handshake(asio::ssl::stream_base::client,
+ [this](const std::error_code& ec) {
+ if(!ec)
+ handshake();
+ else if(on_error)
+ on_error(ec);
+ });
+ }
+ else if(on_error)
+ on_error(ec);
+ });
+ }
+ else if(on_error)
+ on_error(ec);
+ });
+ }
+ };
+}
+
+#endif /* CLIENT_WSS_HPP */