1CURLOPT_DEBUGFUNCTION(3)   curl_easy_setopt options   CURLOPT_DEBUGFUNCTION(3)
2
3
4

NAME

6       CURLOPT_DEBUGFUNCTION - debug callback
7

SYNOPSIS

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 *userptr);
27
28       CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION,
29                                 debug_callback);
30

DESCRIPTION

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 userptr 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 protocol data received from the peer.
57
58       CURLINFO_DATA_OUT
59              The data is protocol data sent to the peer.
60
61       CURLINFO_SSL_DATA_OUT
62              The data is SSL/TLS (binary) data sent to the peer.
63
64       CURLINFO_SSL_DATA_IN
65              The data is SSL/TLS (binary) data received from the peer.
66

DEFAULT

68       NULL
69

PROTOCOLS

71       All
72

EXAMPLE

74       static
75       void dump(const char *text,
76                 FILE *stream, unsigned char *ptr, size_t size)
77       {
78         size_t i;
79         size_t c;
80         unsigned int width=0x10;
81
82         fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
83                 text, (long)size, (long)size);
84
85         for(i=0; i<size; i+= width) {
86           fprintf(stream, "%4.4lx: ", (long)i);
87
88           /* show hex to the left */
89           for(c = 0; c < width; c++) {
90             if(i+c < size)
91               fprintf(stream, "%02x ", ptr[i+c]);
92             else
93               fputs("   ", stream);
94           }
95
96           /* show data on the right */
97           for(c = 0; (c < width) && (i+c < size); c++) {
98             char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x80) ? ptr[i+c] : '.';
99             fputc(x, stream);
100           }
101
102           fputc('\n', stream); /* newline */
103         }
104       }
105
106       static
107       int my_trace(CURL *handle, curl_infotype type,
108                    char *data, size_t size,
109                    void *userp)
110       {
111         const char *text;
112         (void)handle; /* prevent compiler warning */
113         (void)userp;
114
115         switch (type) {
116         case CURLINFO_TEXT:
117           fprintf(stderr, "== Info: %s", data);
118         default: /* in case a new one is introduced to shock us */
119           return 0;
120
121         case CURLINFO_HEADER_OUT:
122           text = "=> Send header";
123           break;
124         case CURLINFO_DATA_OUT:
125           text = "=> Send data";
126           break;
127         case CURLINFO_SSL_DATA_OUT:
128           text = "=> Send SSL data";
129           break;
130         case CURLINFO_HEADER_IN:
131           text = "<= Recv header";
132           break;
133         case CURLINFO_DATA_IN:
134           text = "<= Recv data";
135           break;
136         case CURLINFO_SSL_DATA_IN:
137           text = "<= Recv SSL data";
138           break;
139         }
140
141         dump(text, stderr, (unsigned char *)data, size);
142         return 0;
143       }
144
145       int main(void)
146       {
147         CURL *curl;
148         CURLcode res;
149
150         curl = curl_easy_init();
151         if(curl) {
152           curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
153
154           /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
155           curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
156
157           /* example.com is redirected, so we tell libcurl to follow redirection */
158           curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
159
160           curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
161           res = curl_easy_perform(curl);
162           /* Check for errors */
163           if(res != CURLE_OK)
164             fprintf(stderr, "curl_easy_perform() failed: %s\n",
165                     curl_easy_strerror(res));
166
167           /* always cleanup */
168           curl_easy_cleanup(curl);
169         }
170         return 0;
171       }
172

AVAILABILITY

174       Always
175

RETURN VALUE

177       Returns CURLE_OK
178

SEE ALSO

180       CURLOPT_VERBOSE(3), CURLOPT_DEBUGDATA(3),
181
182
183
184libcurl 7.85.0                   May 17, 2022         CURLOPT_DEBUGFUNCTION(3)
Impressum