xref: /qemu/include/io/channel-websock.h (revision 2d1d0e70cf3eadca967427e71b2c5c7d031bc5c8)
1*2d1d0e70SDaniel P. Berrange /*
2*2d1d0e70SDaniel P. Berrange  * QEMU I/O channels driver websockets
3*2d1d0e70SDaniel P. Berrange  *
4*2d1d0e70SDaniel P. Berrange  * Copyright (c) 2015 Red Hat, Inc.
5*2d1d0e70SDaniel P. Berrange  *
6*2d1d0e70SDaniel P. Berrange  * This library is free software; you can redistribute it and/or
7*2d1d0e70SDaniel P. Berrange  * modify it under the terms of the GNU Lesser General Public
8*2d1d0e70SDaniel P. Berrange  * License as published by the Free Software Foundation; either
9*2d1d0e70SDaniel P. Berrange  * version 2 of the License, or (at your option) any later version.
10*2d1d0e70SDaniel P. Berrange  *
11*2d1d0e70SDaniel P. Berrange  * This library is distributed in the hope that it will be useful,
12*2d1d0e70SDaniel P. Berrange  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*2d1d0e70SDaniel P. Berrange  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*2d1d0e70SDaniel P. Berrange  * Lesser General Public License for more details.
15*2d1d0e70SDaniel P. Berrange  *
16*2d1d0e70SDaniel P. Berrange  * You should have received a copy of the GNU Lesser General Public
17*2d1d0e70SDaniel P. Berrange  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*2d1d0e70SDaniel P. Berrange  *
19*2d1d0e70SDaniel P. Berrange  */
20*2d1d0e70SDaniel P. Berrange 
21*2d1d0e70SDaniel P. Berrange #ifndef QIO_CHANNEL_WEBSOCK_H__
22*2d1d0e70SDaniel P. Berrange #define QIO_CHANNEL_WEBSOCK_H__
23*2d1d0e70SDaniel P. Berrange 
24*2d1d0e70SDaniel P. Berrange #include "io/channel.h"
25*2d1d0e70SDaniel P. Berrange #include "qemu/buffer.h"
26*2d1d0e70SDaniel P. Berrange #include "io/task.h"
27*2d1d0e70SDaniel P. Berrange 
28*2d1d0e70SDaniel P. Berrange #define TYPE_QIO_CHANNEL_WEBSOCK "qio-channel-websock"
29*2d1d0e70SDaniel P. Berrange #define QIO_CHANNEL_WEBSOCK(obj)                                     \
30*2d1d0e70SDaniel P. Berrange     OBJECT_CHECK(QIOChannelWebsock, (obj), TYPE_QIO_CHANNEL_WEBSOCK)
31*2d1d0e70SDaniel P. Berrange 
32*2d1d0e70SDaniel P. Berrange typedef struct QIOChannelWebsock QIOChannelWebsock;
33*2d1d0e70SDaniel P. Berrange typedef union QIOChannelWebsockMask QIOChannelWebsockMask;
34*2d1d0e70SDaniel P. Berrange 
35*2d1d0e70SDaniel P. Berrange union QIOChannelWebsockMask {
36*2d1d0e70SDaniel P. Berrange     char c[4];
37*2d1d0e70SDaniel P. Berrange     uint32_t u;
38*2d1d0e70SDaniel P. Berrange };
39*2d1d0e70SDaniel P. Berrange 
40*2d1d0e70SDaniel P. Berrange /**
41*2d1d0e70SDaniel P. Berrange  * QIOChannelWebsock
42*2d1d0e70SDaniel P. Berrange  *
43*2d1d0e70SDaniel P. Berrange  * The QIOChannelWebsock class provides a channel wrapper which
44*2d1d0e70SDaniel P. Berrange  * can transparently run the HTTP websockets protocol. This is
45*2d1d0e70SDaniel P. Berrange  * usually used over a TCP socket, but there is actually no
46*2d1d0e70SDaniel P. Berrange  * technical restriction on which type of master channel is
47*2d1d0e70SDaniel P. Berrange  * used as the transport.
48*2d1d0e70SDaniel P. Berrange  *
49*2d1d0e70SDaniel P. Berrange  * This channel object is currently only capable of running as
50*2d1d0e70SDaniel P. Berrange  * a websocket server and is a pretty crude implementation
51*2d1d0e70SDaniel P. Berrange  * of it, not supporting the full websockets protocol feature
52*2d1d0e70SDaniel P. Berrange  * set. It is sufficient to use with a simple websockets
53*2d1d0e70SDaniel P. Berrange  * client for encapsulating VNC for noVNC in-browser client.
54*2d1d0e70SDaniel P. Berrange  */
55*2d1d0e70SDaniel P. Berrange 
56*2d1d0e70SDaniel P. Berrange struct QIOChannelWebsock {
57*2d1d0e70SDaniel P. Berrange     QIOChannel parent;
58*2d1d0e70SDaniel P. Berrange     QIOChannel *master;
59*2d1d0e70SDaniel P. Berrange     Buffer encinput;
60*2d1d0e70SDaniel P. Berrange     Buffer encoutput;
61*2d1d0e70SDaniel P. Berrange     Buffer rawinput;
62*2d1d0e70SDaniel P. Berrange     Buffer rawoutput;
63*2d1d0e70SDaniel P. Berrange     size_t payload_remain;
64*2d1d0e70SDaniel P. Berrange     QIOChannelWebsockMask mask;
65*2d1d0e70SDaniel P. Berrange     guint io_tag;
66*2d1d0e70SDaniel P. Berrange     Error *io_err;
67*2d1d0e70SDaniel P. Berrange     gboolean io_eof;
68*2d1d0e70SDaniel P. Berrange };
69*2d1d0e70SDaniel P. Berrange 
70*2d1d0e70SDaniel P. Berrange /**
71*2d1d0e70SDaniel P. Berrange  * qio_channel_websock_new_server:
72*2d1d0e70SDaniel P. Berrange  * @master: the underlying channel object
73*2d1d0e70SDaniel P. Berrange  *
74*2d1d0e70SDaniel P. Berrange  * Create a new websockets channel that runs the server
75*2d1d0e70SDaniel P. Berrange  * side of the protocol.
76*2d1d0e70SDaniel P. Berrange  *
77*2d1d0e70SDaniel P. Berrange  * After creating the channel, it is mandatory to call
78*2d1d0e70SDaniel P. Berrange  * the qio_channel_websock_handshake() method before attempting
79*2d1d0e70SDaniel P. Berrange  * todo any I/O on the channel.
80*2d1d0e70SDaniel P. Berrange  *
81*2d1d0e70SDaniel P. Berrange  * Once the handshake has completed, all I/O should be done
82*2d1d0e70SDaniel P. Berrange  * via the new websocket channel object and not the original
83*2d1d0e70SDaniel P. Berrange  * master channel
84*2d1d0e70SDaniel P. Berrange  *
85*2d1d0e70SDaniel P. Berrange  * Returns: the new websockets channel object
86*2d1d0e70SDaniel P. Berrange  */
87*2d1d0e70SDaniel P. Berrange QIOChannelWebsock *
88*2d1d0e70SDaniel P. Berrange qio_channel_websock_new_server(QIOChannel *master);
89*2d1d0e70SDaniel P. Berrange 
90*2d1d0e70SDaniel P. Berrange /**
91*2d1d0e70SDaniel P. Berrange  * qio_channel_websock_handshake:
92*2d1d0e70SDaniel P. Berrange  * @ioc: the websocket channel object
93*2d1d0e70SDaniel P. Berrange  * @func: the callback to invoke when completed
94*2d1d0e70SDaniel P. Berrange  * @opaque: opaque data to pass to @func
95*2d1d0e70SDaniel P. Berrange  * @destroy: optional callback to free @opaque
96*2d1d0e70SDaniel P. Berrange  *
97*2d1d0e70SDaniel P. Berrange  * Perform the websocket handshake. This method
98*2d1d0e70SDaniel P. Berrange  * will return immediately and the handshake will
99*2d1d0e70SDaniel P. Berrange  * continue in the background, provided the main
100*2d1d0e70SDaniel P. Berrange  * loop is running. When the handshake is complete,
101*2d1d0e70SDaniel P. Berrange  * or fails, the @func callback will be invoked.
102*2d1d0e70SDaniel P. Berrange  */
103*2d1d0e70SDaniel P. Berrange void qio_channel_websock_handshake(QIOChannelWebsock *ioc,
104*2d1d0e70SDaniel P. Berrange                                    QIOTaskFunc func,
105*2d1d0e70SDaniel P. Berrange                                    gpointer opaque,
106*2d1d0e70SDaniel P. Berrange                                    GDestroyNotify destroy);
107*2d1d0e70SDaniel P. Berrange 
108*2d1d0e70SDaniel P. Berrange #endif /* QIO_CHANNEL_WEBSOCK_H__ */
109