-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcurl.c
67 lines (55 loc) · 1.84 KB
/
curl.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "curl.h"
#include "utils.h"
static size_t curl_callback(const char *data, size_t size, size_t nmemb, const void *userdata) {
response_t *r = (response_t*) userdata;
size_t chunksize = size * nmemb;
// initial buffer allocation
if (r->buffer == NULL) {
r->buffer = malloc(chunksize + 1);
r->buflen = chunksize + 1;
xdebug("CURL callback() malloc %d", r->buflen);
}
// check if we need to extend the buffer
if (r->buflen < r->size + chunksize + 1) {
r->buffer = realloc(r->buffer, r->buflen + chunksize + 1);
r->buflen += chunksize + 1;
xdebug("CURL callback() realloc %d", r->buflen);
}
// copy/append chunk data
memcpy(&r->buffer[r->size], data, chunksize);
r->size += chunksize;
r->buffer[r->size] = 0;
return chunksize;
}
CURL* curl_init(const char *url, response_t *memory) {
CURL *curl = curl_easy_init();
if (curl != NULL) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
if (memory != NULL)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, memory);
curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 4096);
curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 22L);
curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 33L);
curl_easy_setopt(curl, CURLOPT_MAXAGE_CONN, 333L);
}
return curl;
}
int curl_perform(CURL *curl, response_t *memory, parser_t *parser) {
if (memory != NULL)
memory->size = 0;
CURLcode ret = curl_easy_perform(curl);
if (ret != CURLE_OK)
return xerrr(1, "CURL curl perform error %d: %s", ret, curl_easy_strerror(ret));
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
if (http_code != 200)
return xerrr(1, "CURL got response code %d", http_code);
if (parser != NULL)
return (parser)(memory);
return 0;
}