xref: /aosp_15_r20/external/curl/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.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_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