qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 :|



  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).