dwww Home | Manual pages | Find package

CURLOPT_DEBUGFUNCTION(3)    Library Functions Manual   CURLOPT_DEBUGFUNCTION(3)

NAME
       CURLOPT_DEBUGFUNCTION - debug callback

SYNOPSIS
       #include <curl/curl.h>

       typedef enum {
         CURLINFO_TEXT = 0,
         CURLINFO_HEADER_IN,    /* 1 */
         CURLINFO_HEADER_OUT,   /* 2 */
         CURLINFO_DATA_IN,      /* 3 */
         CURLINFO_DATA_OUT,     /* 4 */
         CURLINFO_SSL_DATA_IN,  /* 5 */
         CURLINFO_SSL_DATA_OUT, /* 6 */
         CURLINFO_END
       } curl_infotype;

       int debug_callback(CURL *handle,
                          curl_infotype type,
                          char *data,
                          size_t size,
                          void *clientp);

       CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION,
                                 debug_callback);

DESCRIPTION
       Pass  a pointer to your callback function, which should match the proto-
       type shown above.

       CURLOPT_DEBUGFUNCTION(3) replaces the standard debug function used  when
       CURLOPT_VERBOSE(3)  is  in effect. This callback receives debug informa-
       tion, as specified in the type argument. This function  must  return  0.
       The  data  pointed  to  by  the  char  *  passed to this function is not
       null-terminated, but is exactly of the size as told by  the  size  argu-
       ment.

       WARNING  this  callback  may receive sensitive contents from headers and
       data, including information sent as CURLINFO_TEXT.

       The clientp argument is the pointer set with CURLOPT_DEBUGDATA(3).

       Available curl_infotype values:

       CURLINFO_TEXT
              The data is informational text.

       CURLINFO_HEADER_IN
              The data is header (or header-like) data received from the peer.

       CURLINFO_HEADER_OUT
              The data is header (or header-like) data sent to the peer.

       CURLINFO_DATA_IN
              The data is the unprocessed protocol data received from the peer.
              Even if the data is encoded or compressed, it is not provided de-
              coded nor decompressed to this callback. If you need the data  in
              decoded and decompressed form, use CURLOPT_WRITEFUNCTION(3).

       CURLINFO_DATA_OUT
              The data is protocol data sent to the peer.

       CURLINFO_SSL_DATA_OUT
              The data is SSL/TLS (binary) data sent to the peer.

       CURLINFO_SSL_DATA_IN
              The data is SSL/TLS (binary) data received from the peer.

       WARNING:  This callback may be called with the curl handle set to an in-
       ternal handle. (Added in 8.4.0)

       If you need to distinguish your curl handle from internal  handles  then
       set CURLOPT_PRIVATE(3) on your handle.

DEFAULT
       NULL

PROTOCOLS
       This functionality affects all supported protocols

EXAMPLE
       static
       void dump(const char *text,
                 FILE *stream, unsigned char *ptr, size_t size)
       {
         size_t i;
         size_t c;
         unsigned int width = 0x10;

         fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
                 text, (long)size, (long)size);

         for(i = 0; i < size; i += width) {
           fprintf(stream, "%4.4lx: ", (long)i);

           /* show hex to the left */
           for(c = 0; c < width; c++) {
             if(i + c < size)
               fprintf(stream, "%02x ", ptr[i + c]);
             else
               fputs("   ", stream);
           }

           /* show data on the right */
           for(c = 0; (c < width) && (i + c < size); c++) {
             char x = (ptr[i + c] >= 0x20 && ptr[i + c] < 0x80) ? ptr[i + c] : '.';
             fputc(x, stream);
           }

           fputc('\n', stream); /* newline */
         }
       }

       static
       int my_trace(CURL *handle, curl_infotype type,
                    char *data, size_t size,
                    void *clientp)
       {
         const char *text;
         (void)handle; /* prevent compiler warning */
         (void)clientp;

         switch(type) {
         case CURLINFO_TEXT:
           fputs("== Info: ", stderr);
           fwrite(data, size, 1, stderr);
         default: /* in case a new one is introduced to shock us */
           return 0;

         case CURLINFO_HEADER_OUT:
           text = "=> Send header";
           break;
         case CURLINFO_DATA_OUT:
           text = "=> Send data";
           break;
         case CURLINFO_SSL_DATA_OUT:
           text = "=> Send SSL data";
           break;
         case CURLINFO_HEADER_IN:
           text = "<= Recv header";
           break;
         case CURLINFO_DATA_IN:
           text = "<= Recv data";
           break;
         case CURLINFO_SSL_DATA_IN:
           text = "<= Recv SSL data";
           break;
         }

         dump(text, stderr, (unsigned char *)data, size);
         return 0;
       }

       int main(void)
       {
         CURL *curl;
         CURLcode res;

         curl = curl_easy_init();
         if(curl) {
           curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);

           /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
           curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

           /* example.com is redirected, so we tell libcurl to follow redirection */
           curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

           curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
           res = curl_easy_perform(curl);
           /* Check for errors */
           if(res != CURLE_OK)
             fprintf(stderr, "curl_easy_perform() failed: %s\n",
                     curl_easy_strerror(res));

           /* always cleanup */
           curl_easy_cleanup(curl);
         }
         return 0;
       }

AVAILABILITY
       Added in curl 7.9.6

RETURN VALUE
       curl_easy_setopt(3) returns a CURLcode indicating success or error.

       CURLE_OK  (0) means everything was OK, non-zero means an error occurred,
       see libcurl-errors(3).

SEE ALSO
       CURLINFO_CONN_ID(3),  CURLINFO_XFER_ID(3),  CURLOPT_DEBUGDATA(3),   CUR-
       LOPT_VERBOSE(3), curl_global_trace(3)

libcurl                            2026-07-12          CURLOPT_DEBUGFUNCTION(3)

Generated by dwww version 1.16 on Fri Oct 2 15:01:51 CEST 2026.