diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2020-01-28 11:06:29 +0100 |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@gnome.org> | 2020-01-28 11:11:24 +0100 |
commit | 46713b3b3a7c01fcb305858c15bdf7c0b6ac6ce6 (patch) | |
tree | 04979000322c31aa921a0b42eb4be3840386c015 | |
parent | 87e8c2ab9f3bc79befb0e3b25ec513cfd36fefe9 (diff) | |
download | libsoup-46713b3b3a7c01fcb305858c15bdf7c0b6ac6ce6.tar.gz |
WebSockets: ensure a new connection is created for WebSocket requests
The spec says a new connection must be established and some servers
reply with a 400 Bad Request when reusing an existing connection.
-rw-r--r-- | libsoup/soup-session.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index 7b428c99..5dcf1eb2 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -4921,6 +4921,7 @@ soup_session_websocket_connect_async (SoupSession *session, SoupMessageQueueItem *item; GTask *task; GPtrArray *supported_extensions; + SoupMessageFlags flags; g_return_if_fail (SOUP_IS_SESSION (session)); g_return_if_fail (priv->use_thread_context); @@ -4929,6 +4930,15 @@ soup_session_websocket_connect_async (SoupSession *session, supported_extensions = soup_session_get_supported_websocket_extensions_for_message (session, msg); soup_websocket_client_prepare_handshake_with_extensions (msg, origin, protocols, supported_extensions); + /* When the client is to _Establish a WebSocket Connection_ given a set + * of (/host/, /port/, /resource name/, and /secure/ flag), along with a + * list of /protocols/ and /extensions/ to be used, and an /origin/ in + * the case of web browsers, it MUST open a connection, send an opening + * handshake, and read the server's handshake in response. + */ + flags = soup_message_get_flags (msg); + soup_message_set_flags (msg, flags | SOUP_MESSAGE_NEW_CONNECTION); + task = g_task_new (session, cancellable, callback, user_data); item = soup_session_append_queue_item (session, msg, TRUE, FALSE, websocket_connect_async_complete, task); |