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_DEBUGFUNCTION 5*6236dae4SAndroid Build Coastguard WorkerSection: 3 6*6236dae4SAndroid Build Coastguard WorkerSource: libcurl 7*6236dae4SAndroid Build Coastguard WorkerSee-also: 8*6236dae4SAndroid Build Coastguard Worker - CURLINFO_CONN_ID (3) 9*6236dae4SAndroid Build Coastguard Worker - CURLINFO_XFER_ID (3) 10*6236dae4SAndroid Build Coastguard Worker - CURLOPT_DEBUGDATA (3) 11*6236dae4SAndroid Build Coastguard Worker - CURLOPT_VERBOSE (3) 12*6236dae4SAndroid Build Coastguard Worker - curl_global_trace (3) 13*6236dae4SAndroid Build Coastguard WorkerProtocol: 14*6236dae4SAndroid Build Coastguard Worker - All 15*6236dae4SAndroid Build Coastguard WorkerAdded-in: 7.9.6 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 WorkerCURLOPT_DEBUGFUNCTION - debug callback 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 Workertypedef enum { 28*6236dae4SAndroid Build Coastguard Worker CURLINFO_TEXT = 0, 29*6236dae4SAndroid Build Coastguard Worker CURLINFO_HEADER_IN, /* 1 */ 30*6236dae4SAndroid Build Coastguard Worker CURLINFO_HEADER_OUT, /* 2 */ 31*6236dae4SAndroid Build Coastguard Worker CURLINFO_DATA_IN, /* 3 */ 32*6236dae4SAndroid Build Coastguard Worker CURLINFO_DATA_OUT, /* 4 */ 33*6236dae4SAndroid Build Coastguard Worker CURLINFO_SSL_DATA_IN, /* 5 */ 34*6236dae4SAndroid Build Coastguard Worker CURLINFO_SSL_DATA_OUT, /* 6 */ 35*6236dae4SAndroid Build Coastguard Worker CURLINFO_END 36*6236dae4SAndroid Build Coastguard Worker} curl_infotype; 37*6236dae4SAndroid Build Coastguard Worker 38*6236dae4SAndroid Build Coastguard Workerint debug_callback(CURL *handle, 39*6236dae4SAndroid Build Coastguard Worker curl_infotype type, 40*6236dae4SAndroid Build Coastguard Worker char *data, 41*6236dae4SAndroid Build Coastguard Worker size_t size, 42*6236dae4SAndroid Build Coastguard Worker void *clientp); 43*6236dae4SAndroid Build Coastguard Worker 44*6236dae4SAndroid Build Coastguard WorkerCURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION, 45*6236dae4SAndroid Build Coastguard Worker debug_callback); 46*6236dae4SAndroid Build Coastguard Worker~~~ 47*6236dae4SAndroid Build Coastguard Worker 48*6236dae4SAndroid Build Coastguard Worker# DESCRIPTION 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard WorkerPass a pointer to your callback function, which should match the prototype 51*6236dae4SAndroid Build Coastguard Workershown above. 52*6236dae4SAndroid Build Coastguard Worker 53*6236dae4SAndroid Build Coastguard WorkerCURLOPT_DEBUGFUNCTION(3) replaces the standard debug function used when 54*6236dae4SAndroid Build Coastguard WorkerCURLOPT_VERBOSE(3) is in effect. This callback receives debug 55*6236dae4SAndroid Build Coastguard Workerinformation, as specified in the *type* argument. This function must 56*6236dae4SAndroid Build Coastguard Workerreturn 0. The *data* pointed to by the char * passed to this function is 57*6236dae4SAndroid Build Coastguard Workernot null-terminated, but is exactly of the *size* as told by the 58*6236dae4SAndroid Build Coastguard Worker*size* argument. 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard WorkerThe *clientp* argument is the pointer set with CURLOPT_DEBUGDATA(3). 61*6236dae4SAndroid Build Coastguard Worker 62*6236dae4SAndroid Build Coastguard WorkerAvailable **curl_infotype** values: 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard Worker## CURLINFO_TEXT 65*6236dae4SAndroid Build Coastguard Worker 66*6236dae4SAndroid Build Coastguard WorkerThe data is informational text. 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker## CURLINFO_HEADER_IN 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard WorkerThe data is header (or header-like) data received from the peer. 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard Worker## CURLINFO_HEADER_OUT 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard WorkerThe data is header (or header-like) data sent to the peer. 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard Worker## CURLINFO_DATA_IN 77*6236dae4SAndroid Build Coastguard Worker 78*6236dae4SAndroid Build Coastguard WorkerThe data is the unprocessed protocol data received from the peer. Even if the 79*6236dae4SAndroid Build Coastguard Workerdata is encoded or compressed, it is not provided decoded nor decompressed 80*6236dae4SAndroid Build Coastguard Workerto this callback. If you need the data in decoded and decompressed form, use 81*6236dae4SAndroid Build Coastguard WorkerCURLOPT_WRITEFUNCTION(3). 82*6236dae4SAndroid Build Coastguard Worker 83*6236dae4SAndroid Build Coastguard Worker## CURLINFO_DATA_OUT 84*6236dae4SAndroid Build Coastguard Worker 85*6236dae4SAndroid Build Coastguard WorkerThe data is protocol data sent to the peer. 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard Worker## CURLINFO_SSL_DATA_OUT 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard WorkerThe data is SSL/TLS (binary) data sent to the peer. 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard Worker## CURLINFO_SSL_DATA_IN 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard WorkerThe data is SSL/TLS (binary) data received from the peer. 94*6236dae4SAndroid Build Coastguard Worker 95*6236dae4SAndroid Build Coastguard Worker## 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard WorkerWARNING: This callback may be called with the curl *handle* set to an internal 98*6236dae4SAndroid Build Coastguard Workerhandle. (Added in 8.4.0) 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard WorkerIf you need to distinguish your curl *handle* from internal handles then set 101*6236dae4SAndroid Build Coastguard WorkerCURLOPT_PRIVATE(3) on your handle. 102*6236dae4SAndroid Build Coastguard Worker 103*6236dae4SAndroid Build Coastguard Worker# DEFAULT 104*6236dae4SAndroid Build Coastguard Worker 105*6236dae4SAndroid Build Coastguard WorkerNULL 106*6236dae4SAndroid Build Coastguard Worker 107*6236dae4SAndroid Build Coastguard Worker# %PROTOCOLS% 108*6236dae4SAndroid Build Coastguard Worker 109*6236dae4SAndroid Build Coastguard Worker# EXAMPLE 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker~~~c 112*6236dae4SAndroid Build Coastguard Workerstatic 113*6236dae4SAndroid Build Coastguard Workervoid dump(const char *text, 114*6236dae4SAndroid Build Coastguard Worker FILE *stream, unsigned char *ptr, size_t size) 115*6236dae4SAndroid Build Coastguard Worker{ 116*6236dae4SAndroid Build Coastguard Worker size_t i; 117*6236dae4SAndroid Build Coastguard Worker size_t c; 118*6236dae4SAndroid Build Coastguard Worker unsigned int width = 0x10; 119*6236dae4SAndroid Build Coastguard Worker 120*6236dae4SAndroid Build Coastguard Worker fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", 121*6236dae4SAndroid Build Coastguard Worker text, (long)size, (long)size); 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < size; i += width) { 124*6236dae4SAndroid Build Coastguard Worker fprintf(stream, "%4.4lx: ", (long)i); 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard Worker /* show hex to the left */ 127*6236dae4SAndroid Build Coastguard Worker for(c = 0; c < width; c++) { 128*6236dae4SAndroid Build Coastguard Worker if(i + c < size) 129*6236dae4SAndroid Build Coastguard Worker fprintf(stream, "%02x ", ptr[i + c]); 130*6236dae4SAndroid Build Coastguard Worker else 131*6236dae4SAndroid Build Coastguard Worker fputs(" ", stream); 132*6236dae4SAndroid Build Coastguard Worker } 133*6236dae4SAndroid Build Coastguard Worker 134*6236dae4SAndroid Build Coastguard Worker /* show data on the right */ 135*6236dae4SAndroid Build Coastguard Worker for(c = 0; (c < width) && (i + c < size); c++) { 136*6236dae4SAndroid Build Coastguard Worker char x = (ptr[i + c] >= 0x20 && ptr[i + c] < 0x80) ? ptr[i + c] : '.'; 137*6236dae4SAndroid Build Coastguard Worker fputc(x, stream); 138*6236dae4SAndroid Build Coastguard Worker } 139*6236dae4SAndroid Build Coastguard Worker 140*6236dae4SAndroid Build Coastguard Worker fputc('\n', stream); /* newline */ 141*6236dae4SAndroid Build Coastguard Worker } 142*6236dae4SAndroid Build Coastguard Worker} 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Workerstatic 145*6236dae4SAndroid Build Coastguard Workerint my_trace(CURL *handle, curl_infotype type, 146*6236dae4SAndroid Build Coastguard Worker char *data, size_t size, 147*6236dae4SAndroid Build Coastguard Worker void *clientp) 148*6236dae4SAndroid Build Coastguard Worker{ 149*6236dae4SAndroid Build Coastguard Worker const char *text; 150*6236dae4SAndroid Build Coastguard Worker (void)handle; /* prevent compiler warning */ 151*6236dae4SAndroid Build Coastguard Worker (void)clientp; 152*6236dae4SAndroid Build Coastguard Worker 153*6236dae4SAndroid Build Coastguard Worker switch(type) { 154*6236dae4SAndroid Build Coastguard Worker case CURLINFO_TEXT: 155*6236dae4SAndroid Build Coastguard Worker fputs("== Info: ", stderr); 156*6236dae4SAndroid Build Coastguard Worker fwrite(data, size, 1, stderr); 157*6236dae4SAndroid Build Coastguard Worker default: /* in case a new one is introduced to shock us */ 158*6236dae4SAndroid Build Coastguard Worker return 0; 159*6236dae4SAndroid Build Coastguard Worker 160*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HEADER_OUT: 161*6236dae4SAndroid Build Coastguard Worker text = "=> Send header"; 162*6236dae4SAndroid Build Coastguard Worker break; 163*6236dae4SAndroid Build Coastguard Worker case CURLINFO_DATA_OUT: 164*6236dae4SAndroid Build Coastguard Worker text = "=> Send data"; 165*6236dae4SAndroid Build Coastguard Worker break; 166*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SSL_DATA_OUT: 167*6236dae4SAndroid Build Coastguard Worker text = "=> Send SSL data"; 168*6236dae4SAndroid Build Coastguard Worker break; 169*6236dae4SAndroid Build Coastguard Worker case CURLINFO_HEADER_IN: 170*6236dae4SAndroid Build Coastguard Worker text = "<= Recv header"; 171*6236dae4SAndroid Build Coastguard Worker break; 172*6236dae4SAndroid Build Coastguard Worker case CURLINFO_DATA_IN: 173*6236dae4SAndroid Build Coastguard Worker text = "<= Recv data"; 174*6236dae4SAndroid Build Coastguard Worker break; 175*6236dae4SAndroid Build Coastguard Worker case CURLINFO_SSL_DATA_IN: 176*6236dae4SAndroid Build Coastguard Worker text = "<= Recv SSL data"; 177*6236dae4SAndroid Build Coastguard Worker break; 178*6236dae4SAndroid Build Coastguard Worker } 179*6236dae4SAndroid Build Coastguard Worker 180*6236dae4SAndroid Build Coastguard Worker dump(text, stderr, (unsigned char *)data, size); 181*6236dae4SAndroid Build Coastguard Worker return 0; 182*6236dae4SAndroid Build Coastguard Worker} 183*6236dae4SAndroid Build Coastguard Worker 184*6236dae4SAndroid Build Coastguard Workerint main(void) 185*6236dae4SAndroid Build Coastguard Worker{ 186*6236dae4SAndroid Build Coastguard Worker CURL *curl; 187*6236dae4SAndroid Build Coastguard Worker CURLcode res; 188*6236dae4SAndroid Build Coastguard Worker 189*6236dae4SAndroid Build Coastguard Worker curl = curl_easy_init(); 190*6236dae4SAndroid Build Coastguard Worker if(curl) { 191*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); 192*6236dae4SAndroid Build Coastguard Worker 193*6236dae4SAndroid Build Coastguard Worker /* the DEBUGFUNCTION has no effect until we enable VERBOSE */ 194*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 195*6236dae4SAndroid Build Coastguard Worker 196*6236dae4SAndroid Build Coastguard Worker /* example.com is redirected, so we tell libcurl to follow redirection */ 197*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 198*6236dae4SAndroid Build Coastguard Worker 199*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/"); 200*6236dae4SAndroid Build Coastguard Worker res = curl_easy_perform(curl); 201*6236dae4SAndroid Build Coastguard Worker /* Check for errors */ 202*6236dae4SAndroid Build Coastguard Worker if(res != CURLE_OK) 203*6236dae4SAndroid Build Coastguard Worker fprintf(stderr, "curl_easy_perform() failed: %s\n", 204*6236dae4SAndroid Build Coastguard Worker curl_easy_strerror(res)); 205*6236dae4SAndroid Build Coastguard Worker 206*6236dae4SAndroid Build Coastguard Worker /* always cleanup */ 207*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(curl); 208*6236dae4SAndroid Build Coastguard Worker } 209*6236dae4SAndroid Build Coastguard Worker return 0; 210*6236dae4SAndroid Build Coastguard Worker} 211*6236dae4SAndroid Build Coastguard Worker~~~ 212*6236dae4SAndroid Build Coastguard Worker 213*6236dae4SAndroid Build Coastguard Worker# %AVAILABILITY% 214*6236dae4SAndroid Build Coastguard Worker 215*6236dae4SAndroid Build Coastguard Worker# RETURN VALUE 216*6236dae4SAndroid Build Coastguard Worker 217*6236dae4SAndroid Build Coastguard WorkerReturns CURLE_OK 218