> On Jul 2, 2021, at 4:33 AM, Daniel Stenberg via curl-library 
> <curl-library@cool.haxx.se> wrote:
> 
> On Thu, 1 Jul 2021, Weston Schmidt wrote:
> 
>> I like the simplicity of the CURLOPT_CONNECT_ONLY=2L + ws:// or wss:// plan.
>> 
>> If libcurl stops at the _The WebSocket Connection is Established_ point 
>> (https://datatracker.ietf.org/doc/html/rfc6455#page-20) when 
>> CURLOPT_CONNECT_ONLY=2L, then by definition that is only after the HTTP 
>> response 101 Upgrade stuff has happened.  This means that redirects and 
>> other HTTP magic happens as normal.  Libcurl then does not need to support 
>> or be altered for extensions or subprotocols.
> 
> I think that's a decent plan for the initial bootstrap-into-websockets step. 
> I could even imagine that CURLOPT_CONNECT_ONLY=2L could be implied by the 
> explicit use of ws:// or wss:// in the URL.
> 
> What's a little unclearer to me is what we need for the next phase, once the 
> connection is done and setup. curl_easy_send/recv seem inadequate for 
> websockets, which might imply that we need to provide curl_ws_send/recv. If 
> so: A) how should they work and B) what else do we need?

The send interface could look much like curl_easy_send():

curl_ws_send( easy, buffer, buflen, &sent, enum curl_ws_message_type type, enum 
curl_ws_flags flags )

… where type is the frame type (as per the RFC) and where flags are:

CURL_WS_NOCOMPRESS - no-op if there’s no compression anyway
CURL_WS_MORE - omit WS’s FIN flag

The above assumes curl would hold a bit of state in order to sanity-check the 
calls and provide conveniences like auto-adding WS’s “initial” flag.

-----

Most WS libraries that I’ve seen implement reception as a callback, with a 
separate control to pause reception of incoming messages.

Maybe the following callback signature:

void curl_ws_on_recv_message( buffer, buflen, enum curl_ws_message_type type, 
enum curl_ws_flags flags )

… where “flags” would just be CURL_WS_NOCOMPRESS.

The “pause” could maybe be: curl_easy_setopt(easy, CURLOPT_WS_PAUSE, 1)?


Canonically, user applications aren’t meant to receive individual WS frames, 
but only entire messages. If, though, it’s desired that the client also be able 
to receive individual frames, perhaps the following:

void curl_ws_on_recv_frame( buffer, buflen, enum curl_ws_message_type type, 
enum curl_ws_flags flags )

-FG
-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to