@@ -34,11 +34,28 @@ using namespace std::placeholders;
34
34
using namespace std ::chrono_literals;
35
35
using std::chrono::milliseconds;
36
36
37
+ const string PemBeginCertificateTag = " -----BEGIN CERTIFICATE-----" ;
38
+
37
39
WebSocket::WebSocket (optional<Configuration> optConfig, certificate_ptr certificate)
38
40
: config(optConfig ? std::move(*optConfig) : Configuration()),
39
- mCertificate (certificate ? std::move(certificate) : std::move(loadCertificate(config))),
40
- mIsSecure(mCertificate != nullptr ), mRecvQueue(RECV_QUEUE_LIMIT, message_size_func) {
41
+ mRecvQueue (RECV_QUEUE_LIMIT, message_size_func) {
41
42
PLOG_VERBOSE << " Creating WebSocket" ;
43
+
44
+ if (certificate) {
45
+ mCertificate = std::move (certificate);
46
+ } else if (config.certificatePemFile && config.keyPemFile ) {
47
+ mCertificate = std::make_shared<Certificate>(
48
+ config.certificatePemFile ->find (PemBeginCertificateTag) != string::npos
49
+ ? Certificate::FromString (*config.certificatePemFile , *config.keyPemFile )
50
+ : Certificate::FromFile (*config.certificatePemFile , *config.keyPemFile ,
51
+ config.keyPemPass .value_or (" " )));
52
+ } else if (config.certificatePemFile || config.keyPemFile ) {
53
+ throw std::invalid_argument (
54
+ " Either none or both certificate and key PEM files must be specified" );
55
+ }
56
+
57
+ mIsSecure = mCertificate != nullptr ;
58
+
42
59
if (config.proxyServer ) {
43
60
if (config.proxyServer ->type == ProxyServer::Type::Socks5)
44
61
throw std::invalid_argument (
@@ -49,19 +66,6 @@ WebSocket::WebSocket(optional<Configuration> optConfig, certificate_ptr certific
49
66
}
50
67
}
51
68
52
- certificate_ptr WebSocket::loadCertificate (const Configuration& config) {
53
- if (!config.certificatePemFile )
54
- return nullptr ;
55
-
56
- if (config.keyPemFile )
57
- return std::make_shared<Certificate>(
58
- Certificate::FromFile (*config.certificatePemFile , *config.keyPemFile ,
59
- config.keyPemPass .value_or (" " )));
60
-
61
- throw std::invalid_argument (
62
- " Either none or both certificate and key PEM files must be specified" );
63
- }
64
-
65
69
WebSocket::~WebSocket () { PLOG_VERBOSE << " Destroying WebSocket" ; }
66
70
67
71
void WebSocket::open (const string &url) {
@@ -156,7 +160,9 @@ bool WebSocket::isOpen() const { return state == State::Open; }
156
160
157
161
bool WebSocket::isClosed () const { return state == State::Closed; }
158
162
159
- size_t WebSocket::maxMessageSize () const { return config.maxMessageSize .value_or (DEFAULT_WS_MAX_MESSAGE_SIZE); }
163
+ size_t WebSocket::maxMessageSize () const {
164
+ return config.maxMessageSize .value_or (DEFAULT_WS_MAX_MESSAGE_SIZE);
165
+ }
160
166
161
167
optional<message_variant> WebSocket::receive () {
162
168
auto next = mRecvQueue .pop ();
0 commit comments