Skip to content

websocket, introduce blocking sends - #14458

Closed
icing wants to merge 5 commits into
curl:masterfrom
icing:ws-blocking-send
Closed

icing wants to merge 5 commits into
curl:masterfrom
icing:ws-blocking-send

Conversation

@icing

@icing icing commented Aug 8, 2024 •

Copy link
Copy Markdown
Contributor

When using curl_ws_send(), perform a blocking send of the data if the call is done from within a curl callback. A partial write of the data could subsequently mess up the ws framing, as a callback has a hard time handling waits and repeated calls.

Outside a callback, curl_ws_send() is always non-blocking except when generating a 0-length frame that could not completely be sent. This is no way to report this partial success.

Document this behaviour in the function and add this as item to the TODO list. Also, add ws as protocol trace feature.

Fixes WebSockets tests with CURL_DBG_SOCK_WBLOCK=90 set.

When using `curl_ws_send()`, perform a blocking send
of the data under the following conditions:

- the websocket is in raw mode and the call is done
  from within a curl callback. A partial write of the
  data could subsequently mess up the ws framing, as
  a callback has a hard time handling this.
- the websocket is encoding the data itself, has added
  it to its internal sendbuf. A partial flush of the
  buffer has unclear semantics for the caller, as they
  will have no idea what to send again.

Fixes WebSockets tests with CURL_DBG_SOCK_WBLOCK=90 set.
@icing icing added the WebSocket label Aug 8, 2024
@dfandrich

dfandrich commented Aug 8, 2024 via email

Copy link
Copy Markdown
Contributor

@icing

icing commented Aug 8, 2024

Copy link
Copy Markdown
Contributor Author

A good question. I did not really like to introduce this, but it seems necessary with the current design. Maybe @bagder has an idea how to address this.

But if we go for this, it needs to be documented in curl_ws_send(), yes.

@dfandrich

dfandrich commented Aug 8, 2024 via email

Copy link
Copy Markdown
Contributor

icing added 2 commits August 9, 2024 12:25
Only perform blocking send when invoked by a callback.
@icing

icing commented Aug 9, 2024

Copy link
Copy Markdown
Contributor Author

Improved handling to make curl_ws_send() non-blocking in almost all cases when invoked outside a callback. Updated documentation.

@bagder bagder closed this in 3e64569 Aug 12, 2024
@polarina

polarina commented Oct 14, 2024 •

Copy link
Copy Markdown

What is expected of clients who wish to resume a curl_ws_send call after a partial write? The semantics when partial writes are reported are unclear.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

4 participants