Browse Source

WebSocketServer: Allow passing certificate and key as strings

Paul-Louis Ageneau 3 years ago
parent
commit
f58efb8c83
1 changed files with 13 additions and 8 deletions
  1. 13 8
      src/impl/websocketserver.cpp

+ 13 - 8
src/impl/websocketserver.cpp

@@ -27,6 +27,8 @@ namespace rtc::impl {
 
 
 using namespace std::placeholders;
 using namespace std::placeholders;
 
 
+const string PemBeginCertificateTag = "-----BEGIN CERTIFICATE-----";
+
 WebSocketServer::WebSocketServer(Configuration config_)
 WebSocketServer::WebSocketServer(Configuration config_)
     : config(std::move(config_)), tcpServer(std::make_unique<TcpServer>(config.port)),
     : config(std::move(config_)), tcpServer(std::make_unique<TcpServer>(config.port)),
       mStopped(false) {
       mStopped(false) {
@@ -34,16 +36,19 @@ WebSocketServer::WebSocketServer(Configuration config_)
 
 
 	if (config.enableTls) {
 	if (config.enableTls) {
 		if (config.certificatePemFile && config.keyPemFile) {
 		if (config.certificatePemFile && config.keyPemFile) {
-			mCertificate = std::make_shared<Certificate>(Certificate::FromFile(
-			    *config.certificatePemFile, *config.keyPemFile, config.keyPemPass.value_or("")));
-
-		} else if (!config.certificatePemFile && !config.keyPemFile) {
 			mCertificate = std::make_shared<Certificate>(
 			mCertificate = std::make_shared<Certificate>(
-			    Certificate::Generate(CertificateType::Default, "localhost"));
-		} else {
-			throw std::invalid_argument(
-			    "Either none or both certificate and key PEM files must be specified");
+			    config.certificatePemFile->find(PemBeginCertificateTag) != string::npos
+			        ? Certificate::FromString(*config.certificatePemFile, *config.keyPemFile)
+			        : Certificate::FromFile(*config.certificatePemFile, *config.keyPemFile,
+			                                config.keyPemPass.value_or("")));
 		}
 		}
+
+	} else if (!config.certificatePemFile && !config.keyPemFile) {
+		mCertificate = std::make_shared<Certificate>(
+		    Certificate::Generate(CertificateType::Default, "localhost"));
+	} else {
+		throw std::invalid_argument(
+		    "Either none or both certificate and key PEM files must be specified");
 	}
 	}
 
 
 	mThread = std::thread(&WebSocketServer::runLoop, this);
 	mThread = std::thread(&WebSocketServer::runLoop, this);