xref: /aosp_15_r20/external/curl/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.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_WRITEFUNCTION
5*6236dae4SAndroid Build Coastguard WorkerSection: 3
6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl
7*6236dae4SAndroid Build Coastguard WorkerSee-also:
8*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_HEADERFUNCTION (3)
9*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_READFUNCTION (3)
10*6236dae4SAndroid Build Coastguard Worker  - CURLOPT_WRITEDATA (3)
11*6236dae4SAndroid Build Coastguard WorkerProtocol:
12*6236dae4SAndroid Build Coastguard Worker  - All
13*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.1
14*6236dae4SAndroid Build Coastguard Worker---
15*6236dae4SAndroid Build Coastguard Worker
16*6236dae4SAndroid Build Coastguard Worker# NAME
17*6236dae4SAndroid Build Coastguard Worker
18*6236dae4SAndroid Build Coastguard WorkerCURLOPT_WRITEFUNCTION - callback for writing received data
19*6236dae4SAndroid Build Coastguard Worker
20*6236dae4SAndroid Build Coastguard Worker# SYNOPSIS
21*6236dae4SAndroid Build Coastguard Worker
22*6236dae4SAndroid Build Coastguard Worker~~~c
23*6236dae4SAndroid Build Coastguard Worker#include <curl/curl.h>
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Workersize_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);
28*6236dae4SAndroid Build Coastguard Worker~~~
29*6236dae4SAndroid Build Coastguard Worker
30*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard WorkerPass a pointer to your callback function, which should match the prototype
33*6236dae4SAndroid Build Coastguard Workershown above.
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard WorkerThis callback function gets called by libcurl as soon as there is data
36*6236dae4SAndroid Build Coastguard Workerreceived that needs to be saved. For most transfers, this callback gets called
37*6236dae4SAndroid Build Coastguard Workermany times and each invoke delivers another chunk of data. *ptr* points to the
38*6236dae4SAndroid Build Coastguard Workerdelivered data, and the size of that data is *nmemb*; *size* is always 1.
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard WorkerThe data passed to this function is not null-terminated.
41*6236dae4SAndroid Build Coastguard Worker
42*6236dae4SAndroid Build Coastguard WorkerThe callback function is passed as much data as possible in all invokes, but
43*6236dae4SAndroid Build Coastguard Workeryou must not make any assumptions. It may be one byte, it may be
44*6236dae4SAndroid Build Coastguard Workerthousands. The maximum amount of body data that is passed to the write
45*6236dae4SAndroid Build Coastguard Workercallback is defined in the curl.h header file: *CURL_MAX_WRITE_SIZE* (the
46*6236dae4SAndroid Build Coastguard Workerusual default is 16K). If CURLOPT_HEADER(3) is enabled, which makes header
47*6236dae4SAndroid Build Coastguard Workerdata get passed to the write callback, you can get up to
48*6236dae4SAndroid Build Coastguard Worker*CURL_MAX_HTTP_HEADER* bytes of header data passed into it. This usually means
49*6236dae4SAndroid Build Coastguard Worker100K.
50*6236dae4SAndroid Build Coastguard Worker
51*6236dae4SAndroid Build Coastguard WorkerThis function may be called with zero bytes data if the transferred file is
52*6236dae4SAndroid Build Coastguard Workerempty.
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard WorkerSet the *userdata* argument with the CURLOPT_WRITEDATA(3) option.
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard WorkerYour callback should return the number of bytes actually taken care of. If
57*6236dae4SAndroid Build Coastguard Workerthat amount differs from the amount passed to your callback function, it
58*6236dae4SAndroid Build Coastguard Workersignals an error condition to the library. This causes the transfer to get
59*6236dae4SAndroid Build Coastguard Workeraborted and the libcurl function used returns *CURLE_WRITE_ERROR*.
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard WorkerYou can also abort the transfer by returning CURL_WRITEFUNC_ERROR (added in
62*6236dae4SAndroid Build Coastguard Worker7.87.0), which makes *CURLE_WRITE_ERROR* get returned.
63*6236dae4SAndroid Build Coastguard Worker
64*6236dae4SAndroid Build Coastguard WorkerIf the callback function returns CURL_WRITEFUNC_PAUSE it pauses this
65*6236dae4SAndroid Build Coastguard Workertransfer. See curl_easy_pause(3) for further details.
66*6236dae4SAndroid Build Coastguard Worker
67*6236dae4SAndroid Build Coastguard WorkerSet this option to NULL to get the internal default function used instead of
68*6236dae4SAndroid Build Coastguard Workeryour callback. The internal default function writes the data to the FILE *
69*6236dae4SAndroid Build Coastguard Workergiven with CURLOPT_WRITEDATA(3).
70*6236dae4SAndroid Build Coastguard Worker
71*6236dae4SAndroid Build Coastguard WorkerThis option does not enable HSTS, you need to use CURLOPT_HSTS_CTRL(3) to
72*6236dae4SAndroid Build Coastguard Workerdo that.
73*6236dae4SAndroid Build Coastguard Worker
74*6236dae4SAndroid Build Coastguard Worker# DEFAULT
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Workerfwrite(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 Worker#include <stdlib.h> /* for realloc */
84*6236dae4SAndroid Build Coastguard Worker#include <string.h> /* for memcpy */
85*6236dae4SAndroid Build Coastguard Worker
86*6236dae4SAndroid Build Coastguard Workerstruct memory {
87*6236dae4SAndroid Build Coastguard Worker  char *response;
88*6236dae4SAndroid Build Coastguard Worker  size_t size;
89*6236dae4SAndroid Build Coastguard Worker};
90*6236dae4SAndroid Build Coastguard Worker
91*6236dae4SAndroid Build Coastguard Workerstatic size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
92*6236dae4SAndroid Build Coastguard Worker{
93*6236dae4SAndroid Build Coastguard Worker  size_t realsize = size * nmemb;
94*6236dae4SAndroid Build Coastguard Worker  struct memory *mem = (struct memory *)clientp;
95*6236dae4SAndroid Build Coastguard Worker
96*6236dae4SAndroid Build Coastguard Worker  char *ptr = realloc(mem->response, mem->size + realsize + 1);
97*6236dae4SAndroid Build Coastguard Worker  if(!ptr)
98*6236dae4SAndroid Build Coastguard Worker    return 0;  /* out of memory */
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard Worker  mem->response = ptr;
101*6236dae4SAndroid Build Coastguard Worker  memcpy(&(mem->response[mem->size]), data, realsize);
102*6236dae4SAndroid Build Coastguard Worker  mem->size += realsize;
103*6236dae4SAndroid Build Coastguard Worker  mem->response[mem->size] = 0;
104*6236dae4SAndroid Build Coastguard Worker
105*6236dae4SAndroid Build Coastguard Worker  return realsize;
106*6236dae4SAndroid Build Coastguard Worker}
107*6236dae4SAndroid Build Coastguard Worker
108*6236dae4SAndroid Build Coastguard Workerint main(void)
109*6236dae4SAndroid Build Coastguard Worker{
110*6236dae4SAndroid Build Coastguard Worker  struct memory chunk = {0};
111*6236dae4SAndroid Build Coastguard Worker  CURLcode res;
112*6236dae4SAndroid Build Coastguard Worker  CURL *curl = curl_easy_init();
113*6236dae4SAndroid Build Coastguard Worker  if(curl) {
114*6236dae4SAndroid Build Coastguard Worker    /* send all data to this function  */
115*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cb);
116*6236dae4SAndroid Build Coastguard Worker
117*6236dae4SAndroid Build Coastguard Worker    /* we pass our 'chunk' struct to the callback function */
118*6236dae4SAndroid Build Coastguard Worker    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
119*6236dae4SAndroid Build Coastguard Worker
120*6236dae4SAndroid Build Coastguard Worker    /* send a request */
121*6236dae4SAndroid Build Coastguard Worker    res = curl_easy_perform(curl);
122*6236dae4SAndroid Build Coastguard Worker
123*6236dae4SAndroid Build Coastguard Worker    /* remember to free the buffer */
124*6236dae4SAndroid Build Coastguard Worker    free(chunk.response);
125*6236dae4SAndroid Build Coastguard Worker
126*6236dae4SAndroid Build Coastguard Worker    curl_easy_cleanup(curl);
127*6236dae4SAndroid Build Coastguard Worker  }
128*6236dae4SAndroid Build Coastguard Worker}
129*6236dae4SAndroid Build Coastguard Worker~~~
130*6236dae4SAndroid Build Coastguard Worker
131*6236dae4SAndroid Build Coastguard Worker# HISTORY
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard WorkerSupport for the CURL_WRITEFUNC_PAUSE return code was added in version 7.18.0.
134*6236dae4SAndroid Build Coastguard Worker
135*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY%
136*6236dae4SAndroid Build Coastguard Worker
137*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE
138*6236dae4SAndroid Build Coastguard Worker
139*6236dae4SAndroid Build Coastguard WorkerThis returns CURLE_OK.
140