Hello,
I used `ixwebsocket` before and now switched to new `libcurl` websocket
feature. `libcurl` is feature rich library that contains many things that
`ixwebsocket` lacks, but its new websocket interface has an issue.
I use the library to connect to trading website that sends trades as a stream
of JSON objects via websocket connection. I use `CURLOPT_WRITEFUNCTION` to read
trades indefinitely while the executable is running. When I did the same for
`ixwebsocket`, I always received full JSON objects, one per websocket message,
so I think it is how the stream works. I used the same callback for
`CURLOPT_WRITEFUNCTION` and found that sometimes (rarely) I receive partial
JSON objects, for example, the 1st call of my write function gives `{"Hello":`,
and the 2nd one gives `"World"}`. I think the reason is that websocket frame is
divided between different TCP packets.
Such partial data may be OK for HTTP protocol when we know for sure that we
have "request/response" pattern and we can detect the end of data by HTTP
protocol itself, for example, with `Content-Length` header. But with websocket
generally speaking we don't have any way to know where is end of frame with
`CURLOPT_WRITEFUNCTION`. Specifically for JSON we can try to use stream JSON
parser to detect the end of object, but even that is not 100% reliable. What if
server is buggy and sends something infinite, for example, it sends something
like `{"object":` always? In such a way our stream JSON parser will get
something like `{"object":{"object":{"object"`, etc... and how to know who is
buggy, the parser or the server? So, we need any way to know where is websocket
frame border, and because `CURLOPT_WRITEFUNCTION` doesn't give us that
information, we need a guarantee that `CURLOPT_WRITEFUNCTION` will call our
callback when full frame is downloaded only, or at least we need the option tha
t will allow us to request such behavior (something like
`CURLOPT_WEBSOCKET_FULL_FRAMES_ONLY`).
For now we can also ask to receive raw data from websocket, but it will
require to implement websocket messages parser in each program, in my opinion
such generic functionality is better for library that for application.
--
Best regards,
Vitalii B. Avramenko.
--
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette: https://curl.se/mail/etiquette.html