Hello,

        I’m looking over curl’s provisional WebSocket support--an exciting 
development, to be sure!

        Here are a few notes I’ve made from just looking over the API. I have 
not, as Thomas has, actually written code against it; still, hopefully these 
will be of use:

- The documentation would do well to clarify that what this API returns (and 
expects) are WebSocket *frames*, not messages. Thus, applications are 
responsible for aggregating fragmented messages (i.e., looking at the FIN flag) 
themselves. Are those applications also responsible for validating frame 
opcodes?

RFC 6455 seems more or less to assume that WebSocket implementations will 
expose concatenated messages rather than frames to applications. curl could 
implement this safely by having a max-message-size, and once a frame header 
indicates that a message is going to exceed that, send a close of type 1009, 
and discard every incoming frame until the close response arrives.

- Speaking of close, I assume applications are responsible for verifying, if 
curl sends the close frame, that the close response matches the sent one?

- If I understand the flags correctly, a 3-frame text message would look thus:

        1. flags=CURLWS_TEXT|CURLWS_CONT
        2. flags=CURLWS_CONT
        3. flags=0

This seems rather counterintuitive given that the actual WS frame opcodes will 
be TEXT, CONT, and CONT (with FIN on the last one). Perhaps CURLWS_NONFINAL 
would be an improvement upon CURLWS_CONT?

Alternatively, maybe CURLWS_CONT is meant to indicate opcode=CONT … but then 
what distinguishes CONT|FIN from plain CONT?

- Does this implementation currently support WebSocket compression (PMCE)? I 
see no mention of it.

Note that the relevant RFC (7692) stipulates (section 6) that 
compression/decompression happen on concatenated payloads, so curl’s current 
frame-oriented WebSocket API might be problematic. That said, LibWebsockets is 
also frame-oriented, and it seems to be OK decompressing frame-by-frame. Maybe 
it only happens to work with gzip, though, and some other future compression 
(e.g., zstd) would fail.

- I see the CLI plan for sending PINGs. Note that there’s also a legit use case 
for sending periodic PONGs without a PING. An application I maintain transfers 
mysqldump output across a WS connection and inserts it line-by-line into a 
target host’s MySQL. When the target host enables keys on the new table, this 
takes a while, which causes backpressure on the stream. So the sender can’t 
send or answer PINGs … but if we send *nothing*, the router may drop the 
connection. So we have the target send unrequested PONGs every minute or so, 
which keeps the router from making trouble while MySQL does its thing.

- Small nit: the link to LibWebsockets is wrong.

        Thank you!

cheers,
-Felipe
-- 
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to