xref: /aosp_15_r20/external/curl/docs/libcurl/curl_easy_recv.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_easy_recv
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_send (3)
11*6236dae4SAndroid Build Coastguard Worker  - curl_easy_setopt (3)
12*6236dae4SAndroid Build Coastguard WorkerProtocol:
13*6236dae4SAndroid Build Coastguard Worker  - All
14*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.18.2
15*6236dae4SAndroid Build Coastguard Worker---
16*6236dae4SAndroid Build Coastguard Worker
17*6236dae4SAndroid Build Coastguard Worker# NAME
18*6236dae4SAndroid Build Coastguard Worker
19*6236dae4SAndroid Build Coastguard Workercurl_easy_recv - receives raw data on an "easy" connection
20*6236dae4SAndroid Build Coastguard Worker
21*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS
22*6236dae4SAndroid Build Coastguard Worker
23*6236dae4SAndroid Build Coastguard Worker~~~c
24*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h>
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, size_t *n);
27*6236dae4SAndroid Build Coastguard Worker~~~
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
30*6236dae4SAndroid Build Coastguard Worker
31*6236dae4SAndroid Build Coastguard WorkerThis function receives raw data from the established connection. You may use
32*6236dae4SAndroid Build Coastguard Workerit together with curl_easy_send(3) to implement custom protocols using
33*6236dae4SAndroid Build Coastguard Workerlibcurl. This functionality can be particularly useful if you use proxies
34*6236dae4SAndroid Build Coastguard Workerand/or SSL encryption: libcurl takes care of proxy negotiation and connection
35*6236dae4SAndroid Build Coastguard Workersetup.
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard Worker**buffer** is a pointer to your buffer memory that gets populated by the
38*6236dae4SAndroid Build Coastguard Workerreceived data. **buflen** is the maximum amount of data you can get in that
39*6236dae4SAndroid Build Coastguard Workerbuffer. The variable **n** points to receives the number of received bytes.
40*6236dae4SAndroid Build Coastguard Worker
41*6236dae4SAndroid Build Coastguard WorkerTo establish the connection, set CURLOPT_CONNECT_ONLY(3) option before
42*6236dae4SAndroid Build Coastguard Workercalling curl_easy_perform(3) or curl_multi_perform(3). Note that
43*6236dae4SAndroid Build Coastguard Workercurl_easy_recv(3) does not work on connections that were created without
44*6236dae4SAndroid Build Coastguard Workerthis option.
45*6236dae4SAndroid Build Coastguard Worker
46*6236dae4SAndroid Build Coastguard WorkerThe call returns **CURLE_AGAIN** if there is no data to read - the socket is
47*6236dae4SAndroid Build Coastguard Workerused in non-blocking mode internally. When **CURLE_AGAIN** is returned, use
48*6236dae4SAndroid Build Coastguard Workeryour operating system facilities like *select(2)* to wait for data. The
49*6236dae4SAndroid Build Coastguard Workersocket may be obtained using curl_easy_getinfo(3) with
50*6236dae4SAndroid Build Coastguard WorkerCURLINFO_ACTIVESOCKET(3).
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard WorkerWait on the socket only if curl_easy_recv(3) returns **CURLE_AGAIN**.
53*6236dae4SAndroid Build Coastguard WorkerThe reason for this is libcurl or the SSL library may internally cache some
54*6236dae4SAndroid Build Coastguard Workerdata, therefore you should call curl_easy_recv(3) until all data is
55*6236dae4SAndroid Build Coastguard Workerread which would include any cached data.
56*6236dae4SAndroid Build Coastguard Worker
57*6236dae4SAndroid Build Coastguard WorkerFurthermore if you wait on the socket and it tells you there is data to read,
58*6236dae4SAndroid Build Coastguard Workercurl_easy_recv(3) may return **CURLE_AGAIN** if the only data that was
59*6236dae4SAndroid Build Coastguard Workerread was for internal SSL processing, and no other data is available.
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS%
62*6236dae4SAndroid Build Coastguard Worker
63*6236dae4SAndroid Build Coastguard Worker# EXAMPLE
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard Worker~~~c
66*6236dae4SAndroid Build Coastguard Workerint main(void)
67*6236dae4SAndroid Build Coastguard Worker{
68*6236dae4SAndroid Build Coastguard Worker  CURL *curl = curl_easy_init();
69*6236dae4SAndroid Build Coastguard Worker  if(curl) {
70*6236dae4SAndroid Build Coastguard Worker    CURLcode res;
71*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
72*6236dae4SAndroid Build Coastguard Worker    /* Do not do the transfer - only connect to host */
73*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
74*6236dae4SAndroid Build Coastguard Worker    res = curl_easy_perform(curl);
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Worker    if(res == CURLE_OK) {
77*6236dae4SAndroid Build Coastguard Worker      char buf[256];
78*6236dae4SAndroid Build Coastguard Worker      size_t nread;
79*6236dae4SAndroid Build Coastguard Worker      long sockfd;
80*6236dae4SAndroid Build Coastguard Worker
81*6236dae4SAndroid Build Coastguard Worker      /* Extract the socket from the curl handle - we need it for waiting. */
82*6236dae4SAndroid Build Coastguard Worker      res = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Worker      /* read data */
85*6236dae4SAndroid Build Coastguard Worker      res = curl_easy_recv(curl, buf, sizeof(buf), &nread);
86*6236dae4SAndroid Build Coastguard Worker    }
87*6236dae4SAndroid Build Coastguard Worker  }
88*6236dae4SAndroid Build Coastguard Worker}
89*6236dae4SAndroid Build Coastguard Worker~~~
90*6236dae4SAndroid Build Coastguard Worker
91*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY%
92*6236dae4SAndroid Build Coastguard Worker
93*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE
94*6236dae4SAndroid Build Coastguard Worker
95*6236dae4SAndroid Build Coastguard WorkerOn success, returns **CURLE_OK**, stores the received data into
96*6236dae4SAndroid Build Coastguard Worker**buffer**, and the number of bytes it actually read into ***n**.
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard WorkerOn failure, returns the appropriate error code.
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard WorkerThe function may return **CURLE_AGAIN**. In this case, use your operating
101*6236dae4SAndroid Build Coastguard Workersystem facilities to wait until data can be read, and retry.
102*6236dae4SAndroid Build Coastguard Worker
103*6236dae4SAndroid Build Coastguard WorkerReading exactly 0 bytes indicates a closed connection.
104*6236dae4SAndroid Build Coastguard Worker
105*6236dae4SAndroid Build Coastguard WorkerIf there is no socket available to use from the previous transfer, this function
106*6236dae4SAndroid Build Coastguard Workerreturns **CURLE_UNSUPPORTED_PROTOCOL**.
107