Skip to content

Instantly share code, notes, and snippets.

@nomissbowling
Forked from kosh04/curl_writefunction.c
Created January 4, 2021 04:41
Show Gist options
  • Save nomissbowling/3af72addc677b18818d94ce800d0b1a3 to your computer and use it in GitHub Desktop.
Save nomissbowling/3af72addc677b18818d94ce800d0b1a3 to your computer and use it in GitHub Desktop.
[cURL]コールバック関数を利用してURLの内容をバッファに溜め込む
/* $ gcc -Wall -g [-DDEBUG] curl_writefunction.c -lcurl */
/* $ ./a.out [URL] */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#define BUFFER_MAX 0x10000
size_t write_length = 0;
size_t recvf(void *ptr, size_t size, size_t nmemb, void *userp)
{
size_t written = size*nmemb;
#ifdef DEBUG
fprintf(stderr, "recvf(ptr=%p, size=%zd, nmemb=%zd, userp=%p); length=%zd\n",
ptr, size, nmemb, userp, write_length);
#endif
if ((write_length + written) >= BUFFER_MAX) { return 0; }
// fwrite(ptr, size, nmemb, (FILE *)userp);
memcpy((userp + write_length), ptr, written);
// strlcat(userp, ptr, BUFFER_MAX);
// strncat(userp, ptr, written);
write_length += written;
return written;
}
int main(int argc, char **argv)
{
CURL *curl = curl_easy_init();
CURLcode res;
char write_data[BUFFER_MAX+1] = {'\0'};
char *url = "http://www.newlisp.org/";
if (argv[1] != NULL) {
url = argv[1];
}
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, recvf);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
printf("ERR: %s\n", curl_easy_strerror(res));
} else {
printf("WRITEDATA=[text]%s[/text]\n", write_data);
printf("LENGTH=%zd / %d\n", write_length, BUFFER_MAX);
// or strlen(write_data)
}
curl_easy_cleanup(curl);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment