xref: /aosp_15_r20/external/curl/docs/libcurl/opts/CURLOPT_READFUNCTION.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: CURLOPT_READFUNCTION
5*6236dae4SAndroid Build Coastguard WorkerSection: 3
6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl
7*6236dae4SAndroid Build Coastguard WorkerSee-also:
8*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_POST (3)
9*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_READDATA (3)
10*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_SEEKFUNCTION (3)
11*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_UPLOAD (3)
12*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_UPLOAD_BUFFERSIZE (3)
13*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_WRITEFUNCTION (3)
14*6236dae4SAndroid Build Coastguard WorkerProtocol:
15*6236dae4SAndroid Build Coastguard Worker  - All
16*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.1
17*6236dae4SAndroid Build Coastguard Worker---
18*6236dae4SAndroid Build Coastguard Worker
19*6236dae4SAndroid Build Coastguard Worker# NAME
20*6236dae4SAndroid Build Coastguard Worker
21*6236dae4SAndroid Build Coastguard WorkerCURLOPT_READFUNCTION - read callback for data uploads
22*6236dae4SAndroid Build Coastguard Worker
23*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker~~~c
26*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h>
27*6236dae4SAndroid Build Coastguard Worker
28*6236dae4SAndroid Build Coastguard Workersize_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata);
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_easy_setopt(CURL *handle, CURLOPT_READFUNCTION, read_callback);
31*6236dae4SAndroid Build Coastguard Worker~~~
32*6236dae4SAndroid Build Coastguard Worker
33*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard WorkerPass a pointer to your callback function, as the prototype shows above.
36*6236dae4SAndroid Build Coastguard Worker
37*6236dae4SAndroid Build Coastguard WorkerThis callback function gets called by libcurl as soon as it needs to read data
38*6236dae4SAndroid Build Coastguard Workerin order to send it to the peer - like if you ask it to upload or post data to
39*6236dae4SAndroid Build Coastguard Workerthe server. The data area pointed at by the pointer *buffer* should be
40*6236dae4SAndroid Build Coastguard Workerfilled up with at most *size* multiplied with *nitems* number of bytes
41*6236dae4SAndroid Build Coastguard Workerby your function. *size* is always 1.
42*6236dae4SAndroid Build Coastguard Worker
43*6236dae4SAndroid Build Coastguard WorkerSet the *userdata* argument with the CURLOPT_READDATA(3) option.
44*6236dae4SAndroid Build Coastguard Worker
45*6236dae4SAndroid Build Coastguard WorkerYour function must return the actual number of bytes that it stored in the
46*6236dae4SAndroid Build Coastguard Workerdata area pointed at by the pointer *buffer*. Returning 0 signals
47*6236dae4SAndroid Build Coastguard Workerend-of-file to the library and causes it to stop the current transfer.
48*6236dae4SAndroid Build Coastguard Worker
49*6236dae4SAndroid Build Coastguard WorkerIf you stop the current transfer by returning 0 "pre-maturely" (i.e before the
50*6236dae4SAndroid Build Coastguard Workerserver expected it, like when you have said you would upload N bytes and you
51*6236dae4SAndroid Build Coastguard Workerupload less than N bytes), you may experience that the server "hangs" waiting
52*6236dae4SAndroid Build Coastguard Workerfor the rest of the data that is not sent.
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard WorkerThe read callback may return *CURL_READFUNC_ABORT* to stop the current
55*6236dae4SAndroid Build Coastguard Workeroperation immediately, resulting in a *CURLE_ABORTED_BY_CALLBACK* error
56*6236dae4SAndroid Build Coastguard Workercode from the transfer.
57*6236dae4SAndroid Build Coastguard Worker
58*6236dae4SAndroid Build Coastguard WorkerThe callback can return *CURL_READFUNC_PAUSE* to cause reading from this
59*6236dae4SAndroid Build Coastguard Workerconnection to pause. See curl_easy_pause(3) for further details.
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker**Bugs**: when doing TFTP uploads, you must return the exact amount of data
62*6236dae4SAndroid Build Coastguard Workerthat the callback wants, or it is considered the final packet by the server
63*6236dae4SAndroid Build Coastguard Workerend and the transfer ends there.
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard WorkerIf you set this callback pointer to NULL, or do not set it at all, the default
66*6236dae4SAndroid Build Coastguard Workerinternal read function is used. It is doing an fread() on the FILE * userdata
67*6236dae4SAndroid Build Coastguard Workerset with CURLOPT_READDATA(3).
68*6236dae4SAndroid Build Coastguard Worker
69*6236dae4SAndroid Build Coastguard WorkerYou can set the total size of the data you are sending by using
70*6236dae4SAndroid Build Coastguard WorkerCURLOPT_INFILESIZE_LARGE(3) or CURLOPT_POSTFIELDSIZE_LARGE(3),
71*6236dae4SAndroid Build Coastguard Workerdepending on the type of transfer. For some transfer types it may be required
72*6236dae4SAndroid Build Coastguard Workerand it allows for better error checking.
73*6236dae4SAndroid Build Coastguard Worker
74*6236dae4SAndroid Build Coastguard Worker# DEFAULT
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Workerfread(3)
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS%
79*6236dae4SAndroid Build Coastguard Worker
80*6236dae4SAndroid Build Coastguard Worker# EXAMPLE
81*6236dae4SAndroid Build Coastguard Worker
82*6236dae4SAndroid Build Coastguard Worker~~~c
83*6236dae4SAndroid Build Coastguard Workersize_t read_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
84*6236dae4SAndroid Build Coastguard Worker{
85*6236dae4SAndroid Build Coastguard Worker  FILE *readhere = (FILE *)userdata;
86*6236dae4SAndroid Build Coastguard Worker  curl_off_t nread;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker  /* copy as much data as possible into the 'ptr' buffer, but no more than
89*6236dae4SAndroid Build Coastguard Worker     'size' * 'nmemb' bytes. */
90*6236dae4SAndroid Build Coastguard Worker  size_t retcode = fread(ptr, size, nmemb, readhere);
91*6236dae4SAndroid Build Coastguard Worker
92*6236dae4SAndroid Build Coastguard Worker  nread = (curl_off_t)retcode;
93*6236dae4SAndroid Build Coastguard Worker
94*6236dae4SAndroid Build Coastguard Worker  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
95*6236dae4SAndroid Build Coastguard Worker          " bytes from file\n", nread);
96*6236dae4SAndroid Build Coastguard Worker  return retcode;
97*6236dae4SAndroid Build Coastguard Worker}
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Workerint main(int argc, char **argv)
100*6236dae4SAndroid Build Coastguard Worker{
101*6236dae4SAndroid Build Coastguard Worker  FILE *file = fopen(argv[1], "rb");
102*6236dae4SAndroid Build Coastguard Worker  CURLcode result;
103*6236dae4SAndroid Build Coastguard Worker
104*6236dae4SAndroid Build Coastguard Worker  CURL *curl = curl_easy_init();
105*6236dae4SAndroid Build Coastguard Worker  if(curl) {
106*6236dae4SAndroid Build Coastguard Worker    /* set callback to use */
107*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Worker    /* pass in suitable argument to callback */
110*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_READDATA, (void *)file);
111*6236dae4SAndroid Build Coastguard Worker
112*6236dae4SAndroid Build Coastguard Worker    result = curl_easy_perform(curl);
113*6236dae4SAndroid Build Coastguard Worker  }
114*6236dae4SAndroid Build Coastguard Worker}
115*6236dae4SAndroid Build Coastguard Worker~~~
116*6236dae4SAndroid Build Coastguard Worker
117*6236dae4SAndroid Build Coastguard Worker# HISTORY
118*6236dae4SAndroid Build Coastguard Worker
119*6236dae4SAndroid Build Coastguard WorkerCURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
120*6236dae4SAndroid Build Coastguard Workerwas added in 7.12.1.
121*6236dae4SAndroid Build Coastguard Worker
122*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY%
123*6236dae4SAndroid Build Coastguard Worker
124*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE
125*6236dae4SAndroid Build Coastguard Worker
126*6236dae4SAndroid Build Coastguard WorkerThis returns CURLE_OK.
127