Browse Source

minor tweaks, headless mode support

Arnis Lielturks 5 years ago
parent
commit
7c1ccea6e5

+ 1 - 1
CMake/Modules/UrhoCommon.cmake

@@ -898,7 +898,7 @@ macro (define_dependency_libs TARGET)
 
 
     # Urho3D external dependency
     # Urho3D external dependency
     if (${TARGET} MATCHES Urho3D)
     if (${TARGET} MATCHES Urho3D)
-        if (URHO3D_WEBSOCKETS AND NOT WEB)
+        if (URHO3D_NETWORK AND URHO3D_WEBSOCKETS AND NOT WEB)
             list (APPEND LIBS websockets)
             list (APPEND LIBS websockets)
         endif ()
         endif ()
     endif ()
     endif ()

+ 3 - 4
Source/CMakeLists.txt

@@ -87,10 +87,9 @@ endif ()
 if (URHO3D_NETWORK AND NOT WEB)
 if (URHO3D_NETWORK AND NOT WEB)
     add_subdirectory (ThirdParty/Civetweb)
     add_subdirectory (ThirdParty/Civetweb)
     add_subdirectory (ThirdParty/SLikeNet)
     add_subdirectory (ThirdParty/SLikeNet)
-endif ()
-
-if (URHO3D_WEBSOCKETS AND NOT WEB)
-    add_subdirectory (ThirdParty/libwebsockets)
+    if (URHO3D_WEBSOCKETS)
+        add_subdirectory (ThirdParty/libwebsockets)
+    endif ()
 endif ()
 endif ()
 
 
 if (URHO3D_DATABASE_ODBC)
 if (URHO3D_DATABASE_ODBC)

+ 19 - 9
Source/Samples/55_WebsocketsSceneReplication/SceneReplication.cpp

@@ -77,11 +77,18 @@ SceneReplication::SceneReplication(Context* context) :
 void SceneReplication::Setup()
 void SceneReplication::Setup()
 {
 {
     Sample::Setup();
     Sample::Setup();
-    engineParameters_[EP_HEADLESS] = true;
+
+    auto params = Engine::ParseParameters(GetArguments());
+    if (params.Contains(EP_HEADLESS)) {
+        engineParameters_[EP_HEADLESS] = params[EP_HEADLESS];
+    }
 }
 }
 
 
 void SceneReplication::Start()
 void SceneReplication::Start()
 {
 {
+    // Create the scene content
+    CreateScene();
+
     if (!GetSubsystem<Engine>()->IsHeadless()) {
     if (!GetSubsystem<Engine>()->IsHeadless()) {
         // Execute base class startup
         // Execute base class startup
         Sample::Start();
         Sample::Start();
@@ -96,9 +103,6 @@ void SceneReplication::Start()
         SetupViewport();
         SetupViewport();
     }
     }
 
 
-    // Create the scene content
-    CreateScene();
-
     // Hook up to necessary events
     // Hook up to necessary events
     SubscribeToEvents();
     SubscribeToEvents();
 
 
@@ -219,8 +223,13 @@ void SceneReplication::CreateUI()
     buttonContainer_->SetPosition(20, 20);
     buttonContainer_->SetPosition(20, 20);
     buttonContainer_->SetLayoutMode(LM_HORIZONTAL);
     buttonContainer_->SetLayoutMode(LM_HORIZONTAL);
 
 
-    textEdit_ = buttonContainer_->CreateChild<LineEdit>();
-    textEdit_->SetStyleAuto();
+    serverAddress_ = buttonContainer_->CreateChild<LineEdit>();
+    serverAddress_->SetStyleAuto();
+    serverAddress_->SetText("ws.arnis.dev");
+
+    serverPort_ = buttonContainer_->CreateChild<LineEdit>();
+    serverPort_->SetStyleAuto();
+    serverPort_->SetText(String(SERVER_PORT));
 
 
     connectButton_ = CreateButton("Connect", 90);
     connectButton_ = CreateButton("Connect", 90);
     disconnectButton_ = CreateButton("Disconnect", 100);
     disconnectButton_ = CreateButton("Disconnect", 100);
@@ -292,7 +301,8 @@ void SceneReplication::UpdateButtons()
     connectButton_->SetVisible(!serverConnection && !serverRunning);
     connectButton_->SetVisible(!serverConnection && !serverRunning);
     disconnectButton_->SetVisible(serverConnection || serverRunning);
     disconnectButton_->SetVisible(serverConnection || serverRunning);
     startServerButton_->SetVisible(!serverConnection && !serverRunning);
     startServerButton_->SetVisible(!serverConnection && !serverRunning);
-    textEdit_->SetVisible(!serverConnection && !serverRunning);
+    serverAddress_->SetVisible(!serverConnection && !serverRunning);
+    serverPort_->SetVisible(!serverConnection && !serverRunning);
 }
 }
 
 
 Node* SceneReplication::CreateControllableObject()
 Node* SceneReplication::CreateControllableObject()
