mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-08 19:19:05 +00:00
websocket: New interface to create RedsWebSocket
Less coupling. This is a preparation for next patch. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jeremy White <jwhite@codeweavers.com>
This commit is contained in:
parent
b5f3ed1502
commit
a5c05ad845
@ -1215,28 +1215,19 @@ bool red_stream_is_websocket(RedStream *stream, const void *buf, size_t len)
|
||||
so it seems wisest to live with this theoretical flaw.
|
||||
*/
|
||||
|
||||
if (websocket_is_start(rbuf)) {
|
||||
char outbuf[1024];
|
||||
stream->priv->ws = websocket_new(rbuf, stream,
|
||||
(websocket_read_cb_t) stream->priv->read,
|
||||
(websocket_write_cb_t) stream->priv->write,
|
||||
(websocket_writev_cb_t) stream->priv->writev);
|
||||
if (stream->priv->ws) {
|
||||
stream->priv->read = stream_websocket_read;
|
||||
stream->priv->write = stream_websocket_write;
|
||||
|
||||
websocket_create_reply(rbuf, outbuf);
|
||||
rc = stream->priv->write(stream, outbuf, strlen(outbuf));
|
||||
if (rc == strlen(outbuf)) {
|
||||
stream->priv->ws = g_malloc0(sizeof(*stream->priv->ws));
|
||||
|
||||
stream->priv->ws->raw_stream = stream;
|
||||
stream->priv->ws->raw_read = stream->priv->read;
|
||||
stream->priv->ws->raw_write = stream->priv->write;
|
||||
|
||||
stream->priv->read = stream_websocket_read;
|
||||
stream->priv->write = stream_websocket_write;
|
||||
|
||||
if (stream->priv->writev) {
|
||||
stream->priv->ws->raw_writev = stream->priv->writev;
|
||||
stream->priv->writev = stream_websocket_writev;
|
||||
}
|
||||
|
||||
return true;
|
||||
if (stream->priv->writev) {
|
||||
stream->priv->writev = stream_websocket_writev;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@ -478,3 +478,28 @@ void websocket_create_reply(char *buf, char *outbuf)
|
||||
"Sec-WebSocket-Protocol: binary\r\n\r\n", key);
|
||||
g_free(key);
|
||||
}
|
||||
|
||||
RedsWebSocket *websocket_new(char *rbuf, struct RedStream *stream, websocket_read_cb_t read_cb,
|
||||
websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb)
|
||||
{
|
||||
if (!websocket_is_start(rbuf)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char outbuf[1024];
|
||||
|
||||
websocket_create_reply(rbuf, outbuf);
|
||||
int rc = write_cb(stream, outbuf, strlen(outbuf));
|
||||
if (rc != strlen(outbuf)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RedsWebSocket *ws = g_new0(RedsWebSocket, 1);
|
||||
|
||||
ws->raw_stream = stream;
|
||||
ws->raw_read = read_cb;
|
||||
ws->raw_write = write_cb;
|
||||
ws->raw_writev = writev_cb;
|
||||
|
||||
return ws;
|
||||
}
|
||||
|
||||
@ -41,11 +41,13 @@ typedef struct {
|
||||
uint64_t write_remainder;
|
||||
|
||||
struct RedStream *raw_stream;
|
||||
ssize_t (*raw_read)(struct RedStream *s, void *buf, size_t nbyte);
|
||||
ssize_t (*raw_write)(struct RedStream *s, const void *buf, size_t nbyte);
|
||||
ssize_t (*raw_writev)(struct RedStream *s, const struct iovec *iov, int iovcnt);
|
||||
websocket_read_cb_t raw_read;
|
||||
websocket_write_cb_t raw_write;
|
||||
websocket_writev_cb_t raw_writev;
|
||||
} RedsWebSocket;
|
||||
|
||||
RedsWebSocket *websocket_new(char *buf, struct RedStream *s, websocket_read_cb_t read_cb,
|
||||
websocket_write_cb_t write_cb, websocket_writev_cb_t writev_cb);
|
||||
bool websocket_is_start(char *buf);
|
||||
void websocket_create_reply(char *buf, char *outbuf);
|
||||
int websocket_read(RedsWebSocket *ws, uint8_t *buf, size_t len);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user