poniedziałek, 4 lutego 2008

Zabawy z libcurl

Sesja to czas relaksu i obijania się, zatem w zacząłem się bawić z biblioteką libcurl. Wczoraj zatrzymałem się na tym, że pobierane dane są nam dostarczane w porcjach i bardzo łatwo zrzucić je do pliku. Od razu pomyślałem "A co jeśli ja chcę wrzucić je wszystkie do jednego bufora w pamięci?". Oczywiście da się i oczywiście na dzień przed egzaminem z angielskiego nie mogłem nie poświęcić kilku chwil żeby takie coś napisać ;-). Oto efekt:

#include <stdio.h>
#include <curl/curl.h>


typedef struct
{
char *big_buf;
long big_buf_size;
} BUFOR_INFO;

size_t wrt_data( void *ptr, size_t size, size_t nmemb, void *buf)
{
size_t buf_size=size*nmemb;

BUFOR_INFO *bi;
bi=(BUFOR_INFO *) buf;

char *new_buf;
new_buf=malloc(bi->big_buf_size + buf_size);
if (!new_buf) return 0;

int i;
for (i=0;i<(bi->big_buf_size-1);i++)
new_buf[i]=bi->big_buf[i];
for(i=(bi->big_buf_size-1);i<(bi->big_buf_size + buf_size - 1);i++)
new_buf[i]=((char *)ptr)[i-bi->big_buf_size+1];
new_buf[i]=(char)NULL;

free(bi->big_buf);
bi->big_buf=new_buf;
bi->big_buf_size+=buf_size;

return buf_size;
}

int main(void)
{
CURL *easyint;
CURLcode error;

BUFOR_INFO bufor;
bufor.big_buf_size=1;

easyint = curl_easy_init();
if(easyint)
{
curl_easy_setopt(easyint, CURLOPT_URL, "http://www.google.pl");
curl_easy_setopt(easyint, CURLOPT_WRITEFUNCTION, wrt_data);
curl_easy_setopt(easyint, CURLOPT_WRITEDATA, &bufor);
error = curl_easy_perform(easyint);
if(!error) printf("%s \n",bufor.big_buf);
else printf("Wystpił błąd!\n");
curl_easy_cleanup(easyint);
}
return 0;
}

A kompilować można tak:

gcc curl.c `pkg-config --cflags --libs libcurl`


Ogólnie to mi się ten kod nie podoba ale działa i to się liczy ;-).

Ps.: Po wklejeniu kodu na bloga wszystkie wcięcia poznikały... szkoda, z wcięciami było trochę ładniej ;-).

Brak komentarzy: