diff options
author | Kyle K <kylek389@gmail.com> | 2011-11-17 17:20:22 -0600 |
---|---|---|
committer | Kamil Kaminski <kamilkss@gmail.com> | 2011-11-17 17:20:22 -0600 |
commit | 7355004fe46fc6bba1da254ef37b64be0d77d532 (patch) | |
tree | 041e17c0cf86a8f04ee6be739a1e92472f030cab | |
parent | 320f1c2347e3270a82b90bf03bf0ea1c48ad4eb2 (diff) | |
download | sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.gz sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.bz2 sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.zip |
add 2 curl examples
-rw-r--r-- | Makefile | 11 | ||||
-rw-r--r-- | curl_tofile.c | 59 | ||||
-rw-r--r-- | curl_tomem.c | 100 |
3 files changed, 167 insertions, 3 deletions
@@ -1,6 +1,9 @@ BINS = ascii class depipe_strings dup fpipe pipe realloc strpbrk strsep \ tokenizer getopt prime_mask linked_list pi_bbp string_tokenizer \ tcpserver tcpclient regexp + +CURL = curl_tomem curl_tofile + CC = gcc CFLAGS = -Wall -std=gnu99 -pedantic DBGFLAGS = -g -O0 @@ -11,13 +14,15 @@ else endif LDFLAGS = -lm -all: $(BINS) +all: $(BINS) $(CURL) $(BINS): %: %.c - $(CC) $(CFLAGS) $^ -o $@ + $(CC) $(CFLAGS) $^ -o $@ +$(CURL): %: %.c + $(CC) `curl-config --libs` $(CFLAGS) $^ -o $@ .PHONY: clean clean: - rm -f ./$(BINS) + rm -f ./$(BINS) ./$(CURL) diff --git a/curl_tofile.c b/curl_tofile.c new file mode 100644 index 0000000..7cd25ca --- /dev/null +++ b/curl_tofile.c @@ -0,0 +1,59 @@ +#include <stdio.h> +#include <curl/curl.h> + +size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) +{ + /* return size * nmemb; */ + return fwrite(ptr, size, nmemb, (FILE *) userdata); +} + +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "usage: %s <url>\n", argv[0]); + return 1; + } + + CURL *curl_handle; + CURLcode ret; + + 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); + /* send all data to this function */ + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); + + /* by default passes NULL aka stdout */ + FILE *fl; + if ((fl = fopen("dump.curl", "w"))) + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, fl); + else + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, stdout); + + 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); + } + + /* always cleanup */ + fclose(fl); + curl_easy_cleanup(curl_handle); + } + + return 0; +} + diff --git a/curl_tomem.c b/curl_tomem.c new file mode 100644 index 0000000..e30cfae --- /dev/null +++ b/curl_tomem.c @@ -0,0 +1,100 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <curl/curl.h> + +/* 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 <url>\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; +} + |