Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package qt6-websockets for openSUSE:Factory checked in at 2026-03-28 20:12:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/qt6-websockets (Old) and /work/SRC/openSUSE:Factory/.qt6-websockets.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qt6-websockets" Sat Mar 28 20:12:55 2026 rev:34 rq:1342823 version:6.11.0 Changes: -------- --- /work/SRC/openSUSE:Factory/qt6-websockets/qt6-websockets.changes 2026-02-03 21:28:52.006001798 +0100 +++ /work/SRC/openSUSE:Factory/.qt6-websockets.new.8177/qt6-websockets.changes 2026-03-28 20:13:53.290752944 +0100 @@ -1,0 +2,6 @@ +Mon Mar 23 10:37:57 UTC 2026 - Christophe Marin <[email protected]> + +- Update to 6.11.0 + https://www.qt.io/blog/qt-6.11-released + +------------------------------------------------------------------- Old: ---- qtwebsockets-everywhere-src-6.10.2.tar.xz New: ---- qtwebsockets-everywhere-src-6.11.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ qt6-websockets.spec ++++++ --- /var/tmp/diff_new_pack.9tYaHc/_old 2026-03-28 20:13:54.090785962 +0100 +++ /var/tmp/diff_new_pack.9tYaHc/_new 2026-03-28 20:13:54.094786128 +0100 @@ -1,7 +1,7 @@ # # spec file for package qt6-websockets # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,8 +16,8 @@ # -%define real_version 6.10.2 -%define short_version 6.10 +%define real_version 6.11.0 +%define short_version 6.11 %define tar_name qtwebsockets-everywhere-src %define tar_suffix %{nil} # @@ -27,7 +27,7 @@ %endif # Name: qt6-websockets%{?pkg_suffix} -Version: 6.10.2 +Version: 6.11.0 Release: 0 Summary: Qt 6 WebSockets library License: GPL-2.0-only OR GPL-3.0-or-later OR LGPL-3.0-only ++++++ qtwebsockets-everywhere-src-6.10.2.tar.xz -> qtwebsockets-everywhere-src-6.11.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/.cmake.conf new/qtwebsockets-everywhere-src-6.11.0/.cmake.conf --- old/qtwebsockets-everywhere-src-6.10.2/.cmake.conf 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/.cmake.conf 2026-03-10 06:07:38.000000000 +0100 @@ -1,7 +1,9 @@ -set(QT_REPO_MODULE_VERSION "6.10.2") +set(QT_REPO_MODULE_VERSION "6.11.0") set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") set(QT_EXTRA_INTERNAL_TARGET_DEFINES + "QT_NO_CONTEXTLESS_CONNECT=1" "QT_NO_FOREACH=1" "QT_NO_QASCONST=1" + "QT_NO_URL_CAST_FROM_STRING=1" "QT_USE_NODISCARD_FILE_OPEN=1" ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/.tag new/qtwebsockets-everywhere-src-6.11.0/.tag --- old/qtwebsockets-everywhere-src-6.10.2/.tag 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/.tag 2026-03-10 06:07:38.000000000 +0100 @@ -1 +1 @@ -2b969cb983d1e22df0e6fc6ece54043942090bd8 +882f182c8bb5d249ecd97601557ab0e671bdf520 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/CMakeLists.txt new/qtwebsockets-everywhere-src-6.11.0/CMakeLists.txt --- old/qtwebsockets-everywhere-src-6.10.2/CMakeLists.txt 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/CMakeLists.txt 2026-03-10 06:07:38.000000000 +0100 @@ -16,10 +16,15 @@ # Make sure we use the fixed BASE argument of qt_add_resource. set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE) -find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core Network) # special case -find_package(Qt6 ${PROJECT_VERSION} CONFIG OPTIONAL_COMPONENTS Quick QuickTest) # special case +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals) + +# This should be called as early as possible, just after find_package(BuildInternals) where it is +# defined. qt_internal_project_setup() +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS Core Network) +find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS Quick QuickTest) + if(NOT TARGET Qt::Network) message(NOTICE "Skipping the build as the condition \"TARGET Qt::Network\" is not met.") return() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/REUSE.toml new/qtwebsockets-everywhere-src-6.11.0/REUSE.toml --- old/qtwebsockets-everywhere-src-6.10.2/REUSE.toml 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/REUSE.toml 2026-03-10 06:07:38.000000000 +0100 @@ -4,54 +4,54 @@ path = ["src/imports/qmlwebsockets/plugins.qmltypes"] precedence = "closest" comment = "source and plugins" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only" [[annotations]] path = ["tests/**.txt", "tests/**.cert", "tests/**.key"] precedence = "closest" comment = "test" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only" [[annotations]] path = ["**.pro", ".cmake.conf", "**.yaml", "**.json", "**.cfg", "**BLACKLIST", ".tag"] precedence = "closest" comment = "build system" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "BSD-3-Clause" [[annotations]] path = ["**/.gitattributes", "**.gitignore", "**.gitreview"] precedence = "closest" comment = "version control system. Infrastructure" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause" [[annotations]] path = ["examples/**"] comment = "this must be after the build system table because example and snippets take precedence over build system" precedence = "closest" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause" [[annotations]] path = ["**/doc/images/**", "**/README*", "**.qdocconf"] comment = "documentation" precedence = "closest" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only" [[annotations]] path = ["**.toml", "licenseRule.json"] precedence = "override" comment = "infrastructure" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause" [[annotations]] path = ["**/qt_attribution.json"] precedence = "override" comment = "documentation" -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/dependencies.yaml new/qtwebsockets-everywhere-src-6.11.0/dependencies.yaml --- old/qtwebsockets-everywhere-src-6.10.2/dependencies.yaml 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/dependencies.yaml 2026-03-10 06:07:38.000000000 +0100 @@ -1,7 +1,7 @@ dependencies: ../qtbase: - ref: 000d6c62f7880bb8d3054724e8da0b8ae244130e + ref: 8ba7ea4b77a4b8f1948760221e264917ddc9e1c8 required: true ../qtdeclarative: - ref: 09c70541c76659bcd8c49f05841b0e778c9ffd4c + ref: e602a097ca314e9610b1fd3b7dbfa467a868731a required: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/dist/REUSE.toml new/qtwebsockets-everywhere-src-6.11.0/dist/REUSE.toml --- old/qtwebsockets-everywhere-src-6.10.2/dist/REUSE.toml 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/dist/REUSE.toml 2026-03-10 06:07:38.000000000 +0100 @@ -4,5 +4,5 @@ path = ["*"] precedence = "override" comment = "Licensed as documentation." -SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." +SPDX-FileCopyrightText = "Copyright (C) The Qt Company Ltd." SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/qt_cmdline.cmake new/qtwebsockets-everywhere-src-6.11.0/qt_cmdline.cmake --- old/qtwebsockets-everywhere-src-6.10.2/qt_cmdline.cmake 1970-01-01 01:00:00.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/qt_cmdline.cmake 2026-03-10 06:07:38.000000000 +0100 @@ -0,0 +1,4 @@ +# Copyright (C) 2026 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_commandline_subconfig(src/websockets) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/CMakeLists.txt new/qtwebsockets-everywhere-src-6.11.0/src/CMakeLists.txt --- old/qtwebsockets-everywhere-src-6.10.2/src/CMakeLists.txt 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/CMakeLists.txt 2026-03-10 06:07:38.000000000 +0100 @@ -1,9 +1,7 @@ # Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause -# Generated from src.pro. - add_subdirectory(websockets) -if(TARGET Qt::Quick) +if(QT_FEATURE_websockets_qml) add_subdirectory(imports) endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/imports/qmlwebsockets/qqmlwebsocket.cpp new/qtwebsockets-everywhere-src-6.11.0/src/imports/qmlwebsockets/qqmlwebsocket.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/imports/qmlwebsockets/qqmlwebsocket.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/imports/qmlwebsockets/qqmlwebsocket.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -23,18 +23,38 @@ */ /*! + \property QQmlWebSocket::url + \brief the server URL to connect to. + + The URL must have one of 2 schemes: \c{ws://} or \c{wss://}. + When not supplied, \c{ws://} is used. +*/ + +/*! \qmlproperty list<string> WebSocket::requestedSubprotocols \since 6.4 The list of WebSocket subprotocols to send in the WebSocket handshake. */ /*! + \property QQmlWebSocket::requestedSubprotocols + \since 6.4 + \brief the list of WebSocket subprotocols to send in the WebSocket handshake. +*/ + +/*! \qmlproperty string WebSocket::negotiatedSubprotocol \since 6.4 The WebSocket subprotocol that has been negotiated with the server. */ /*! + \property QQmlWebSocket::negotiatedSubprotocol + \since 6.4 + \brief the WebSocket subprotocol that has been negotiated with the server. +*/ + +/*! \qmlproperty Status WebSocket::status Status of the WebSocket. @@ -49,12 +69,24 @@ */ /*! + \property QQmlWebSocket::status + \brief the status of the WebSocket. +*/ + +/*! \qmlproperty string WebSocket::errorString Contains a description of the last error that occurred. When no error occurrred, this string is empty. */ /*! + \property QQmlWebSocket::errorString + \brief a description of the last error that occurred. + + When no error occurred, this string is empty. +*/ + +/*! \qmlproperty bool WebSocket::active When set to true, a connection is made to the server with the given url. When set to false, the connection is closed. @@ -62,6 +94,15 @@ */ /*! + \property QQmlWebSocket::active + \brief whether the WebSocket connection is active. + + When set to \c true, a connection is made to the server with the given URL. + When set to \c false, the connection is closed. + The default value is \c false. +*/ + +/*! \qmlsignal WebSocket::textMessageReceived(QString message) This signal is emitted when a text message is received. \a message contains the bytes received. @@ -125,6 +166,11 @@ QT_BEGIN_NAMESPACE +/*! + \class QQmlWebSocket + \inmodule QtWebSockets + \internal +*/ QQmlWebSocket::QQmlWebSocket(QObject *parent) : QObject(parent), m_webSocket(), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/imports/qmlwebsockets/qqmlwebsocketserver.cpp new/qtwebsockets-everywhere-src-6.11.0/src/imports/qmlwebsockets/qqmlwebsocketserver.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/imports/qmlwebsockets/qqmlwebsocketserver.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/imports/qmlwebsockets/qqmlwebsocketserver.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -8,6 +8,12 @@ QT_USE_NAMESPACE /*! + \class QQmlWebSocketServer + \inmodule QtWebSockets + \internal +*/ + +/*! \qmltype WebSocketServer \nativetype QQmlWebSocketServer \since 5.3 @@ -24,11 +30,26 @@ */ /*! + \property QQmlWebSocketServer::url + \brief the server URL that client WebSockets can connect to. + + The URL uses the \c{ws://} scheme and includes the port the server listens to + and the host address of the server. +*/ + +/*! \qmlproperty string WebSocketServer::host The host address of the server. By default, localhost is used. */ /*! + \property QQmlWebSocketServer::host + \brief the host address of the server. + + By default, localhost is used. +*/ + +/*! \qmlproperty int WebSocketServer::port The port this server is listening on. The value must be in the range 0-65535. @@ -36,22 +57,46 @@ */ /*! + \property QQmlWebSocketServer::port + \brief the port this server is listening on. + + The value must be in the range 0-65535. + By default, a port is chosen automatically. +*/ + +/*! \qmlproperty string WebSocketServer::name The name of this server used during the http handshake phase. */ /*! + \property QQmlWebSocketServer::name + \brief the name of this server used during the HTTP handshake phase. +*/ + +/*! \qmlproperty list<string> WebSocketServer::supportedSubprotocols \since 6.4 The list of protocols supported by the server. */ /*! + \property QQmlWebSocketServer::supportedSubprotocols + \since 6.4 + \brief the list of protocols supported by the server. +*/ + +/*! \qmlproperty string WebSocketServer::errorString The stringified error message in case an error occurred. */ /*! + \property QQmlWebSocketServer::errorString + \brief the error message string in case an error occurred. +*/ + +/*! \qmlproperty bool WebSocketServer::listen Set to true when the server should listen to client connections or false otherwise. When set to true, the server will listen on the specified url defined by host and port @@ -60,12 +105,31 @@ */ /*! + \property QQmlWebSocketServer::listen + \brief whether the server should listen to client connections. + + Set to \c true when the server should listen to client connections or \c false otherwise. + When set to \c true, the server will listen on the specified URL defined by host and port + and, when accept is \c true, accepts incoming client connections. Otherwise the server is closed. + By default, the server is not listening. +*/ + +/*! \qmlproperty bool WebSocketServer::accept Set to true to accept incoming client connections when the server is listening. When set to false, incoming connections are rejected. By default, connections are accepted. */ /*! + \property QQmlWebSocketServer::accept + \brief whether to accept incoming client connections. + + Set to \c true to accept incoming client connections when the server is listening. + When set to \c false, incoming connections are rejected. + By default, connections are accepted. +*/ + +/*! \qmlsignal WebSocketServer::clientConnected(WebSocket webSocket) This signal is emitted when a client connects to this server. \a webSocket is the newly created \l [QML]{WebSocket}. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/configure.cmake new/qtwebsockets-everywhere-src-6.11.0/src/websockets/configure.cmake --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/configure.cmake 1970-01-01 01:00:00.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/configure.cmake 2026-03-10 06:07:38.000000000 +0100 @@ -0,0 +1,28 @@ +# Copyright (C) 2026 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + + + +#### Inputs + + + +#### Libraries + + + +#### Tests + + + +#### Features + +qt_feature("websockets-qml" PUBLIC + LABEL "WebSocket QML Type" + PURPOSE "Provides QML Type for Qt WebSockets." + CONDITION TARGET Qt::Quick +) + +qt_configure_add_summary_section(NAME "Qt WebSockets") +qt_configure_add_summary_entry(ARGS "websockets-qml") +qt_configure_end_summary_section() # end of "Qt WebSockets" section diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocket_p.cpp new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocket_p.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocket_p.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocket_p.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -740,6 +740,9 @@ // being disconnected with the wildcard disconnect below disconnect(pTcpSocket, &QObject::destroyed, this, &QWebSocketPrivate::socketDestroyed); pTcpSocket->disconnect(); + // Re-connect, we need 'socketDestroyed' slot executed + QObjectPrivate::connect(pTcpSocket, &QObject::destroyed, + this, &QWebSocketPrivate::socketDestroyed); } m_dataProcessor->disconnect(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketcorsauthenticator.cpp new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketcorsauthenticator.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketcorsauthenticator.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketcorsauthenticator.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -35,6 +35,12 @@ QT_BEGIN_NAMESPACE /*! + \class QWebSocketCorsAuthenticatorPrivate + \inmodule QtWebSockets + \internal +*/ + +/*! \internal */ QWebSocketCorsAuthenticatorPrivate::QWebSocketCorsAuthenticatorPrivate(const QString &origin, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketdataprocessor.cpp new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketdataprocessor.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketdataprocessor.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketdataprocessor.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -182,19 +182,12 @@ bool isFinalFrame = frame.isFinalFrame(); if (m_opCode == QWebSocketProtocol::OpCodeText) { QString frameTxt = m_decoder(frame.payload()); - if (frame.isFinalFrame()) { - // ### We lack API on the QStringDecoder to check if there is an incomplete - // sequence inside its state object. But we need to make sure we are not - // passing on an empty, or potentially corrupted message to our users. - // By forcing the decoder to process a 0-byte we force it to evaluate the - // current state as the full sequence, making it process it as an error if - // it's not complete. - frameTxt += m_decoder(QByteArrayView("\0", 1)); - // As a downside, we then always have to remove the 0-byte that we just - // added: - frameTxt.chop(1); + bool decoderHadError = m_decoder.hasError(); + if (!decoderHadError && isFinalFrame) { + auto r = m_decoder.finalize(); + decoderHadError = r.error != QStringDecoder::FinalizeResult::Error::NoError; } - if (Q_UNLIKELY(m_decoder.hasError())) { + if (Q_UNLIKELY(decoderHadError)) { clear(); Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeWrongDatatype, tr("Invalid UTF-8 code encountered.")); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver.cpp new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -146,16 +146,45 @@ /*! \fn void QWebSocketServer::sslErrors(const QList<QSslError> &errors) +//! [ssl-errors-1] QWebSocketServer emits this signal after the SSL handshake to indicate that one or more errors have occurred while establishing the identity of the - peer. The errors are usually an indication that QWebSocketServer is unable to + peer. +//! [ssl-errors-1] + + The errors are usually an indication that QWebSocketServer is unable to securely identify the peer. Unless any action is taken, the connection will be dropped after this signal has been emitted. +//! [ssl-errors-2] \a errors contains one or more errors that prevent QSslSocket from verifying the identity of the peer. +//! [ssl-errors-2] + + \sa peerVerifyError(), sslErrorsOccurred() +*/ + +/*! + \fn void QWebSocketServer::sslErrorsOccurred(QSslSocket *socket, const QList<QSslError> &errors); + \since 6.11 + + \include qwebsocketserver.cpp ssl-errors-1 + + The errors are usually an indication that \a socket is unable to + securely identify the peer. Unless any action is taken, the connection + will be dropped after this signal has been emitted. + + \include qwebsocketserver.cpp ssl-errors-2 + + If you want to continue connecting despite the errors that have occurred, + you must call QSslSocket::ignoreSslErrors() from inside a slot connected to + this signal. If you need to access the error list at a later point, you + can call QSslSocket::sslHandshakeErrors(). + + \note You cannot use Qt::QueuedConnection when connecting to this signal, + or calling QSslSocket::ignoreSslErrors() will have no effect. - \sa peerVerifyError() + \sa peerVerifyError(), sslErrors() */ /*! diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver.h new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver.h --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver.h 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver.h 2026-03-10 06:07:38.000000000 +0100 @@ -121,6 +121,7 @@ #ifndef QT_NO_SSL void peerVerifyError(const QSslError &error); void sslErrors(const QList<QSslError> &errors); + void sslErrorsOccurred(QSslSocket *socket, const QList<QSslError> &errors); void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator); void alertSent(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description); void alertReceived(QSsl::AlertLevel level, QSsl::AlertType type, const QString &description); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver_p.cpp new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver_p.cpp --- old/qtwebsockets-everywhere-src-6.10.2/src/websockets/qwebsocketserver_p.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/src/websockets/qwebsocketserver_p.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -73,8 +73,8 @@ }); QObject::connect(pSslServer, &QSslServer::sslErrors, q, [q](QSslSocket *socket, const QList<QSslError> &errors) { - Q_UNUSED(socket); Q_EMIT q->sslErrors(errors); + Q_EMIT q->sslErrorsOccurred(socket, errors); }); QObject::connect(pSslServer, &QSslServer::preSharedKeyAuthenticationRequired, q, [q](QSslSocket *socket, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/CMakeLists.txt new/qtwebsockets-everywhere-src-6.11.0/tests/auto/CMakeLists.txt --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/CMakeLists.txt 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/CMakeLists.txt 2026-03-10 06:07:38.000000000 +0100 @@ -3,6 +3,6 @@ add_subdirectory(cmake) add_subdirectory(websockets) -if(TARGET Qt::Quick) +if(TARGET Qt::Quick AND TARGET Qt::QuickTest) add_subdirectory(qml) endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -1853,7 +1853,7 @@ QWebSocketDataProcessor dataProcessor; dataProcessor.setIdleTimeout(DefaultIdleTimeout); connect(&dataProcessor, &QWebSocketDataProcessor::binaryMessageReceived, - [&binaryData](const QByteArray &message) + this, [&binaryData](const QByteArray &message) { QCOMPARE(message, binaryData); QEventLoop loop; @@ -1872,7 +1872,7 @@ QTimer timer; timer.setSingleShot(true); - connect(&timer, &QTimer::timeout, processData); + connect(&timer, &QTimer::timeout, this, processData); timer.start(1000); processData(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/qwebsocketserver/CMakeLists.txt new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/qwebsocketserver/CMakeLists.txt --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/qwebsocketserver/CMakeLists.txt 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/qwebsocketserver/CMakeLists.txt 2026-03-10 06:07:38.000000000 +0100 @@ -19,6 +19,8 @@ set(qwebsocketshared_resource_files "../shared/localhost.cert" "../shared/localhost.key" + "../shared/selfsigned.cert" + "../shared/selfsigned.key" ) qt_internal_add_resource(tst_qwebsocketserver "qwebsocketshared" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/qwebsocketserver/tst_qwebsocketserver.cpp new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/qwebsocketserver/tst_qwebsocketserver.cpp --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/qwebsocketserver/tst_qwebsocketserver.cpp 2026-01-22 20:42:14.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/qwebsocketserver/tst_qwebsocketserver.cpp 2026-03-10 06:07:38.000000000 +0100 @@ -18,6 +18,8 @@ #include <QtWebSockets/QWebSocketCorsAuthenticator> #include <QtWebSockets/qwebsocketprotocol.h> +using namespace Qt::StringLiterals; + QT_USE_NAMESPACE Q_DECLARE_METATYPE(QWebSocketProtocol::Version) @@ -289,6 +291,7 @@ #ifndef QT_NO_SSL QSignalSpy peerVerifyErrorSpy(&server, SIGNAL(peerVerifyError(QSslError))); QSignalSpy sslErrorsSpy(&server, SIGNAL(sslErrors(QList<QSslError>))); + QSignalSpy sslErrorsOccurredSpy(&server, SIGNAL(sslErrorsOccurred(QSslSocket*, QList<QSslError>))); #endif QVERIFY(server.listen()); //listen on all network interface, choose an appropriate port @@ -310,6 +313,7 @@ #ifndef QT_NO_SSL QCOMPARE(peerVerifyErrorSpy.size(), 0); QCOMPARE(sslErrorsSpy.size(), 0); + QCOMPARE(sslErrorsOccurredSpy.size(), 0); #endif QCOMPARE(serverErrorSpy.size(), 1); QCOMPARE(serverClosedSpy.size(), 1); @@ -330,6 +334,7 @@ #ifndef QT_NO_SSL QSignalSpy peerVerifyErrorSpy(&server, SIGNAL(peerVerifyError(QSslError))); QSignalSpy sslErrorsSpy(&server, SIGNAL(sslErrors(QList<QSslError>))); + QSignalSpy sslErrorsOccurredSpy(&server, SIGNAL(sslErrorsOccurred(QSslSocket*, QList<QSslError>))); #endif QWebSocket socket; QSignalSpy socketConnectedSpy(&socket, SIGNAL(connected())); @@ -354,6 +359,7 @@ #ifndef QT_NO_SSL QCOMPARE(peerVerifyErrorSpy.size(), 0); QCOMPARE(sslErrorsSpy.size(), 0); + QCOMPARE(sslErrorsOccurredSpy.size(), 0); #endif QCOMPARE(serverErrorSpy.size(), 0); } @@ -460,6 +466,7 @@ SIGNAL(serverError(QWebSocketProtocol::CloseCode))); QSignalSpy serverClosedSpy(&server, &QWebSocketServer::closed); QSignalSpy sslErrorsSpy(&server, SIGNAL(sslErrors(QList<QSslError>))); + QSignalSpy sslErrorsOccurredSpy(&server, SIGNAL(sslErrorsOccurred(QSslSocket*, QList<QSslError>))); QWebSocket socket; QSslConfiguration socketConfig = QSslConfiguration::defaultConfiguration(); @@ -495,6 +502,7 @@ QTRY_COMPARE(serverClosedSpy.size(), 1); QCOMPARE(sslErrorsSpy.size(), 0); + QCOMPARE(sslErrorsOccurredSpy.size(), 0); QCOMPARE(serverErrorSpy.size(), 0); } #endif @@ -517,6 +525,7 @@ #ifndef QT_NO_SSL QSignalSpy peerVerifyErrorSpy(&server, SIGNAL(peerVerifyError(QSslError))); QSignalSpy sslErrorsSpy(&server, SIGNAL(sslErrors(QList<QSslError>))); + QSignalSpy sslErrorsOccurredSpy(&server, SIGNAL(sslErrorsOccurred(QSslSocket*, QList<QSslError>))); #endif QSignalSpy serverAcceptErrorSpy(&server, SIGNAL(acceptError(QAbstractSocket::SocketError))); @@ -573,6 +582,7 @@ #ifndef QT_NO_SSL QCOMPARE(peerVerifyErrorSpy.size(), 0); QCOMPARE(sslErrorsSpy.size(), 0); + QCOMPARE(sslErrorsOccurredSpy.size(), 0); #endif QCOMPARE(serverAcceptErrorSpy.size(), 0); } @@ -673,6 +683,35 @@ QCOMPARE(secureServerSocket->requestUrl().scheme(), QStringLiteral("wss")); secureServer.close(); QVERIFY(!sessionCipher.isNull()); + + QWebSocketServer selfSignedServer(QString(), QWebSocketServer::SecureMode); + QSslConfiguration sslConfiguration; + QFile certFile(QStringLiteral(":/selfsigned.cert")); + QFile keyFile(QStringLiteral(":/selfsigned.key")); + QVERIFY(certFile.open(QIODevice::ReadOnly)); + QVERIFY(keyFile.open(QIODevice::ReadOnly)); + QSslCertificate certificate(&certFile, QSsl::Pem); + QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem); + certFile.close(); + keyFile.close(); + sslConfiguration.setLocalCertificate(certificate); + sslConfiguration.setPrivateKey(sslKey); + sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer); + selfSignedServer.setSslConfiguration(sslConfiguration); + QSignalSpy selfSignedServerConnectionSpy(&selfSignedServer, SIGNAL(newConnection())); + QSignalSpy selfSignedServerSslErrorsOccurredSpy( + &selfSignedServer, SIGNAL(sslErrorsOccurred(QSslSocket*, QList<QSslError>))); + + QVERIFY(selfSignedServer.listen()); + + QWebSocket selfSignedSocket; + sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone); + selfSignedSocket.setSslConfiguration(sslConfiguration); + QObject::connect(&selfSignedSocket, &QWebSocket::sslErrors, + &selfSignedSocket, qOverload<>(&QWebSocket::ignoreSslErrors)); + selfSignedSocket.open(selfSignedServer.serverUrl()); + + QTRY_COMPARE(selfSignedServerSslErrorsOccurredSpy.size(), 1); #endif } @@ -683,14 +722,14 @@ QTcpServer tcpServer; connect(&tcpServer, &QTcpServer::newConnection, - [&tcpServer, &wsServer]() { + &wsServer, [&tcpServer, &wsServer]() { wsServer.handleConnection(tcpServer.nextPendingConnection()); }); QVERIFY(tcpServer.listen()); QWebSocket webSocket; QSignalSpy wsConnectedSpy(&webSocket, &QWebSocket::connected); - webSocket.open(QStringLiteral("ws://localhost:%1").arg(tcpServer.serverPort())); + webSocket.open(QUrl{u"ws://localhost:%1"_s.arg(tcpServer.serverPort())}); QTRY_COMPARE(wsConnectedSpy.size(), 1); QTRY_COMPARE(wsServerConnectionSpy.size(), 1); @@ -819,7 +858,7 @@ QWebSocket secureSocket; connect(&secureSocket, &QWebSocket::errorOccurred, - [](QAbstractSocket::SocketError error) { + this, [](QAbstractSocket::SocketError error) { // This shouldn't print but it's useful for debugging when/if it does. qDebug() << "Error occurred in the client:" << error; }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/shared/selfsigned.cert new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/shared/selfsigned.cert --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/shared/selfsigned.cert 1970-01-01 01:00:00.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/shared/selfsigned.cert 2026-03-10 06:07:38.000000000 +0100 @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFbTCCA1WgAwIBAgIUdy/GEmVgsYMDPqnEamjlX6pqbcswDQYJKoZIhvcNAQEL +BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAgFw0yNTA3MTYxNzM4NTZaGA8yMTI1 +MDYyMjE3Mzg1NlowRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx +ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANcdolTc+jNqDl0434fyx7bjZ9AUd/WnNy3j6Qbn +qkKcmDTJcvdmT2nGpNgEKiDFerDSTR2jRis4BKxzeS0EUlxZSVB3gsdVlBZH8g/i +kIPSaQZbXdu7E5O03nmeqBtKYJU69SwASqVcZWYKXXabil2Qd25e/b2xGR6bu9c6 +1HbJTwnNjTf7WXPIbkNIAfRiCzQ447mQu2+5nNnMpgAbV5VlBYsGpLv7cBrEoVqx +sfhLLcP1oXLtYjQ1AWgxJ/h1yNuOuZK4f4zLqbWymLj1nJJ6oaOAYNGIhH5yXmeq +BJOfV4d3/aWD5BP28edYp8GOU5Ux7eYa9zjcPORjEPTMaxF4IDw7etNqd64c9Zax +J+BnTQbb+cjNZyu3Zsgdx2E/CkgTNed4TeLluLL4jHQIS6KmFdMDb1ToAH/BP3rT +1aA5nWicZ0OpAL4FlqefwB9lByoA9ba+8OBGgXaZ22wolJWXKE3Wbwu2dwHjOIbN +Zr9xRQEVWi9oWiRquuI8yEHg0ZfZJ68CidoXO+O1QI8VRYQ1cGJwYfgimV5qaHcW +mRg5aM+PpHrtD+6Cs10Df2Ju6vdBGl7CiPWYANTso1FEe+TlYKdW96pFVEAIN+qE +s5dP9ACBtmCCcRfu0r6dnoiptDfLoNtMaZG/3jrH2zNCSIEaNnomSoFu5fEwqW5J +wEa9AgMBAAGjUzBRMB0GA1UdDgQWBBQLLuKycgD553jfUXNiqo32G437QTAfBgNV +HSMEGDAWgBQLLuKycgD553jfUXNiqo32G437QTAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBCwUAA4ICAQAhSmPqWevoi29EFbfZTGItbTU5YBBmU4+G8FVNarbc +xTmziotBd569Q1einiuBoltfdH0kcmgrMVKazdwvXh+NyiOVugQKLL2Al46LsjwH +cU4QTOVNLv8be7LUUs0/FFBRTtEbbIs5yPQ+pZ/MI5nr93qMRTLXVomt8O0ARd49 +nxlY4AgP/xzAOgR7hJZoCIEkNAtBqZU8g/OFHglC3SDQIwbJudx2QApdVxqzVNVt +kAPmTce6kS0RsdwypE9P4TJ5qgXi0uVR1cLEanYc1nB28N+/ehtwklZMb/9PSv7q +opGVnH+HFjMC5NQt6abMcT+gPH6+x+0QUc32cfvb5VqXBA8DBruwYIbBrVXUMJkI +XeqwE3jd5MaUP/xt+ozBruam7Ys5LswgfF4sn1qqKlQvzf4ZifiRWDXToQezs7PM +oSFUlWJaBOeULdoLzicxlGAfJlDkUF3HRZGJPCuZq+AwX7376OeJITbdSACJ4BkR +PJxYWt/K4Y1i8Psvs0IRpxIUPIsA2JnyXphHEWICYZH1G8chNufHHzUOMHnKwcsp +aDVfNume2yDA5/67KMylky4v0bYVsNnYDwb9mzctAGWqtQ428QeUhooS6CNgV/AD +bVefV4V64x8ORfdB60C4/MEEwnpUDPUBbbOSw1Y3FnSBz7R2tabGMzLjqsy2BhJv +ow== +-----END CERTIFICATE----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/shared/selfsigned.key new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/shared/selfsigned.key --- old/qtwebsockets-everywhere-src-6.10.2/tests/auto/websockets/shared/selfsigned.key 1970-01-01 01:00:00.000000000 +0100 +++ new/qtwebsockets-everywhere-src-6.11.0/tests/auto/websockets/shared/selfsigned.key 2026-03-10 06:07:38.000000000 +0100 @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +W8cXgya12j6i34ag5Iq/G5OO2d5Hgw== +-----END PRIVATE KEY-----