@@ -480,13 +490,13 @@ void SceneReplication::HandlePhysicsPreStep(StringHash eventType, VariantMap& ev
 void SceneReplication::HandleConnect(StringHash eventType, VariantMap& eventData)
 void SceneReplication::HandleConnect(StringHash eventType, VariantMap& eventData)
 {
 {
     auto* network = GetSubsystem<Network>();
     auto* network = GetSubsystem<Network>();
-    String address = textEdit_->GetText().Trimmed();
+    String address = serverAddress_->GetText().Trimmed();
     if (address.Empty())
     if (address.Empty())
         address = "127.0.0.1"; // Use localhost to connect if nothing else specified
         address = "127.0.0.1"; // Use localhost to connect if nothing else specified
 
 
     // Connect to server, specify scene to use as a client for replication
     // Connect to server, specify scene to use as a client for replication
     clientObjectID_ = 0; // Reset own object ID from possible previous connection
     clientObjectID_ = 0; // Reset own object ID from possible previous connection
-    network->ConnectWS(address, SERVER_PORT, scene_);
+    network->ConnectWS(address, ToInt(serverPort_->GetText()), scene_);
 
 
     UpdateButtons();
     UpdateButtons();
 }
 }

+ 3 - 1
Source/Samples/55_WebsocketsSceneReplication/SceneReplication.h

@@ -107,7 +107,9 @@ private:
     /// Button container element.
     /// Button container element.
     SharedPtr<UIElement> buttonContainer_;
     SharedPtr<UIElement> buttonContainer_;
     /// Server address line editor element.
     /// Server address line editor element.
-    SharedPtr<LineEdit> textEdit_;
+    SharedPtr<LineEdit> serverAddress_;
+    /// Server port
+    SharedPtr<LineEdit> serverPort_;
     /// Connect button.
     /// Connect button.
     SharedPtr<Button> connectButton_;
     SharedPtr<Button> connectButton_;
     /// Disconnect button.
     /// Disconnect button.

+ 9 - 2
Source/ThirdParty/libwebsockets/CMakeLists.txt

@@ -141,7 +141,7 @@ option(LWS_CTEST_INTERNET_AVAILABLE "CTest will performs tests that need the Int
 #
 #
 # TLS library options... all except mbedTLS are basically OpenSSL variants.
 # TLS library options... all except mbedTLS are basically OpenSSL variants.
 #
 #
-option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" OFF)
+option(LWS_WITH_SSL "Include SSL support (defaults to OpenSSL or similar, mbedTLS if LWS_WITH_MBEDTLS is set)" ON)
 option(LWS_WITH_MBEDTLS "Use mbedTLS (>=2.0) replacement for OpenSSL. When setting this, you also may need to specify LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS" OFF)
 option(LWS_WITH_MBEDTLS "Use mbedTLS (>=2.0) replacement for OpenSSL. When setting this, you also may need to specify LWS_MBEDTLS_LIBRARIES and LWS_MBEDTLS_INCLUDE_DIRS" OFF)
 option(LWS_WITH_BORINGSSL "Use BoringSSL replacement for OpenSSL" OFF)
 option(LWS_WITH_BORINGSSL "Use BoringSSL replacement for OpenSSL" OFF)
 option(LWS_WITH_CYASSL "Use CyaSSL replacement for OpenSSL. When setting this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF)
 option(LWS_WITH_CYASSL "Use CyaSSL replacement for OpenSSL. When setting this, you also need to specify LWS_CYASSL_LIBRARIES and LWS_CYASSL_INCLUDE_DIRS" OFF)
@@ -265,7 +265,14 @@ option(LWS_WITH_PLUGINS_API "Build generic lws_plugins apis (see LWS_WITH_PLUGIN
 set(LIB_LIST "")
 set(LIB_LIST "")
 set(LIB_LIST_AT_END)
 set(LIB_LIST_AT_END)
 set(LWS_LIBRARIES)
 set(LWS_LIBRARIES)
-set(LWS_OPENSSL_SUPPORT 0)
+
+# Modfied for Urho3D to allow building libwebsockets with SSL support
+if (URHO3D_SSL)
+	message(STATUS "Adding SSL support for libwebsockets")
+	set(LWS_OPENSSL_SUPPORT 1)
+	set(LWS_WITH_SSL 1)
+endif ()
+
 include(CMakeLists-implied-options.txt)
 include(CMakeLists-implied-options.txt)
 
 
 #
 #

+ 0 - 197
Source/ThirdParty/libwebsockets/include/lws_config.h

@@ -1,197 +0,0 @@
-/* lws_config.h  Generated from lws_config.h.in  */
-
-#ifndef NDEBUG
-#ifndef _DEBUG
-#define _DEBUG
-#endif
-#endif
-
-#define LWS_INSTALL_DATADIR "/usr/local/share"
-#define LWS_INSTALL_LIBDIR "/usr/local/lib"
-#define LWS_LIBRARY_VERSION_MAJOR 4
-#define LWS_LIBRARY_VERSION_MINOR 1
-#define LWS_LIBRARY_VERSION_PATCH_ELABORATED 99-1.8-ALPHA-201-gdc271bf22
-#define LWS_LIBRARY_VERSION_PATCH 99
-
-/* LWS_LIBRARY_VERSION_NUMBER looks like 1005001 for e.g. version 1.5.1 */
-#define LWS_LIBRARY_VERSION_NUMBER (LWS_LIBRARY_VERSION_MAJOR * 1000000) + \
-					(LWS_LIBRARY_VERSION_MINOR * 1000) + \
-					LWS_LIBRARY_VERSION_PATCH
-#define LWS_MAX_SMP 1
-
-/* #undef LWS_ESP_PLATFORM */
-/* #undef LWS_LIBRARY_VERSION_NUMBER */
-
-/* #undef LWS_EXT_PTHREAD_LIBRARIES */
-
-/* #undef LWS_AVOID_SIGPIPE_IGN */
-#define LWS_BUILD_HASH "1.8-ALPHA-201-gdc271bf22"
-/* #undef LWS_BUILTIN_GETIFADDRS */
-#define LWS_CLIENT_HTTP_PROXYING
-/* #undef LWS_DETECTED_PLAT_IOS */
-/* #undef LWS_FALLBACK_GETHOSTBYNAME */
-#define LWS_HAS_INTPTR_T
-#define LWS_HAS_GETOPT_LONG
-/* #undef LWS_HAVE__ATOI64 */
-#define LWS_HAVE_ATOLL
-/* #undef LWS_HAVE_BN_bn2binpad */
-#define LWS_HAVE_CLOCK_GETTIME
-/* #undef LWS_HAVE_EC_POINT_get_affine_coordinates */
-/* #undef LWS_HAVE_ECDSA_SIG_set0 */
-/* #undef LWS_HAVE_EVP_MD_CTX_free */
-/* #undef LWS_HAVE_EVP_aes_128_wrap */
-/* #undef LWS_HAVE_EVP_aes_128_cfb8 */
-/* #undef LWS_HAVE_EVP_aes_128_cfb128 */
-/* #undef LWS_HAVE_EVP_aes_192_cfb8 */
-/* #undef LWS_HAVE_EVP_aes_192_cfb128 */
-/* #undef LWS_HAVE_EVP_aes_256_cfb8 */
-/* #undef LWS_HAVE_EVP_aes_256_cfb128 */
-/* #undef LWS_HAVE_EVP_aes_128_xts */
-/* #undef LWS_HAVE_EVP_PKEY_new_raw_private_key */
-/* #undef LWS_HAVE_EXECVPE */
-/* #undef LWS_HAVE_LIBCAP */
-/* #undef LWS_HAVE_HMAC_CTX_new */
-/* #undef LWS_HAVE_MALLOC_H */
-/* #undef LWS_HAVE_MALLOC_TRIM */
-/* #undef LWS_HAVE_MALLOC_USABLE_SIZE */
-/* #undef LWS_HAVE_mbedtls_md_setup */
-/* #undef LWS_HAVE_mbedtls_net_init */
-/* #undef LWS_HAVE_mbedtls_rsa_complete */
-/* #undef LWS_HAVE_mbedtls_internal_aes_encrypt */
-/* #undef LWS_HAVE_mbedtls_ssl_conf_alpn_protocols */
-/* #undef LWS_HAVE_mbedtls_ssl_get_alpn_protocol */
-/* #undef LWS_HAVE_mbedtls_ssl_conf_sni */
-/* #undef LWS_HAVE_mbedtls_ssl_set_hs_ca_chain */
-/* #undef LWS_HAVE_mbedtls_ssl_set_hs_own_cert */
-/* #undef LWS_HAVE_mbedtls_ssl_set_hs_authmode */
-/* #undef LWS_HAVE_MBEDTLS_NET_SOCKETS */
-/* #undef LWS_HAVE_NEW_UV_VERSION_H */
-/* #undef LWS_HAVE_OPENSSL_ECDH_H */
-/* #undef LWS_HAVE_PIPE2 */
-/* #undef LWS_HAVE_EVENTFD */
-#define LWS_HAVE_PTHREAD_H
-/* #undef LWS_HAVE_RSA_SET0_KEY */
-/* #undef LWS_HAVE_RSA_verify_pss_mgf1 */
-/* #undef LWS_HAVE_SSL_CTX_get0_certificate */
-/* #undef LWS_HAVE_SSL_CTX_load_verify_file */
-/* #undef LWS_HAVE_SSL_CTX_load_verify_dir */
-/* #undef LWS_HAVE_SSL_CTX_set1_param */
-/* #undef LWS_HAVE_SSL_CTX_set_ciphersuites */
-/* #undef LWS_HAVE_SSL_EXTRA_CHAIN_CERTS */
-/* #undef LWS_HAVE_SSL_get0_alpn_selected */
-/* #undef LWS_HAVE_SSL_CTX_EVP_PKEY_new_raw_private_key */
-/* #undef LWS_HAVE_SSL_set_alpn_protos */
-/* #undef LWS_HAVE_SSL_SET_INFO_CALLBACK */
-/* #undef LWS_HAVE__STAT32I64 */
-#define LWS_HAVE_STDINT_H
-/* #undef LWS_HAVE_SYS_CAPABILITY_H */
-/* #undef LWS_HAVE_TLS_CLIENT_METHOD */
-/* #undef LWS_HAVE_TLSV1_2_CLIENT_METHOD */
-/* #undef LWS_HAVE_UV_VERSION_H */
-#define LWS_HAVE_VFORK
-/* #undef LWS_HAVE_X509_get_key_usage */
-/* #undef LWS_HAVE_X509_VERIFY_PARAM_set1_host */
-#define LWS_LIBRARY_VERSION "4.1.99-1.8-ALPHA-201-gdc271bf22"
-#define LWS_LOGGING_BITFIELD_CLEAR 0
-#define LWS_LOGGING_BITFIELD_SET 0
-/* #undef LWS_MINGW_SUPPORT */
-/* #undef LWS_NO_CLIENT */
-#define LWS_NO_DAEMONIZE
-/* #undef LWS_OPENSSL_CLIENT_CERTS */
-/* #undef LWS_OPENSSL_SUPPORT */
-/* #undef LWS_PLAT_OPTEE */
-#define LWS_PLAT_UNIX
-/* #undef LWS_PLAT_FREERTOS */
-/* #undef LWS_ROLE_CGI */
-/* #undef LWS_ROLE_DBUS */
-#define LWS_ROLE_H1
-/* #undef LWS_ROLE_H2 */
-#define LWS_ROLE_RAW
-/* #undef LWS_ROLE_RAW_FILE */
-/* #undef LWS_ROLE_RAW_PROXY */
-#define LWS_ROLE_WS
-/* #undef LWS_ROLE_MQTT */
-/* #undef LWS_SHA1_USE_OPENSSL_NAME */
-/* #undef LWS_SSL_CLIENT_USE_OS_CA_CERTS */
-/* #undef LWS_SSL_SERVER_WITH_ECDH_CERT */
-/* #undef LWS_WITH_ABSTRACT */
-/* #undef LWS_WITH_ACCESS_LOG */
-/* #undef LWS_WITH_ACME */
-/* #undef LWS_WITH_ALSA */
-/* #undef LWS_WITH_SYS_ASYNC_DNS */
-/* #undef LWS_WITH_BORINGSSL */
-/* #undef LWS_WITH_CGI */
-#define LWS_WITH_CUSTOM_HEADERS
-/* #undef LWS_WITH_DEPRECATED_LWS_DLL */
-/* #undef LWS_WITH_DETAILED_LATENCY */
-#define LWS_WITH_DIR
-/* #undef LWS_WITH_DRIVERS */
-/* #undef LWS_WITH_ESP32 */
-/* #undef LWS_HAVE_EVBACKEND_LINUXAIO */
-/* #undef LWS_HAVE_EVBACKEND_IOURING */
-/* #undef LWS_WITH_EXTERNAL_POLL */
-#define LWS_WITH_FILE_OPS
-/* #undef LWS_WITH_FSMOUNT */
-/* #undef LWS_WITH_FTS */
-/* #undef LWS_WITH_GENCRYPTO */
-/* #undef LWS_WITH_GENERIC_SESSIONS */
-/* #undef LWS_WITH_GLIB */
-/* #undef LWS_WITH_GTK */
-/* #undef LWS_WITH_HTTP2 */
-/* #undef LWS_WITH_HTTP_BASIC_AUTH */
-/* #undef LWS_WITH_HTTP_BROTLI */
-/* #undef LWS_HTTP_HEADERS_ALL */
-/* #undef LWS_WITH_HTTP_PROXY */
-/* #undef LWS_WITH_HTTP_STREAM_COMPRESSION */
-#define LWS_WITH_HTTP_UNCOMMON_HEADERS
-/* #undef LWS_WITH_IPV6 */
-/* #undef LWS_WITH_JOSE */
-#define LWS_WITH_LEJP
-/* #undef LWS_WITH_LIBEV */
-/* #undef LWS_WITH_LIBEVENT */
-/* #undef LWS_WITH_LIBUV */
-#define LWS_WITH_LWSAC
-#define LWS_LOGS_TIMESTAMP
-/* #undef LWS_WITH_MBEDTLS */
-/* #undef LWS_WITH_MINIZ */
-#define LWS_WITH_NETWORK
-/* #undef LWS_WITH_NO_LOGS */
-#define LWS_WITH_CLIENT
-#define LWS_WITHOUT_EXTENSIONS
-#define LWS_WITH_SERVER
-/* #undef LWS_WITH_SPAWN */
-/* #undef LWS_WITH_PEER_LIMITS */
-/* #undef LWS_WITH_PLUGINS */
-/* #undef LWS_WITH_POLARSSL */
-#define LWS_WITH_POLL
-/* #undef LWS_WITH_RANGES */
-/* #undef LWS_WITH_SECURE_STREAMS */
-/* #undef LWS_WITH_SECURE_STREAMS_SYS_AUTH_API_AMAZON_COM */
-/* #undef LWS_WITH_SECURE_STREAMS_PROXY_API */
-/* #undef LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY */
-/* #undef LWS_WITH_SELFTESTS */
-#define LWS_WITH_SEQUENCER
-/* #undef LWS_WITH_SERVER_STATUS */
-#define LWS_WITH_SYS_SMD
-/* #undef LWS_WITH_SMTP */
-/* #undef LWS_WITH_SOCKS5 */
-/* #undef LWS_WITH_STATEFUL_URLDECODE */
-/* #undef LWS_WITH_STATS */
-/* #undef LWS_WITH_STRUCT_SQLITE3 */
-/* #undef LWS_WITH_STRUCT_JSON */
-/* #undef LWS_WITH_SQLITE3 */
-/* #undef LWS_WITH_SYS_NTPCLIENT */
-/* #undef LWS_WITH_SYS_DHCP_CLIENT */
-#define LWS_WITH_SYS_STATE
-/* #undef LWS_WITH_THREADPOOL */
-/* #undef LWS_WITH_TLS */
-#define LWS_WITH_UDP
-#define LWS_WITH_UNIX_SOCK
-/* #undef LWS_WITH_ZIP_FOPS */
-/* #undef USE_OLD_CYASSL */
-/* #undef USE_WOLFSSL */
-/* #undef LWS_WITH_EVENT_LIBS */
-/* #undef LWS_WITH_EVLIB_PLUGINS */
-/* #undef LWS_WITH_LIBUV_INTERNAL */
-/* #undef LWS_WITH_PLUGINS_API */
-

+ 1 - 1
Source/Urho3D/CMakeLists.txt

@@ -272,7 +272,7 @@ if (URHO3D_PHYSICS)
     list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Bullet)
     list (APPEND INCLUDE_DIRS ${THIRD_PARTY_INCLUDE_DIR}/Bullet)
 endif ()
 endif ()
 if (URHO3D_WEBSOCKETS)
 if (URHO3D_WEBSOCKETS)
-    list (APPEND INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/Source/ThirdParty/libwebsockets/include)
+    list (APPEND INCLUDE_DIRS ${CMAKE_BINARY_DIR}/Source/ThirdParty/libwebsockets/include)
     add_definitions (-DURHO3D_WEBSOCKETS)
     add_definitions (-DURHO3D_WEBSOCKETS)
 else ()
 else ()
 endif ()
 endif ()

+ 1 - 2
Source/Urho3D/Network/Connection.cpp

@@ -38,7 +38,7 @@
 #include "../Scene/SceneEvents.h"
 #include "../Scene/SceneEvents.h"
 #include "../Scene/SmoothedTransform.h"
 #include "../Scene/SmoothedTransform.h"
 
 
-#ifndef __EMSCRIPTEN__ 1
+#ifndef __EMSCRIPTEN__
 #include <SLikeNet/MessageIdentifiers.h>
 #include <SLikeNet/MessageIdentifiers.h>
 #include <SLikeNet/peerinterface.h>
 #include <SLikeNet/peerinterface.h>
 #include <SLikeNet/statistics.h>
 #include <SLikeNet/statistics.h>
@@ -536,7 +536,6 @@ bool Connection::ProcessMessage(int msgID, MemoryBuffer& buffer)
         return true;
         return true;
     }
     }
 
 
-    URHO3D_LOGINFOF("Server: %d", isClient_);
     while (!buffer.IsEof()) {
     while (!buffer.IsEof()) {
         msgID = buffer.ReadUInt();
         msgID = buffer.ReadUInt();
         unsigned int packetSize = buffer.ReadUInt();
         unsigned int packetSize = buffer.ReadUInt();

+ 7 - 5
Source/Urho3D/Network/WS/WSClient.cpp

@@ -66,10 +66,7 @@ static Urho3D::WSClient* WSClientInstance = nullptr;
 static struct lws *client_wsi;
 static struct lws *client_wsi;
 static lws_sorted_usec_list_t sul;
 static lws_sorted_usec_list_t sul;
 static struct lws_context *wsContext;
 static struct lws_context *wsContext;
-static const lws_retry_bo_t retry = {
-        .secs_since_valid_ping = 3,
-        .secs_since_valid_hangup = 10,
-};
+static lws_retry_bo_t retry{};
 
 
 /// Connect to server with retry functionality
 /// Connect to server with retry functionality
 static void ConnectToServer(lws_sorted_usec_list_t *_sul)
 static void ConnectToServer(lws_sorted_usec_list_t *_sul)
@@ -88,6 +85,9 @@ static void ConnectToServer(lws_sorted_usec_list_t *_sul)
 
 
     info.local_protocol_name = "ws_client";
     info.local_protocol_name = "ws_client";
     info.pwsi = &client_wsi;
     info.pwsi = &client_wsi;
+    retry.secs_since_valid_ping = 3;
+    retry.secs_since_valid_ping = 10;
+
     info.retry_and_idle_policy = &retry;
     info.retry_and_idle_policy = &retry;
 
 
     if (!lws_client_connect_via_info(&info))
     if (!lws_client_connect_via_info(&info))
@@ -114,7 +114,6 @@ static int WSCallback(struct lws *wsi, enum lws_callback_reasons reason, void *u
             break;
             break;
 
 
         case LWS_CALLBACK_CLIENT_RECEIVE: {
         case LWS_CALLBACK_CLIENT_RECEIVE: {
-            URHO3D_LOGINFOF("Received buffer of size %d", len);
             Urho3D::VectorBuffer b((unsigned char*)in, len);
             Urho3D::VectorBuffer b((unsigned char*)in, len);
             if (b.GetData()[0] == URHO3D_MESSAGE) {
             if (b.GetData()[0] == URHO3D_MESSAGE) {
                 WSPacket packet(wsi, b);
                 WSPacket packet(wsi, b);
@@ -362,11 +361,14 @@ void WSClient::Update(float timestep)
         GetSubsystem<Network>()->OnServerConnected(GetWSConnection());
         GetSubsystem<Network>()->OnServerConnected(GetWSConnection());
         URHO3D_LOGINFOF("WSclient OnServerConnected");
         URHO3D_LOGINFOF("WSclient OnServerConnected");
     }
     }
+
     if (nextState_ == WCS_DISCONNECTED) {
     if (nextState_ == WCS_DISCONNECTED) {
         GetSubsystem<Network>()->OnServerDisconnected(GetWSConnection(), false);
         GetSubsystem<Network>()->OnServerDisconnected(GetWSConnection(), false);
+        return;
     }
     }
     if (nextState_ == WCS_CONNECTION_FAILED) {
     if (nextState_ == WCS_CONNECTION_FAILED) {
         GetSubsystem<Network>()->OnServerDisconnected(GetWSConnection(), true);
         GetSubsystem<Network>()->OnServerDisconnected(GetWSConnection(), true);
+        return;
     }
     }
 
 
 #ifndef __EMSCRIPTEN__
 #ifndef __EMSCRIPTEN__