xref: /aosp_15_r20/external/curl/docs/libcurl/curl_ws_send.md (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker---
2*6236dae4SAndroid Build Coastguard Workerc: Copyright (C) Daniel Stenberg, <[email protected]>, et al.
3*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl
4*6236dae4SAndroid Build Coastguard WorkerTitle: curl_ws_send
5*6236dae4SAndroid Build Coastguard WorkerSection: 3
6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl
7*6236dae4SAndroid Build Coastguard WorkerSee-also:
8*6236dae4SAndroid Build Coastguard Worker  - curl_easy_getinfo (3)
9*6236dae4SAndroid Build Coastguard Worker  - curl_easy_perform (3)
10*6236dae4SAndroid Build Coastguard Worker  - curl_easy_setopt (3)
11*6236dae4SAndroid Build Coastguard Worker  - curl_ws_recv (3)
12*6236dae4SAndroid Build Coastguard Worker  - libcurl-ws (3)
13*6236dae4SAndroid Build Coastguard WorkerProtocol:
14*6236dae4SAndroid Build Coastguard Worker  - WS
15*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.86.0
16*6236dae4SAndroid Build Coastguard Worker---
17*6236dae4SAndroid Build Coastguard Worker
18*6236dae4SAndroid Build Coastguard Worker# NAME
19*6236dae4SAndroid Build Coastguard Worker
20*6236dae4SAndroid Build Coastguard Workercurl_ws_send - send WebSocket data
21*6236dae4SAndroid Build Coastguard Worker
22*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS
23*6236dae4SAndroid Build Coastguard Worker
24*6236dae4SAndroid Build Coastguard Worker~~~c
25*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h>
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_ws_send(CURL *curl, const void *buffer, size_t buflen,
28*6236dae4SAndroid Build Coastguard Worker                      size_t *sent, curl_off_t fragsize,
29*6236dae4SAndroid Build Coastguard Worker                      unsigned int flags);
30*6236dae4SAndroid Build Coastguard Worker~~~
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
33*6236dae4SAndroid Build Coastguard Worker
34*6236dae4SAndroid Build Coastguard WorkerThis function call is EXPERIMENTAL.
35*6236dae4SAndroid Build Coastguard Worker
36*6236dae4SAndroid Build Coastguard WorkerSend the specific message fragment over an established WebSocket
37*6236dae4SAndroid Build Coastguard Workerconnection. The *buffer* holds the data to send and it is *buflen*
38*6236dae4SAndroid Build Coastguard Workernumber of payload bytes in that memory area.
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard Worker*sent* is returned as the number of payload bytes actually sent.
41*6236dae4SAndroid Build Coastguard Worker
42*6236dae4SAndroid Build Coastguard WorkerTo send a (huge) fragment using multiple calls with partial content per
43*6236dae4SAndroid Build Coastguard Workerinvoke, set the *CURLWS_OFFSET* bit and the *fragsize* argument as the
44*6236dae4SAndroid Build Coastguard Workertotal expected size for the first part, then set the *CURLWS_OFFSET* with
45*6236dae4SAndroid Build Coastguard Workera zero *fragsize* for the following parts.
46*6236dae4SAndroid Build Coastguard Worker
47*6236dae4SAndroid Build Coastguard WorkerIf not sending a partial fragment or if this is raw mode, *fragsize*
48*6236dae4SAndroid Build Coastguard Workershould be set to zero.
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard WorkerIf **CURLWS_RAW_MODE** is enabled in CURLOPT_WS_OPTIONS(3), the
51*6236dae4SAndroid Build Coastguard Worker**flags** argument should be set to 0.
52*6236dae4SAndroid Build Coastguard Worker
53*6236dae4SAndroid Build Coastguard WorkerTo send a message consisting of multiple frames, set the *CURLWS_CONT* bit
54*6236dae4SAndroid Build Coastguard Workerin all frames except the final one.
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard WorkerWarning: while it is possible to invoke this function from a callback,
57*6236dae4SAndroid Build Coastguard Workersuch a call is blocking in this situation, e.g. only returns after all data
58*6236dae4SAndroid Build Coastguard Workerhas been sent or an error is encountered.
59*6236dae4SAndroid Build Coastguard Worker
60*6236dae4SAndroid Build Coastguard Worker# FLAGS
61*6236dae4SAndroid Build Coastguard Worker
62*6236dae4SAndroid Build Coastguard Worker## CURLWS_TEXT
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard WorkerThe buffer contains text data. Note that this makes a difference to WebSocket
65*6236dae4SAndroid Build Coastguard Workerbut libcurl itself does not make any verification of the content or
66*6236dae4SAndroid Build Coastguard Workerprecautions that you actually send valid UTF-8 content.
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker## CURLWS_BINARY
69*6236dae4SAndroid Build Coastguard Worker
70*6236dae4SAndroid Build Coastguard WorkerThis is binary data.
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Worker## CURLWS_CONT
73*6236dae4SAndroid Build Coastguard Worker
74*6236dae4SAndroid Build Coastguard WorkerThis is not the final fragment of the message, which implies that there is
75*6236dae4SAndroid Build Coastguard Workeranother fragment coming as part of the same message where this bit is not set.
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker## CURLWS_CLOSE
78*6236dae4SAndroid Build Coastguard Worker
79*6236dae4SAndroid Build Coastguard WorkerClose this transfer.
80*6236dae4SAndroid Build Coastguard Worker
81*6236dae4SAndroid Build Coastguard Worker## CURLWS_PING
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard WorkerThis is a ping.
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard Worker## CURLWS_PONG
86*6236dae4SAndroid Build Coastguard Worker
87*6236dae4SAndroid Build Coastguard WorkerThis is a pong.
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard Worker## CURLWS_OFFSET
90*6236dae4SAndroid Build Coastguard Worker
91*6236dae4SAndroid Build Coastguard WorkerThe provided data is only a partial fragment and there is more coming in a
92*6236dae4SAndroid Build Coastguard Workerfollowing call to *curl_ws_send()*. When sending only a piece of the
93*6236dae4SAndroid Build Coastguard Workerfragment like this, the *fragsize* must be provided with the total
94*6236dae4SAndroid Build Coastguard Workerexpected fragment size in the first call and it needs to be zero in subsequent
95*6236dae4SAndroid Build Coastguard Workercalls.
96*6236dae4SAndroid Build Coastguard Worker
97*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS%
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker# EXAMPLE
100*6236dae4SAndroid Build Coastguard Worker
101*6236dae4SAndroid Build Coastguard Worker~~~c
102*6236dae4SAndroid Build Coastguard Worker#include <string.h> /* for strlen */
103*6236dae4SAndroid Build Coastguard Worker
104*6236dae4SAndroid Build Coastguard Workerconst char *send_payload = "magic";
105*6236dae4SAndroid Build Coastguard Worker
106*6236dae4SAndroid Build Coastguard Workerint main(void)
107*6236dae4SAndroid Build Coastguard Worker{
108*6236dae4SAndroid Build Coastguard Worker  size_t sent;
109*6236dae4SAndroid Build Coastguard Worker  CURLcode res;
110*6236dae4SAndroid Build Coastguard Worker  CURL *curl = curl_easy_init();
111*6236dae4SAndroid Build Coastguard Worker  curl_easy_setopt(curl, CURLOPT_URL, "wss://example.com/");
112*6236dae4SAndroid Build Coastguard Worker  curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 2L);
113*6236dae4SAndroid Build Coastguard Worker  curl_easy_perform(curl);
114*6236dae4SAndroid Build Coastguard Worker  res = curl_ws_send(curl, send_payload, strlen(send_payload), &sent, 0,
115*6236dae4SAndroid Build Coastguard Worker                     CURLWS_PING);
116*6236dae4SAndroid Build Coastguard Worker  curl_easy_cleanup(curl);
117*6236dae4SAndroid Build Coastguard Worker  return (int)res;
118*6236dae4SAndroid Build Coastguard Worker}
119*6236dae4SAndroid Build Coastguard Worker~~~
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY%
122*6236dae4SAndroid Build Coastguard Worker
123*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE
124*6236dae4SAndroid Build Coastguard Worker
125*6236dae4SAndroid Build Coastguard Worker*CURLE_OK* (zero) means that the data was sent properly, non-zero means an
126*6236dae4SAndroid Build Coastguard Workererror occurred as *\<curl/curl.h\>* defines. See the libcurl-errors(3) man
127*6236dae4SAndroid Build Coastguard Workerpage for the full list with descriptions.
128