Last active
December 12, 2015 03:18
-
-
Save guanqun/4705497 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///////////////////////////////////////////////////////////////////////////// | |
/* the callbacks */ | |
struct data { | |
char trace_ascii; /* 1 or 0 */ | |
}; | |
struct data config; | |
static | |
void dump(const char *text, | |
FILE *stream, unsigned char *ptr, size_t size, | |
char nohex) | |
{ | |
size_t i; | |
size_t c; | |
unsigned int width=0x10; | |
if(nohex) | |
/* without the hex output, we can fit more on screen */ | |
width = 0x40; | |
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); | |
if(!nohex) { | |
/* hex not disabled, show it */ | |
for(c = 0; c < width; c++) | |
if(i+c < size) | |
fprintf(stream, "%02x ", ptr[i+c]); | |
else | |
fputs(" ", stream); | |
} | |
for(c = 0; (c < width) && (i+c < size); c++) { | |
/* check for 0D0A; if found, skip past and start a new line of output */ | |
if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) { | |
i+=(c+2-width); | |
break; | |
} | |
fprintf(stream, "%c", | |
(ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); | |
/* check again for 0D0A, to avoid an extra \n if it's at width */ | |
if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { | |
i+=(c+3-width); | |
break; | |
} | |
} | |
fputc('\n', stream); /* newline */ | |
} | |
fflush(stream); | |
} | |
static | |
int my_trace(CURL *handle, curl_infotype type, | |
char *data, size_t size, | |
void *userp) | |
{ | |
struct data *config = (struct data *)userp; | |
const char *text; | |
(void)handle; /* prevent compiler warning */ | |
switch (type) { | |
case CURLINFO_TEXT: | |
fprintf(stderr, "== Info: %s", data); | |
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, config->trace_ascii); | |
return 0; | |
} | |
///////////////////////////////////////////////////////////////////////////// | |
/* set these two options during setup */ | |
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); | |
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment