Annotation of embedaddon/curl/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3, revision 1.1
1.1 ! misho 1: .\" **************************************************************************
! 2: .\" * _ _ ____ _
! 3: .\" * Project ___| | | | _ \| |
! 4: .\" * / __| | | | |_) | |
! 5: .\" * | (__| |_| | _ <| |___
! 6: .\" * \___|\___/|_| \_\_____|
! 7: .\" *
! 8: .\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: .\" *
! 10: .\" * This software is licensed as described in the file COPYING, which
! 11: .\" * you should have received as part of this distribution. The terms
! 12: .\" * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: .\" *
! 14: .\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: .\" * copies of the Software, and permit persons to whom the Software is
! 16: .\" * furnished to do so, under the terms of the COPYING file.
! 17: .\" *
! 18: .\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: .\" * KIND, either express or implied.
! 20: .\" *
! 21: .\" **************************************************************************
! 22: .\"
! 23: .TH CURLOPT_DEBUGFUNCTION 3 "March 23, 2020" "libcurl 7.70.0" "curl_easy_setopt options"
! 24:
! 25: .SH NAME
! 26: CURLOPT_DEBUGFUNCTION \- debug callback
! 27: .SH SYNOPSIS
! 28: .nf
! 29: #include <curl/curl.h>
! 30:
! 31: typedef enum {
! 32: CURLINFO_TEXT = 0,
! 33: CURLINFO_HEADER_IN, /* 1 */
! 34: CURLINFO_HEADER_OUT, /* 2 */
! 35: CURLINFO_DATA_IN, /* 3 */
! 36: CURLINFO_DATA_OUT, /* 4 */
! 37: CURLINFO_SSL_DATA_IN, /* 5 */
! 38: CURLINFO_SSL_DATA_OUT, /* 6 */
! 39: CURLINFO_END
! 40: } curl_infotype;
! 41:
! 42: int debug_callback(CURL *handle,
! 43: curl_infotype type,
! 44: char *data,
! 45: size_t size,
! 46: void *userptr);
! 47:
! 48: CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGFUNCTION,
! 49: debug_callback);
! 50: .SH DESCRIPTION
! 51: Pass a pointer to your callback function, which should match the prototype
! 52: shown above.
! 53:
! 54: \fICURLOPT_DEBUGFUNCTION(3)\fP replaces the standard debug function used when
! 55: \fICURLOPT_VERBOSE(3)\fP is in effect. This callback receives debug
! 56: information, as specified in the \fItype\fP argument. This function must
! 57: return 0. The \fIdata\fP pointed to by the char * passed to this function WILL
! 58: NOT be zero terminated, but will be exactly of the \fIsize\fP as told by the
! 59: \fIsize\fP argument.
! 60:
! 61: The \fIuserptr\fP argument is the pointer set with \fICURLOPT_DEBUGDATA(3)\fP.
! 62:
! 63: Available curl_infotype values:
! 64: .IP CURLINFO_TEXT
! 65: The data is informational text.
! 66: .IP CURLINFO_HEADER_IN
! 67: The data is header (or header-like) data received from the peer.
! 68: .IP CURLINFO_HEADER_OUT
! 69: The data is header (or header-like) data sent to the peer.
! 70: .IP CURLINFO_DATA_IN
! 71: The data is protocol data received from the peer.
! 72: .IP CURLINFO_DATA_OUT
! 73: The data is protocol data sent to the peer.
! 74: .IP CURLINFO_SSL_DATA_OUT
! 75: The data is SSL/TLS (binary) data sent to the peer.
! 76: .IP CURLINFO_SSL_DATA_IN
! 77: The data is SSL/TLS (binary) data received from the peer.
! 78: .SH DEFAULT
! 79: NULL
! 80: .SH PROTOCOLS
! 81: All
! 82: .SH EXAMPLE
! 83: .nf
! 84: static
! 85: void dump(const char *text,
! 86: FILE *stream, unsigned char *ptr, size_t size)
! 87: {
! 88: size_t i;
! 89: size_t c;
! 90: unsigned int width=0x10;
! 91:
! 92: fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\\n",
! 93: text, (long)size, (long)size);
! 94:
! 95: for(i=0; i<size; i+= width) {
! 96: fprintf(stream, "%4.4lx: ", (long)i);
! 97:
! 98: /* show hex to the left */
! 99: for(c = 0; c < width; c++) {
! 100: if(i+c < size)
! 101: fprintf(stream, "%02x ", ptr[i+c]);
! 102: else
! 103: fputs(" ", stream);
! 104: }
! 105:
! 106: /* show data on the right */
! 107: for(c = 0; (c < width) && (i+c < size); c++) {
! 108: char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x80) ? ptr[i+c] : '.';
! 109: fputc(x, stream);
! 110: }
! 111:
! 112: fputc('\\n', stream); /* newline */
! 113: }
! 114: }
! 115:
! 116: static
! 117: int my_trace(CURL *handle, curl_infotype type,
! 118: char *data, size_t size,
! 119: void *userp)
! 120: {
! 121: const char *text;
! 122: (void)handle; /* prevent compiler warning */
! 123: (void)userp;
! 124:
! 125: switch (type) {
! 126: case CURLINFO_TEXT:
! 127: fprintf(stderr, "== Info: %s", data);
! 128: default: /* in case a new one is introduced to shock us */
! 129: return 0;
! 130:
! 131: case CURLINFO_HEADER_OUT:
! 132: text = "=> Send header";
! 133: break;
! 134: case CURLINFO_DATA_OUT:
! 135: text = "=> Send data";
! 136: break;
! 137: case CURLINFO_SSL_DATA_OUT:
! 138: text = "=> Send SSL data";
! 139: break;
! 140: case CURLINFO_HEADER_IN:
! 141: text = "<= Recv header";
! 142: break;
! 143: case CURLINFO_DATA_IN:
! 144: text = "<= Recv data";
! 145: break;
! 146: case CURLINFO_SSL_DATA_IN:
! 147: text = "<= Recv SSL data";
! 148: break;
! 149: }
! 150:
! 151: dump(text, stderr, (unsigned char *)data, size);
! 152: return 0;
! 153: }
! 154:
! 155: int main(void)
! 156: {
! 157: CURL *curl;
! 158: CURLcode res;
! 159:
! 160: curl = curl_easy_init();
! 161: if(curl) {
! 162: curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
! 163:
! 164: /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
! 165: curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
! 166:
! 167: /* example.com is redirected, so we tell libcurl to follow redirection */
! 168: curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
! 169:
! 170: curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
! 171: res = curl_easy_perform(curl);
! 172: /* Check for errors */
! 173: if(res != CURLE_OK)
! 174: fprintf(stderr, "curl_easy_perform() failed: %s\\n",
! 175: curl_easy_strerror(res));
! 176:
! 177: /* always cleanup */
! 178: curl_easy_cleanup(curl);
! 179: }
! 180: return 0;
! 181: }
! 182: .fi
! 183: .SH AVAILABILITY
! 184: Always
! 185: .SH RETURN VALUE
! 186: Returns CURLE_OK
! 187: .SH "SEE ALSO"
! 188: .BR CURLOPT_VERBOSE "(3), " CURLOPT_DEBUGDATA "(3), "
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>