From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Yu-Chen Lin <npes87184@gmail.com>
Cc: qemu-devel@nongnu.org, qemu-stable@nongnu.org
Subject: Re: [PATCH] io/channel-websock: treat 'binary' and no sub-protocol as the same
Date: Mon, 2 Dec 2019 15:52:54 +0000 [thread overview]
Message-ID: <20191202155254.GN4184266@redhat.com> (raw)
In-Reply-To: <20191123034306.6139-1-npes87184@gmail.com>
On Sat, Nov 23, 2019 at 11:43:06AM +0800, Yu-Chen Lin wrote:
> noVNC doesn't use 'binary' protocol by default after
> commit c912230309806aacbae4295faf7ad6406da97617.
>
> It will cause qemu return 400 when handshaking.
>
> To overcome this problem and remain compatibility of
> older noVNC client.
>
> We treat 'binary' and no sub-protocol as the same
> so that we can support different version of noVNC
> client.
>
> Tested on noVNC before c912230 and after c912230.
>
> Buglink: https://bugs.launchpad.net/qemu/+bug/1849644
>
> Signed-off-by: Yu-Chen Lin <npes87184@gmail.com>
> ---
> io/channel-websock.c | 35 +++++++++++++++++++++++------------
> 1 file changed, 23 insertions(+), 12 deletions(-)
Thank you, I have queued this for 5.0.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Also CC'ing stable for the first 4.2 bug fix release.
>
> diff --git a/io/channel-websock.c b/io/channel-websock.c
> index fc36d44eba..918e09ea3f 100644
> --- a/io/channel-websock.c
> +++ b/io/channel-websock.c
> @@ -49,13 +49,20 @@
> "Server: QEMU VNC\r\n" \
> "Date: %s\r\n"
>
> +#define QIO_CHANNEL_WEBSOCK_HANDSHAKE_WITH_PROTO_RES_OK \
> + "HTTP/1.1 101 Switching Protocols\r\n" \
> + QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_COMMON \
> + "Upgrade: websocket\r\n" \
> + "Connection: Upgrade\r\n" \
> + "Sec-WebSocket-Accept: %s\r\n" \
> + "Sec-WebSocket-Protocol: binary\r\n" \
> + "\r\n"
> #define QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_OK \
> "HTTP/1.1 101 Switching Protocols\r\n" \
> QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_COMMON \
> "Upgrade: websocket\r\n" \
> "Connection: Upgrade\r\n" \
> "Sec-WebSocket-Accept: %s\r\n" \
> - "Sec-WebSocket-Protocol: binary\r\n" \
> "\r\n"
> #define QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_NOT_FOUND \
> "HTTP/1.1 404 Not Found\r\n" \
> @@ -336,6 +343,7 @@ qio_channel_websock_find_header(QIOChannelWebsockHTTPHeader *hdrs,
>
> static void qio_channel_websock_handshake_send_res_ok(QIOChannelWebsock *ioc,
> const char *key,
> + const bool use_protocols,
> Error **errp)
> {
> char combined_key[QIO_CHANNEL_WEBSOCK_CLIENT_KEY_LEN +
> @@ -361,8 +369,13 @@ static void qio_channel_websock_handshake_send_res_ok(QIOChannelWebsock *ioc,
> }
>
> date = qio_channel_websock_date_str();
> - qio_channel_websock_handshake_send_res(
> - ioc, QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_OK, date, accept);
> + if (use_protocols) {
> + qio_channel_websock_handshake_send_res(
> + ioc, QIO_CHANNEL_WEBSOCK_HANDSHAKE_WITH_PROTO_RES_OK, date, accept);
> + } else {
> + qio_channel_websock_handshake_send_res(
> + ioc, QIO_CHANNEL_WEBSOCK_HANDSHAKE_RES_OK, date, accept);
> + }
>
> g_free(date);
> g_free(accept);
> @@ -387,10 +400,6 @@ static void qio_channel_websock_handshake_process(QIOChannelWebsock *ioc,
>
> protocols = qio_channel_websock_find_header(
> hdrs, nhdrs, QIO_CHANNEL_WEBSOCK_HEADER_PROTOCOL);
> - if (!protocols) {
> - error_setg(errp, "Missing websocket protocol header data");
> - goto bad_request;
> - }
>
> version = qio_channel_websock_find_header(
> hdrs, nhdrs, QIO_CHANNEL_WEBSOCK_HEADER_VERSION);
> @@ -430,10 +439,12 @@ static void qio_channel_websock_handshake_process(QIOChannelWebsock *ioc,
> trace_qio_channel_websock_http_request(ioc, protocols, version,
> host, connection, upgrade, key);
>
> - if (!g_strrstr(protocols, QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY)) {
> - error_setg(errp, "No '%s' protocol is supported by client '%s'",
> - QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY, protocols);
> - goto bad_request;
> + if (protocols) {
> + if (!g_strrstr(protocols, QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY)) {
> + error_setg(errp, "No '%s' protocol is supported by client '%s'",
> + QIO_CHANNEL_WEBSOCK_PROTOCOL_BINARY, protocols);
> + goto bad_request;
> + }
> }
>
> if (!g_str_equal(version, QIO_CHANNEL_WEBSOCK_SUPPORTED_VERSION)) {
> @@ -467,7 +478,7 @@ static void qio_channel_websock_handshake_process(QIOChannelWebsock *ioc,
> goto bad_request;
> }
>
> - qio_channel_websock_handshake_send_res_ok(ioc, key, errp);
> + qio_channel_websock_handshake_send_res_ok(ioc, key, !!protocols, errp);
> return;
>
> bad_request:
> --
> 2.17.1
>
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2019-12-02 15:54 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-23 3:43 [PATCH] io/channel-websock: treat 'binary' and no sub-protocol as the same Yu-Chen Lin
2019-11-28 23:49 ` Yu-Chen Lin
2019-12-02 15:52 ` Daniel P. Berrangé [this message]
2020-02-06 13:20 ` Yu-Chen Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191202155254.GN4184266@redhat.com \
--to=berrange@redhat.com \
--cc=npes87184@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).