| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 | /** * Copyright (c) 2021 Paul-Louis Ageneau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */#include <rtc/rtc.h>#if RTC_ENABLE_WEBSOCKET#include <cstdio>#include <cstdlib>#include <cstring>#ifdef _WIN32#include <windows.h>static void sleep(unsigned int secs) { Sleep(secs * 1000); }#else#include <unistd.h> // for sleep#endifstatic const char *MESSAGE = "Hello, this is a C API WebSocket test!";static bool success = false;static bool failed = false;static int wsclient = -1;static void RTC_API openCallback(int ws, void *ptr) {	printf("WebSocket: Connection open\n");	if (rtcSendMessage(ws, MESSAGE, -1) < 0) { // negative size indicates a null-terminated string		fprintf(stderr, "rtcSendMessage failed\n");		failed = true;		return;	}}static void RTC_API closedCallback(int ws, void *ptr) { printf("WebSocket: Connection closed"); }static void RTC_API messageCallback(int ws, const char *message, int size, void *ptr) {	if (size < 0 && strcmp(message, MESSAGE) == 0) {		printf("WebSocket: Received expected message\n");		success = true;	} else {		fprintf(stderr, "Received UNEXPECTED message\n");		failed = true;	}}static void RTC_API serverOpenCallback(int ws, void *ptr) {	printf("WebSocketServer: Client connection open\n");	char path[256];	if (rtcGetWebSocketPath(ws, path, 256) < 0) {		fprintf(stderr, "rtcGetWebSocketPath failed\n");		failed = true;		return;	}	if (strcmp(path, "/mypath") != 0) {		fprintf(stderr, "Wrong WebSocket path: %s\n", path);		failed = true;	}}static void RTC_API serverClosedCallback(int ws, void *ptr) {	printf("WebSocketServer: Client connection closed\n");}static void RTC_API serverMessageCallback(int ws, const char *message, int size, void *ptr) {	if (rtcSendMessage(ws, message, size) < 0) {		fprintf(stderr, "rtcSendMessage failed\n");		failed = true;	}}static void RTC_API serverClientCallback(int wsserver, int ws, void *ptr) {	wsclient = ws;	char address[256];	if (rtcGetWebSocketRemoteAddress(ws, address, 256) < 0) {		fprintf(stderr, "rtcGetWebSocketRemoteAddress failed\n");		failed = true;		return;	}	printf("WebSocketServer: Received client connection from %s", address);	rtcSetOpenCallback(ws, serverOpenCallback);	rtcSetClosedCallback(ws, serverClosedCallback);	rtcSetMessageCallback(ws, serverMessageCallback);}int test_capi_websocketserver_main() {	const char *url = "wss://localhost:48081/mypath";	const uint16_t port = 48081;	int wsserver = -1;	int ws = -1;	int attempts;	rtcInitLogger(RTC_LOG_DEBUG, nullptr);	rtcWsServerConfiguration serverConfig;	memset(&serverConfig, 0, sizeof(serverConfig));	serverConfig.port = port;	serverConfig.enableTls = true;	// serverConfig.certificatePemFile = ...	// serverConfig.keyPemFile = ...	wsserver = rtcCreateWebSocketServer(&serverConfig, serverClientCallback);	if (wsserver < 0)		goto error;	if (rtcGetWebSocketServerPort(wsserver) != int(port)) {		fprintf(stderr, "rtcGetWebSocketServerPort failed\n");		goto error;	}	rtcWsConfiguration config;	memset(&config, 0, sizeof(config));	config.disableTlsVerification = true;	ws = rtcCreateWebSocketEx(url, &config);	if (ws < 0)		goto error;	rtcSetOpenCallback(ws, openCallback);	rtcSetClosedCallback(ws, closedCallback);	rtcSetMessageCallback(ws, messageCallback);	attempts = 10;	while (!success && !failed && attempts--)		sleep(1);	if (!success || failed)		goto error;	rtcDeleteWebSocket(wsclient);	sleep(1);	rtcDeleteWebSocket(ws);	sleep(1);	rtcDeleteWebSocketServer(wsserver);	sleep(1);	printf("Success\n");	return 0;error:	if (wsclient >= 0)		rtcDeleteWebSocket(wsclient);	if (ws >= 0)		rtcDeleteWebSocket(ws);	if (wsserver >= 0)		rtcDeleteWebSocketServer(wsserver);	return -1;}#include <stdexcept>void test_capi_websocketserver() {	if (test_capi_websocketserver_main())		throw std::runtime_error("WebSocketServer test failed");}#endif
 |