#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
// Struct to store HTTP response data
struct MemoryBuffer {
char *data;
size_t size;
};
// Callback to write received data into MemoryBuffer
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryBuffer *mem = (struct MemoryBuffer *)userp;
char *ptr = realloc(mem->data, mem->size + realsize + 1);
if (!ptr) {
fprintf(stderr
, "Memory allocation failed\n"); return 0;
}
mem->data = ptr;
memcpy(&(mem->data[mem->size]), contents, realsize);
mem->size += realsize;
mem->data[mem->size] = 0; // Null-terminate
return realsize;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr
, "Usage: %s <URL>\n", argv
[0]); return 1;
}
CURL *curl;
CURLcode res;
struct MemoryBuffer chunk = {0};
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr
, "Request failed: %s\n", curl_easy_strerror
(res
)); } else {
printf("Fetched %zu bytes:\n%s\n", chunk
.size
, chunk
.data
); }
curl_easy_cleanup(curl);
free(chunk.data);
}
curl_global_cleanup();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN1cmwvY3VybC5oPgoKLy8gU3RydWN0IHRvIHN0b3JlIEhUVFAgcmVzcG9uc2UgZGF0YQpzdHJ1Y3QgTWVtb3J5QnVmZmVyIHsKICAgIGNoYXIgKmRhdGE7CiAgICBzaXplX3Qgc2l6ZTsKfTsKCi8vIENhbGxiYWNrIHRvIHdyaXRlIHJlY2VpdmVkIGRhdGEgaW50byBNZW1vcnlCdWZmZXIKc3RhdGljIHNpemVfdCBXcml0ZUNhbGxiYWNrKHZvaWQgKmNvbnRlbnRzLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCB2b2lkICp1c2VycCkgewogICAgc2l6ZV90IHJlYWxzaXplID0gc2l6ZSAqIG5tZW1iOwogICAgc3RydWN0IE1lbW9yeUJ1ZmZlciAqbWVtID0gKHN0cnVjdCBNZW1vcnlCdWZmZXIgKil1c2VycDsKCiAgICBjaGFyICpwdHIgPSByZWFsbG9jKG1lbS0+ZGF0YSwgbWVtLT5zaXplICsgcmVhbHNpemUgKyAxKTsKICAgIGlmICghcHRyKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG1lbS0+ZGF0YSA9IHB0cjsKICAgIG1lbWNweSgmKG1lbS0+ZGF0YVttZW0tPnNpemVdKSwgY29udGVudHMsIHJlYWxzaXplKTsKICAgIG1lbS0+c2l6ZSArPSByZWFsc2l6ZTsKICAgIG1lbS0+ZGF0YVttZW0tPnNpemVdID0gMDsgLy8gTnVsbC10ZXJtaW5hdGUKCiAgICByZXR1cm4gcmVhbHNpemU7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGlmIChhcmdjICE9IDIpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8VVJMPlxuIiwgYXJndlswXSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgQ1VSTCAqY3VybDsKICAgIENVUkxjb2RlIHJlczsKICAgIHN0cnVjdCBNZW1vcnlCdWZmZXIgY2h1bmsgPSB7MH07CgogICAgY3VybF9nbG9iYWxfaW5pdChDVVJMX0dMT0JBTF9ERUZBVUxUKTsKICAgIGN1cmwgPSBjdXJsX2Vhc3lfaW5pdCgpOwogICAgCiAgICBpZiAoY3VybCkgewogICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9VUkwsIGFyZ3ZbMV0pOwogICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBXcml0ZUNhbGxiYWNrKTsKICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfV1JJVEVEQVRBLCAmY2h1bmspOwogICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9VU0VSQUdFTlQsICJsaWJjdXJsLWFnZW50LzEuMCIpOwoKICAgICAgICByZXMgPSBjdXJsX2Vhc3lfcGVyZm9ybShjdXJsKTsKICAgICAgICAKICAgICAgICBpZiAocmVzICE9IENVUkxFX09LKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmVxdWVzdCBmYWlsZWQ6ICVzXG4iLCBjdXJsX2Vhc3lfc3RyZXJyb3IocmVzKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJpbnRmKCJGZXRjaGVkICV6dSBieXRlczpcbiVzXG4iLCBjaHVuay5zaXplLCBjaHVuay5kYXRhKTsKICAgICAgICB9CgogICAgICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOwogICAgICAgIGZyZWUoY2h1bmsuZGF0YSk7CiAgICB9CgogICAgY3VybF9nbG9iYWxfY2xlYW51cCgpOwogICAgcmV0dXJuIDA7Cn0=
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
// Struct to store HTTP response data
struct MemoryBuffer {
char *data;
size_t size;
};
// Callback to write received data into MemoryBuffer
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryBuffer *mem = (struct MemoryBuffer *)userp;
char *ptr = realloc(mem->data, mem->size + realsize + 1);
if (!ptr) {
fprintf(stderr, "Memory allocation failed\n");
return 0;
}
mem->data = ptr;
memcpy(&(mem->data[mem->size]), contents, realsize);
mem->size += realsize;
mem->data[mem->size] = 0; // Null-terminate
return realsize;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <URL>\n", argv[0]);
return 1;
}
CURL *curl;
CURLcode res;
struct MemoryBuffer chunk = {0};
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Request failed: %s\n", curl_easy_strerror(res));
} else {
printf("Fetched %zu bytes:\n%s\n", chunk.size, chunk.data);
}
curl_easy_cleanup(curl);
free(chunk.data);
}
curl_global_cleanup();
return 0;
}