summaryrefslogtreecommitdiffstats
path: root/curl_tomem.c
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-11-17 17:20:22 -0600
committerKamil Kaminski <kamilkss@gmail.com>2011-11-17 17:20:22 -0600
commit7355004fe46fc6bba1da254ef37b64be0d77d532 (patch)
tree041e17c0cf86a8f04ee6be739a1e92472f030cab /curl_tomem.c
parent320f1c2347e3270a82b90bf03bf0ea1c48ad4eb2 (diff)
downloadsandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.gz
sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.tar.bz2
sandbox-7355004fe46fc6bba1da254ef37b64be0d77d532.zip
add 2 curl examples
Diffstat (limited to 'curl_tomem.c')
-rw-r--r--curl_tomem.c100
1 files changed, 100 insertions, 0 deletions
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;
+}
+