From bcea7a1a8b46aa1e9e5fcf3e43bd251360cf8634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Tue, 20 Mar 2018 10:00:13 +0100 Subject: Make QWebSocketServer work with Safari MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sending an empty “Server” header during handshake will make Safari error out with “WebSocket connection [...] failed: Invalid UTF-8 sequence in header value” This is an open bug in WebKit: https://bugs.webkit.org/show_bug.cgi?id=139298 As far as I see, “Server” is not a required handshake header as specified in RFC 6455 section 4.2.2 (5), and we can omit it if the server name is not set. Change-Id: Icec142f867813c16e3e3baa1378582164242e049 Reviewed-by: Edward Welbourne Reviewed-by: Timur Pocheptsov --- src/websockets/qwebsockethandshakeresponse.cpp | 5 +++-- src/websockets/qwebsocketserver.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/websockets/qwebsockethandshakeresponse.cpp b/src/websockets/qwebsockethandshakeresponse.cpp index ee57d5c..2241ca2 100644 --- a/src/websockets/qwebsockethandshakeresponse.cpp +++ b/src/websockets/qwebsockethandshakeresponse.cpp @@ -186,8 +186,9 @@ QString QWebSocketHandshakeResponse::getHandshakeResponse( if (origin.isEmpty()) origin = QStringLiteral("*"); QDateTime datetime = QDateTime::currentDateTimeUtc(); - response << QStringLiteral("Server: ") % serverName << - QStringLiteral("Access-Control-Allow-Credentials: false") << + if (!serverName.isEmpty()) + response << QStringLiteral("Server: ") % serverName; + response << QStringLiteral("Access-Control-Allow-Credentials: false") << QStringLiteral("Access-Control-Allow-Methods: GET") << QStringLiteral("Access-Control-Allow-Headers: content-type") << QStringLiteral("Access-Control-Allow-Origin: ") % origin << diff --git a/src/websockets/qwebsocketserver.cpp b/src/websockets/qwebsocketserver.cpp index be66946..5111bfd 100644 --- a/src/websockets/qwebsocketserver.cpp +++ b/src/websockets/qwebsocketserver.cpp @@ -241,7 +241,7 @@ QT_BEGIN_NAMESPACE /*! Constructs a new QWebSocketServer with the given \a serverName. The \a serverName will be used in the HTTP handshake phase to identify the server. - It can be empty, in which case an empty server name will be sent to the client. + It can be empty, in which case no server name will be sent to the client. The \a secureMode parameter indicates whether the server operates over wss (\l{SecureMode}) or over ws (\l{NonSecureMode}). -- cgit v1.2.3