1CURLOPT_DEBUGFUNCTION(3) curl_easy_setopt options CURLOPT_DEBUGFUNCTION(3)
2
3
4
6 CURLOPT_DEBUGFUNCTION - debug callback
7
9 #include <curl/curl.h>
10
11 typedef enum {
12 CURLINFO_TEXT = 0,
13 CURLINFO_HEADER_IN, /* 1 */
14 CURLINFO_HEADER_OUT, /* 2 */
15 CURLINFO_DATA_IN, /* 3 */
16 CURLINFO_DATA_OUT, /* 4 */
17 CURLINFO_SSL_DATA_IN, /* 5 */
18 CURLINFO_SSL_DATA_OUT, /* 6 */
19 CURLINFO_END
20 } curl_infotype;
21
22 int debug_callback(CURL *handle,
23 curl_infotype type,
24 char *data,
25 size_t size,
26 void *clientp);
27
28 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION,
29 debug_callback);
30
32 Pass a pointer to your callback function, which should match the proto‐
33 type shown above.
34
35 CURLOPT_DEBUGFUNCTION(3) replaces the standard debug function used when
36 CURLOPT_VERBOSE(3) is in effect. This callback receives debug informa‐
37 tion, as specified in the type argument. This function must return 0.
38 The data pointed to by the char * passed to this function WILL NOT be
39 null-terminated, but will be exactly of the size as told by the size
40 argument.
41
42 The clientp argument is the pointer set with CURLOPT_DEBUGDATA(3).
43
44 Available curl_infotype values:
45
46 CURLINFO_TEXT
47 The data is informational text.
48
49 CURLINFO_HEADER_IN
50 The data is header (or header-like) data received from the peer.
51
52 CURLINFO_HEADER_OUT
53 The data is header (or header-like) data sent to the peer.
54
55 CURLINFO_DATA_IN
56 The data is the unprocessed protocol data received from the
57 peer. Even if the data is encoded or compressed, it will not be
58 provided decoded nor decompressed to this callback. If you need
59 the data in decoded and decompressed form, use CURLOPT_WRITE‐
60 FUNCTION(3).
61
62 CURLINFO_DATA_OUT
63 The data is protocol data sent to the peer.
64
65 CURLINFO_SSL_DATA_OUT
66 The data is SSL/TLS (binary) data sent to the peer.
67
68 CURLINFO_SSL_DATA_IN
69 The data is SSL/TLS (binary) data received from the peer.
70
72 NULL
73
75 All
76
78 static
79 void dump(const char *text,
80 FILE *stream, unsigned char *ptr, size_t size)
81 {
82 size_t i;
83 size_t c;
84 unsigned int width=0x10;
85
86 fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
87 text, (long)size, (long)size);
88
89 for(i=0; i<size; i+= width) {
90 fprintf(stream, "%4.4lx: ", (long)i);
91
92 /* show hex to the left */
93 for(c = 0; c < width; c++) {
94 if(i+c < size)
95 fprintf(stream, "%02x ", ptr[i+c]);
96 else
97 fputs(" ", stream);
98 }
99
100 /* show data on the right */
101 for(c = 0; (c < width) && (i+c < size); c++) {
102 char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x80) ? ptr[i+c] : '.';
103 fputc(x, stream);
104 }
105
106 fputc('\n', stream); /* newline */
107 }
108 }
109
110 static
111 int my_trace(CURL *handle, curl_infotype type,
112 char *data, size_t size,
113 void *clientp)
114 {
115 const char *text;
116 (void)handle; /* prevent compiler warning */
117 (void)clientp;
118
119 switch (type) {
120 case CURLINFO_TEXT:
121 fputs("== Info: ", stderr);
122 fwrite(data, size, 1, stderr);
123 default: /* in case a new one is introduced to shock us */
124 return 0;
125
126 case CURLINFO_HEADER_OUT:
127 text = "=> Send header";
128 break;
129 case CURLINFO_DATA_OUT:
130 text = "=> Send data";
131 break;
132 case CURLINFO_SSL_DATA_OUT:
133 text = "=> Send SSL data";
134 break;
135 case CURLINFO_HEADER_IN:
136 text = "<= Recv header";
137 break;
138 case CURLINFO_DATA_IN:
139 text = "<= Recv data";
140 break;
141 case CURLINFO_SSL_DATA_IN:
142 text = "<= Recv SSL data";
143 break;
144 }
145
146 dump(text, stderr, (unsigned char *)data, size);
147 return 0;
148 }
149
150 int main(void)
151 {
152 CURL *curl;
153 CURLcode res;
154
155 curl = curl_easy_init();
156 if(curl) {
157 curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
158
159 /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
160 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
161
162 /* example.com is redirected, so we tell libcurl to follow redirection */
163 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
164
165 curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
166 res = curl_easy_perform(curl);
167 /* Check for errors */
168 if(res != CURLE_OK)
169 fprintf(stderr, "curl_easy_perform() failed: %s\n",
170 curl_easy_strerror(res));
171
172 /* always cleanup */
173 curl_easy_cleanup(curl);
174 }
175 return 0;
176 }
177
179 Always
180
182 Returns CURLE_OK
183
185 CURLOPT_VERBOSE(3), CURLOPT_DEBUGDATA(3),
186
187
188
189libcurl 8.0.1 February 07, 2023 CURLOPT_DEBUGFUNCTION(3)