Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

websocket, introduce blocking sends #14458

Closed
wants to merge 5 commits into from
Closed

Conversation

icing
Copy link
Contributor

@icing icing commented Aug 8, 2024

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
Copy link
Contributor

dfandrich commented Aug 8, 2024 via email

@icing
Copy link
Contributor Author

icing commented Aug 8, 2024

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
Copy link
Contributor

dfandrich commented Aug 8, 2024 via email

Only perform blocking send when invoked by a callback.
@icing
Copy link
Contributor Author

icing commented Aug 9, 2024

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

3 participants