#include #include #include #include /* dump curl result into a memory instead of FILE * */ struct curl_inmem { char *memory; size_t size; /* size is used as an index */ }; typedef struct curl_inmem curl_inmem_t; void dump_curlmem(void *data) { curl_inmem_t *mem = (curl_inmem_t *) data; size_t iter = 0; while (iter < mem->size) putchar(mem->memory[iter++]); } size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) { size_t realsize = size * nmemb; curl_inmem_t *mem = (curl_inmem_t *) userdata; mem->memory = realloc(mem->memory, mem->size + realsize + 1); if (!mem->memory) { perror("failed to resize curl in memory"); exit(EXIT_FAILURE); } memcpy(&(mem->memory[mem->size]), ptr, realsize); mem->size += realsize; mem->memory[mem->size] = 0; return realsize; } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s \n", argv[0]); return 1; } CURL *curl_handle; CURLcode ret; curl_global_init(CURL_GLOBAL_ALL); curl_handle = curl_easy_init(); if (curl_handle) { curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]); curl_easy_setopt(curl_handle, CURLOPT_HEADER, 1L); /* some servers don't like requests that are made without a user-agent * field, so we provide one */ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); char err_buff[CURL_ERROR_SIZE]; curl_easy_setopt(curl_handle, CURLOPT_ERRORBUFFER, err_buff); /* by default passes NULL aka stdout */ curl_inmem_t chunk = { 0, 0 }; chunk.memory = (char *) malloc(sizeof(char)); if (!chunk.memory) perror("failed to create a chunk"); else { curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &chunk); /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); } if ((ret = curl_easy_perform(curl_handle)) != CURLE_OK) fprintf(stderr, "%s\n", err_buff); else { /* ask for the content-type */ char *ct; ret = curl_easy_getinfo(curl_handle, CURLINFO_CONTENT_TYPE, &ct); if ((CURLE_OK == ret) && ct) printf("Content-Type: %s\n", ct); } /* print out */ dump_curlmem(&chunk); /* always cleanup */ curl_easy_cleanup(curl_handle); if (chunk.memory) free(chunk.memory); /* we're done with libcurl, so clean it up */ curl_global_cleanup(); } return 0; }