1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker *
13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker *
16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker */
24*1c60b9acSAndroid Build Coastguard Worker
25*1c60b9acSAndroid Build Coastguard Worker /*! \defgroup sending-data Sending data
26*1c60b9acSAndroid Build Coastguard Worker
27*1c60b9acSAndroid Build Coastguard Worker APIs related to writing data on a connection
28*1c60b9acSAndroid Build Coastguard Worker */
29*1c60b9acSAndroid Build Coastguard Worker //@{
30*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_SIZEOFPTR)
31*1c60b9acSAndroid Build Coastguard Worker #define LWS_SIZEOFPTR ((int)sizeof (void *))
32*1c60b9acSAndroid Build Coastguard Worker #endif
33*1c60b9acSAndroid Build Coastguard Worker
34*1c60b9acSAndroid Build Coastguard Worker #if defined(__x86_64__)
35*1c60b9acSAndroid Build Coastguard Worker #define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
36*1c60b9acSAndroid Build Coastguard Worker #else
37*1c60b9acSAndroid Build Coastguard Worker #define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
38*1c60b9acSAndroid Build Coastguard Worker #endif
39*1c60b9acSAndroid Build Coastguard Worker #define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
40*1c60b9acSAndroid Build Coastguard Worker ((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
41*1c60b9acSAndroid Build Coastguard Worker /* last 2 is for lws-meta */
42*1c60b9acSAndroid Build Coastguard Worker #define LWS_PRE _LWS_PAD(4 + 10 + 2)
43*1c60b9acSAndroid Build Coastguard Worker /* used prior to 1.7 and retained for backward compatibility */
44*1c60b9acSAndroid Build Coastguard Worker #define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
45*1c60b9acSAndroid Build Coastguard Worker #define LWS_SEND_BUFFER_POST_PADDING 0
46*1c60b9acSAndroid Build Coastguard Worker
47*1c60b9acSAndroid Build Coastguard Worker #define LWS_WRITE_RAW LWS_WRITE_HTTP
48*1c60b9acSAndroid Build Coastguard Worker
49*1c60b9acSAndroid Build Coastguard Worker /*
50*1c60b9acSAndroid Build Coastguard Worker * NOTE: These public enums are part of the abi. If you want to add one,
51*1c60b9acSAndroid Build Coastguard Worker * add it at where specified so existing users are unaffected.
52*1c60b9acSAndroid Build Coastguard Worker */
53*1c60b9acSAndroid Build Coastguard Worker enum lws_write_protocol {
54*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_TEXT = 0,
55*1c60b9acSAndroid Build Coastguard Worker /**< Send a ws TEXT message,the pointer must have LWS_PRE valid
56*1c60b9acSAndroid Build Coastguard Worker * memory behind it.
57*1c60b9acSAndroid Build Coastguard Worker *
58*1c60b9acSAndroid Build Coastguard Worker * The receiver expects only valid utf-8 in the payload */
59*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_BINARY = 1,
60*1c60b9acSAndroid Build Coastguard Worker /**< Send a ws BINARY message, the pointer must have LWS_PRE valid
61*1c60b9acSAndroid Build Coastguard Worker * memory behind it.
62*1c60b9acSAndroid Build Coastguard Worker *
63*1c60b9acSAndroid Build Coastguard Worker * Any sequence of bytes is valid */
64*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_CONTINUATION = 2,
65*1c60b9acSAndroid Build Coastguard Worker /**< Continue a previous ws message, the pointer must have LWS_PRE valid
66*1c60b9acSAndroid Build Coastguard Worker * memory behind it */
67*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_HTTP = 3,
68*1c60b9acSAndroid Build Coastguard Worker /**< Send HTTP content */
69*1c60b9acSAndroid Build Coastguard Worker
70*1c60b9acSAndroid Build Coastguard Worker /* LWS_WRITE_CLOSE is handled by lws_close_reason() */
71*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_PING = 5,
72*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_PONG = 6,
73*1c60b9acSAndroid Build Coastguard Worker
74*1c60b9acSAndroid Build Coastguard Worker /* Same as write_http but we know this write ends the transaction */
75*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_HTTP_FINAL = 7,
76*1c60b9acSAndroid Build Coastguard Worker
77*1c60b9acSAndroid Build Coastguard Worker /* HTTP2 */
78*1c60b9acSAndroid Build Coastguard Worker
79*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_HTTP_HEADERS = 8,
80*1c60b9acSAndroid Build Coastguard Worker /**< Send http headers (http2 encodes this payload and LWS_WRITE_HTTP
81*1c60b9acSAndroid Build Coastguard Worker * payload differently, http 1.x links also handle this correctly. so
82*1c60b9acSAndroid Build Coastguard Worker * to be compatible with both in the future,header response part should
83*1c60b9acSAndroid Build Coastguard Worker * be sent using this regardless of http version expected)
84*1c60b9acSAndroid Build Coastguard Worker */
85*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_HTTP_HEADERS_CONTINUATION = 9,
86*1c60b9acSAndroid Build Coastguard Worker /**< Continuation of http/2 headers
87*1c60b9acSAndroid Build Coastguard Worker */
88*1c60b9acSAndroid Build Coastguard Worker
89*1c60b9acSAndroid Build Coastguard Worker /****** add new things just above ---^ ******/
90*1c60b9acSAndroid Build Coastguard Worker
91*1c60b9acSAndroid Build Coastguard Worker /* flags */
92*1c60b9acSAndroid Build Coastguard Worker
93*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_BUFLIST = 0x20,
94*1c60b9acSAndroid Build Coastguard Worker /**< Don't actually write it... stick it on the output buflist and
95*1c60b9acSAndroid Build Coastguard Worker * write it as soon as possible. Useful if you learn you have to
96*1c60b9acSAndroid Build Coastguard Worker * write something, have the data to write to hand but the timing is
97*1c60b9acSAndroid Build Coastguard Worker * unrelated as to whether the connection is writable or not, and were
98*1c60b9acSAndroid Build Coastguard Worker * otherwise going to have to allocate a temp buffer and write it
99*1c60b9acSAndroid Build Coastguard Worker * later anyway */
100*1c60b9acSAndroid Build Coastguard Worker
101*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_NO_FIN = 0x40,
102*1c60b9acSAndroid Build Coastguard Worker /**< This part of the message is not the end of the message */
103*1c60b9acSAndroid Build Coastguard Worker
104*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_H2_STREAM_END = 0x80,
105*1c60b9acSAndroid Build Coastguard Worker /**< Flag indicates this packet should go out with STREAM_END if h2
106*1c60b9acSAndroid Build Coastguard Worker * STREAM_END is allowed on DATA or HEADERS.
107*1c60b9acSAndroid Build Coastguard Worker */
108*1c60b9acSAndroid Build Coastguard Worker
109*1c60b9acSAndroid Build Coastguard Worker LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
110*1c60b9acSAndroid Build Coastguard Worker /**< client packet payload goes out on wire unmunged
111*1c60b9acSAndroid Build Coastguard Worker * only useful for security tests since normal servers cannot
112*1c60b9acSAndroid Build Coastguard Worker * decode the content if used */
113*1c60b9acSAndroid Build Coastguard Worker };
114*1c60b9acSAndroid Build Coastguard Worker
115*1c60b9acSAndroid Build Coastguard Worker /* used with LWS_CALLBACK_CHILD_WRITE_VIA_PARENT */
116*1c60b9acSAndroid Build Coastguard Worker
117*1c60b9acSAndroid Build Coastguard Worker struct lws_write_passthru {
118*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi;
119*1c60b9acSAndroid Build Coastguard Worker unsigned char *buf;
120*1c60b9acSAndroid Build Coastguard Worker size_t len;
121*1c60b9acSAndroid Build Coastguard Worker enum lws_write_protocol wp;
122*1c60b9acSAndroid Build Coastguard Worker };
123*1c60b9acSAndroid Build Coastguard Worker
124*1c60b9acSAndroid Build Coastguard Worker
125*1c60b9acSAndroid Build Coastguard Worker /**
126*1c60b9acSAndroid Build Coastguard Worker * lws_write() - Apply protocol then write data to client
127*1c60b9acSAndroid Build Coastguard Worker *
128*1c60b9acSAndroid Build Coastguard Worker * \param wsi: Websocket instance (available from user callback)
129*1c60b9acSAndroid Build Coastguard Worker * \param buf: The data to send. For data being sent on a websocket
130*1c60b9acSAndroid Build Coastguard Worker * connection (ie, not default http), this buffer MUST have
131*1c60b9acSAndroid Build Coastguard Worker * LWS_PRE bytes valid BEFORE the pointer.
132*1c60b9acSAndroid Build Coastguard Worker * This is so the protocol header data can be added in-situ.
133*1c60b9acSAndroid Build Coastguard Worker * \param len: Count of the data bytes in the payload starting from buf
134*1c60b9acSAndroid Build Coastguard Worker * \param protocol: Use LWS_WRITE_HTTP to reply to an http connection, and one
135*1c60b9acSAndroid Build Coastguard Worker * of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate
136*1c60b9acSAndroid Build Coastguard Worker * data on a websockets connection. Remember to allow the extra
137*1c60b9acSAndroid Build Coastguard Worker * bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT
138*1c60b9acSAndroid Build Coastguard Worker * are used.
139*1c60b9acSAndroid Build Coastguard Worker *
140*1c60b9acSAndroid Build Coastguard Worker * This function provides the way to issue data back to the client, for any
141*1c60b9acSAndroid Build Coastguard Worker * role (h1, h2, ws, raw, etc). It can only be called from the WRITEABLE
142*1c60b9acSAndroid Build Coastguard Worker * callback.
143*1c60b9acSAndroid Build Coastguard Worker *
144*1c60b9acSAndroid Build Coastguard Worker * IMPORTANT NOTICE!
145*1c60b9acSAndroid Build Coastguard Worker *
146*1c60b9acSAndroid Build Coastguard Worker * When sending with ws protocol
147*1c60b9acSAndroid Build Coastguard Worker *
148*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_TEXT,
149*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_BINARY,
150*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_CONTINUATION,
151*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_PING,
152*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_PONG,
153*1c60b9acSAndroid Build Coastguard Worker *
154*1c60b9acSAndroid Build Coastguard Worker * or sending on http/2... the send buffer has to have LWS_PRE bytes valid
155*1c60b9acSAndroid Build Coastguard Worker * BEFORE the buffer pointer you pass to lws_write(). Since you'll probably
156*1c60b9acSAndroid Build Coastguard Worker * want to use http/2 before too long, it's wise to just always do this with
157*1c60b9acSAndroid Build Coastguard Worker * lws_write buffers... LWS_PRE is typically 16 bytes it's not going to hurt
158*1c60b9acSAndroid Build Coastguard Worker * usually.
159*1c60b9acSAndroid Build Coastguard Worker *
160*1c60b9acSAndroid Build Coastguard Worker * start of alloc ptr passed to lws_write end of allocation
161*1c60b9acSAndroid Build Coastguard Worker * | | |
162*1c60b9acSAndroid Build Coastguard Worker * v <-- LWS_PRE bytes --> v v
163*1c60b9acSAndroid Build Coastguard Worker * [---------------- allocated memory ---------------]
164*1c60b9acSAndroid Build Coastguard Worker * (for lws use) [====== user buffer ======]
165*1c60b9acSAndroid Build Coastguard Worker *
166*1c60b9acSAndroid Build Coastguard Worker * This allows us to add protocol info before the data, and send as one packet
167*1c60b9acSAndroid Build Coastguard Worker * on the network without payload copying, for maximum efficiency.
168*1c60b9acSAndroid Build Coastguard Worker *
169*1c60b9acSAndroid Build Coastguard Worker * So for example you need this kind of code to use lws_write with a
170*1c60b9acSAndroid Build Coastguard Worker * 128-byte payload
171*1c60b9acSAndroid Build Coastguard Worker *
172*1c60b9acSAndroid Build Coastguard Worker * char buf[LWS_PRE + 128];
173*1c60b9acSAndroid Build Coastguard Worker *
174*1c60b9acSAndroid Build Coastguard Worker * // fill your part of the buffer... for example here it's all zeros
175*1c60b9acSAndroid Build Coastguard Worker * memset(&buf[LWS_PRE], 0, 128);
176*1c60b9acSAndroid Build Coastguard Worker *
177*1c60b9acSAndroid Build Coastguard Worker * if (lws_write(wsi, &buf[LWS_PRE], 128, LWS_WRITE_TEXT) < 128) {
178*1c60b9acSAndroid Build Coastguard Worker * ... the connection is dead ...
179*1c60b9acSAndroid Build Coastguard Worker * return -1;
180*1c60b9acSAndroid Build Coastguard Worker * }
181*1c60b9acSAndroid Build Coastguard Worker *
182*1c60b9acSAndroid Build Coastguard Worker * LWS_PRE is currently 16, which covers ws and h2 frame headers, and is
183*1c60b9acSAndroid Build Coastguard Worker * compatible with 32 and 64-bit alignment requirements.
184*1c60b9acSAndroid Build Coastguard Worker *
185*1c60b9acSAndroid Build Coastguard Worker * (LWS_SEND_BUFFER_POST_PADDING is deprecated, it's now 0 and can be left off.)
186*1c60b9acSAndroid Build Coastguard Worker *
187*1c60b9acSAndroid Build Coastguard Worker * Return may be -1 is the write failed in a way indicating that the connection
188*1c60b9acSAndroid Build Coastguard Worker * has ended already, in which case you can close your side, or a positive
189*1c60b9acSAndroid Build Coastguard Worker * number that is at least the number of bytes requested to send (under some
190*1c60b9acSAndroid Build Coastguard Worker * encapsulation scenarios, it can indicate more than you asked was sent).
191*1c60b9acSAndroid Build Coastguard Worker *
192*1c60b9acSAndroid Build Coastguard Worker * The recommended test of the return is less than what you asked indicates
193*1c60b9acSAndroid Build Coastguard Worker * the connection has failed.
194*1c60b9acSAndroid Build Coastguard Worker *
195*1c60b9acSAndroid Build Coastguard Worker * Truncated Writes
196*1c60b9acSAndroid Build Coastguard Worker * ================
197*1c60b9acSAndroid Build Coastguard Worker *
198*1c60b9acSAndroid Build Coastguard Worker * The OS may not accept everything you asked to write on the connection.
199*1c60b9acSAndroid Build Coastguard Worker *
200*1c60b9acSAndroid Build Coastguard Worker * Posix defines POLLOUT indication from poll() to show that the connection
201*1c60b9acSAndroid Build Coastguard Worker * will accept more write data, but it doesn't specifiy how much. It may just
202*1c60b9acSAndroid Build Coastguard Worker * accept one byte of whatever you wanted to send.
203*1c60b9acSAndroid Build Coastguard Worker *
204*1c60b9acSAndroid Build Coastguard Worker * LWS will buffer the remainder automatically, and send it out autonomously.
205*1c60b9acSAndroid Build Coastguard Worker *
206*1c60b9acSAndroid Build Coastguard Worker * During that time, WRITABLE callbacks to user code will be suppressed and
207*1c60b9acSAndroid Build Coastguard Worker * instead used internally. After it completes, it will send an extra WRITEABLE
208*1c60b9acSAndroid Build Coastguard Worker * callback to the user code, in case any request was missed. So it is possible
209*1c60b9acSAndroid Build Coastguard Worker * to receive unasked-for WRITEABLE callbacks, the user code should have enough
210*1c60b9acSAndroid Build Coastguard Worker * state to know if it wants to write anything and just return if not.
211*1c60b9acSAndroid Build Coastguard Worker *
212*1c60b9acSAndroid Build Coastguard Worker * This is to handle corner cases where unexpectedly the OS refuses what we
213*1c60b9acSAndroid Build Coastguard Worker * usually expect it to accept. It's not recommended as the way to randomly
214*1c60b9acSAndroid Build Coastguard Worker * send huge payloads, since it is being copied on to heap and is inefficient.
215*1c60b9acSAndroid Build Coastguard Worker *
216*1c60b9acSAndroid Build Coastguard Worker * Huge payloads should instead be sent in fragments that are around 2 x mtu,
217*1c60b9acSAndroid Build Coastguard Worker * which is almost always directly accepted by the OS. To simplify this for
218*1c60b9acSAndroid Build Coastguard Worker * ws fragments, there is a helper lws_write_ws_flags() below that simplifies
219*1c60b9acSAndroid Build Coastguard Worker * selecting the correct flags to give lws_write() for each fragment.
220*1c60b9acSAndroid Build Coastguard Worker *
221*1c60b9acSAndroid Build Coastguard Worker * In the case of RFC8441 ws-over-h2, you cannot send ws fragments larger than
222*1c60b9acSAndroid Build Coastguard Worker * the max h2 frame size, typically 16KB, but should further restrict it to
223*1c60b9acSAndroid Build Coastguard Worker * the same ~2 x mtu limit mentioned above.
224*1c60b9acSAndroid Build Coastguard Worker */
225*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int
226*1c60b9acSAndroid Build Coastguard Worker lws_write(struct lws *wsi, unsigned char *buf, size_t len,
227*1c60b9acSAndroid Build Coastguard Worker enum lws_write_protocol protocol);
228*1c60b9acSAndroid Build Coastguard Worker
229*1c60b9acSAndroid Build Coastguard Worker /* helper for case where buffer may be const */
230*1c60b9acSAndroid Build Coastguard Worker #define lws_write_http(wsi, buf, len) \
231*1c60b9acSAndroid Build Coastguard Worker lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
232*1c60b9acSAndroid Build Coastguard Worker
233*1c60b9acSAndroid Build Coastguard Worker /**
234*1c60b9acSAndroid Build Coastguard Worker * lws_write_ws_flags() - Helper for multi-frame ws message flags
235*1c60b9acSAndroid Build Coastguard Worker *
236*1c60b9acSAndroid Build Coastguard Worker * \param initial: the lws_write flag to use for the start fragment, eg,
237*1c60b9acSAndroid Build Coastguard Worker * LWS_WRITE_TEXT
238*1c60b9acSAndroid Build Coastguard Worker * \param is_start: nonzero if this is the first fragment of the message
239*1c60b9acSAndroid Build Coastguard Worker * \param is_end: nonzero if this is the last fragment of the message
240*1c60b9acSAndroid Build Coastguard Worker *
241*1c60b9acSAndroid Build Coastguard Worker * Returns the correct LWS_WRITE_ flag to use for each fragment of a message
242*1c60b9acSAndroid Build Coastguard Worker * in turn.
243*1c60b9acSAndroid Build Coastguard Worker */
244*1c60b9acSAndroid Build Coastguard Worker static LWS_INLINE int
lws_write_ws_flags(int initial,int is_start,int is_end)245*1c60b9acSAndroid Build Coastguard Worker lws_write_ws_flags(int initial, int is_start, int is_end)
246*1c60b9acSAndroid Build Coastguard Worker {
247*1c60b9acSAndroid Build Coastguard Worker int r;
248*1c60b9acSAndroid Build Coastguard Worker
249*1c60b9acSAndroid Build Coastguard Worker if (is_start)
250*1c60b9acSAndroid Build Coastguard Worker r = initial;
251*1c60b9acSAndroid Build Coastguard Worker else
252*1c60b9acSAndroid Build Coastguard Worker r = LWS_WRITE_CONTINUATION;
253*1c60b9acSAndroid Build Coastguard Worker
254*1c60b9acSAndroid Build Coastguard Worker if (!is_end)
255*1c60b9acSAndroid Build Coastguard Worker r |= LWS_WRITE_NO_FIN;
256*1c60b9acSAndroid Build Coastguard Worker
257*1c60b9acSAndroid Build Coastguard Worker return r;
258*1c60b9acSAndroid Build Coastguard Worker }
259*1c60b9acSAndroid Build Coastguard Worker
260*1c60b9acSAndroid Build Coastguard Worker /**
261*1c60b9acSAndroid Build Coastguard Worker * lws_raw_transaction_completed() - Helper for flushing before close
262*1c60b9acSAndroid Build Coastguard Worker *
263*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the struct lws to operate on
264*1c60b9acSAndroid Build Coastguard Worker *
265*1c60b9acSAndroid Build Coastguard Worker * Returns -1 if the wsi can close now. However if there is buffered, unsent
266*1c60b9acSAndroid Build Coastguard Worker * data, the wsi is marked as to be closed when the output buffer data is
267*1c60b9acSAndroid Build Coastguard Worker * drained, and it returns 0.
268*1c60b9acSAndroid Build Coastguard Worker *
269*1c60b9acSAndroid Build Coastguard Worker * For raw cases where the transaction completed without failure,
270*1c60b9acSAndroid Build Coastguard Worker * `return lws_raw_transaction_completed(wsi)` should better be used than
271*1c60b9acSAndroid Build Coastguard Worker * return -1.
272*1c60b9acSAndroid Build Coastguard Worker */
273*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
274*1c60b9acSAndroid Build Coastguard Worker lws_raw_transaction_completed(struct lws *wsi);
275*1c60b9acSAndroid Build Coastguard Worker
276*1c60b9acSAndroid Build Coastguard Worker ///@}
277