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
68
69
70
71
72
73
|
// util.c: implements wrappers around libcurl functions that don't fit anywhere else
#include "jurl.h"
int janet_getslist(struct curl_slist **slist, Janet *argv, int32_t n) {
JanetView args = janet_getindexed(argv, n);
for (int32_t i = 0; i< args.len; i++) {
const char *s = janet_getcstring(args.items, i);
struct curl_slist *newlist = curl_slist_append(*slist, s);
if (!newlist) {
return 0;
}
*slist = newlist;
}
return 1;
}
JANET_CFUN(jurl_escape) {
janet_fixarity(argc, 1);
JanetByteView b = janet_getbytes(argv, 0);
CURL* curl;
#if !CURL_AT_LEAST_VERSION(7,82,0)
curl = curl_easy_init();
#endif
char *s = curl_easy_escape(curl, (const char*)b.bytes, b.len);
Janet out = janet_cstringv(s);
curl_free(s);
#if !CURL_AT_LEAST_VERSION(7,82,0)
curl_easy_cleanup(curl);
#endif
return out;
}
JANET_CFUN(jurl_unescape) {
janet_fixarity(argc, 1);
JanetByteView b = janet_getbytes(argv, 0);
CURL *curl;
#if !CURL_AT_LEAST_VERSION(7,82,0)
curl = curl_easy_init();
#endif
int len;
char *s = curl_easy_unescape(curl, (const char*)b.bytes, b.len, &len);
Janet out = janet_stringv((const uint8_t*)s, len);
curl_free(s);
#if !CURL_AT_LEAST_VERSION(7,82,0)
curl_easy_cleanup(curl);
#endif
return out;
}
// this function plays fast and loose and I hope the gc doesn't kill me for it
// anyway, it goes like so:
// (wrap-error :ok something) -> [:ok something]
// (wrap-error :err something) -> [:err "explanation of :err"]
JANET_CFUN(jurl_wrap_error) {
janet_fixarity(argc, 2);
CURLcode code;
if (janet_checktype(argv[0], JANET_NUMBER)) {
argv[0] = jurl_geterror(janet_getinteger(argv, 0));
}
if (!janet_checktype(argv[0], JANET_KEYWORD)) {
janet_panicf("jurl_wrap_error: expected number or keyword, got %T", janet_type(argv[0]));
}
if (!janet_keyeq(argv[0], "ok")) {
// will this break one day?
// find out next time!
argv[1] = jurl_strerror(1, argv);
}
return janet_wrap_tuple(janet_tuple_n(argv, 2));
}
|