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