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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
#include "jurl.h"
struct jurl_enum {
CURLoption opt;
long value;
const char *keyword;
};
static const struct jurl_enum jurl_enums[] = {
{CURLOPT_PROXYTYPE, CURLPROXY_HTTP, "proxy/http"},
{CURLOPT_PROXYTYPE, CURLPROXY_HTTPS, "proxy/https"},
{CURLOPT_PROXYTYPE, CURLPROXY_HTTP_1_0, "proxy/http-1.0"},
{CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4, "proxy/socks4"},
{CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A, "proxy/socks4a"},
{CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5, "proxy/socks5"},
{CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME, "proxy/socks5-hostname"},
{CURLOPT_SOCKS5_AUTH, CURLAUTH_BASIC, "auth/basic"},
{CURLOPT_SOCKS5_AUTH, CURLAUTH_GSSAPI, "auth/gssapi"},
{CURLOPT_SOCKS5_AUTH, CURLAUTH_NONE, "auth/none"},
{CURLOPT_NETRC, CURL_NETRC_IGNORED, "netrc/ignored"},
{CURLOPT_NETRC, CURL_NETRC_OPTIONAL, "netrc/optional"},
{CURLOPT_NETRC, CURL_NETRC_REQUIRED, "netrc/required"},
{CURLOPT_HTTPAUTH, CURLAUTH_BASIC, "auth/basic"},
{CURLOPT_HTTPAUTH, CURLAUTH_DIGEST, "auth/digest"},
{CURLOPT_HTTPAUTH, CURLAUTH_DIGEST_IE, "auth/digest-ie"},
{CURLOPT_HTTPAUTH, CURLAUTH_BEARER, "auth/bearer"},
{CURLOPT_HTTPAUTH, CURLAUTH_NEGOTIATE, "auth/negotiate"},
{CURLOPT_HTTPAUTH, CURLAUTH_NTLM, "auth/ntlm"},
{CURLOPT_HTTPAUTH, CURLAUTH_NTLM_WB, "auth/ntlm-wb"},
{CURLOPT_HTTPAUTH, CURLAUTH_ANY, "auth/any"},
{CURLOPT_HTTPAUTH, CURLAUTH_ANYSAFE, "auth/anysafe"},
{CURLOPT_HTTPAUTH, CURLAUTH_ONLY, "auth/only"},
{CURLOPT_HTTPAUTH, CURLAUTH_AWS_SIGV4, "auth/aws-sigv4"},
{CURLOPT_PROXYAUTH, CURLAUTH_BASIC, "auth/basic"},
{CURLOPT_PROXYAUTH, CURLAUTH_DIGEST, "auth/digest"},
{CURLOPT_PROXYAUTH, CURLAUTH_DIGEST_IE, "auth/digest-ie"},
{CURLOPT_PROXYAUTH, CURLAUTH_BEARER, "auth/bearer"},
{CURLOPT_PROXYAUTH, CURLAUTH_NEGOTIATE, "auth/negotiate"},
{CURLOPT_PROXYAUTH, CURLAUTH_NTLM, "auth/ntlm"},
{CURLOPT_PROXYAUTH, CURLAUTH_NTLM_WB, "auth/ntlm-wb"},
{CURLOPT_PROXYAUTH, CURLAUTH_ANY, "auth/any"},
{CURLOPT_PROXYAUTH, CURLAUTH_ANYSAFE, "auth/anysafe"},
{CURLOPT_PROXYAUTH, CURLAUTH_ONLY, "auth/only"},
{CURLOPT_PROXYAUTH, CURLAUTH_AWS_SIGV4, "auth/aws-sigv4"},
{CURLOPT_POSTREDIR, CURL_REDIR_POST_301, "redir-post/301"},
{CURLOPT_POSTREDIR, CURL_REDIR_POST_302, "redir-post/302"},
{CURLOPT_POSTREDIR, CURL_REDIR_POST_303, "redir-post/303"},
{CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL, "redir-post/all"},
{CURLOPT_HEADEROPT, CURLHEADER_UNIFIED, "header/unified"},
{CURLOPT_HEADEROPT, CURLHEADER_SEPARATE, "header/separate"},
{CURLOPT_ALTSVC_CTRL, CURLALTSVC_READONLYFILE, "altsvc/readonlyfile"},
{CURLOPT_ALTSVC_CTRL, CURLALTSVC_H1, "altsvc/h1"},
{CURLOPT_ALTSVC_CTRL, CURLALTSVC_H2, "altsvc/h2"},
{CURLOPT_ALTSVC_CTRL, CURLALTSVC_H3, "altsvc/h3"},
{CURLOPT_HSTS_CTRL, CURLHSTS_ENABLE, "hsts/enable"},
{CURLOPT_HSTS_CTRL, CURLHSTS_READONLYFILE, "hsts/readonlyfile"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_NONE, "http-version/none"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0, "http-version/1.0"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1, "http-version/1.1"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0, "http-version/2.0"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS, "http-version/2tls"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, "http-version/2-prior-knowledge"},
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3, "http-version/3"},
#if CURL_AT_LEAST_VERSION(7,88,0)
{CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3ONLY, "http-version/3only"},
#endif
{CURLOPT_FTP_CREATE_MISSING_DIRS, CURLFTP_CREATE_DIR_NONE, "ftp-create-dir/none"},
{CURLOPT_FTP_CREATE_MISSING_DIRS, CURLFTP_CREATE_DIR, "ftp-create-dir/dir"},
{CURLOPT_FTP_CREATE_MISSING_DIRS, CURLFTP_CREATE_DIR_RETRY, "ftp-create-dir/dir-entry"},
{CURLOPT_FTPSSLAUTH, CURLFTPAUTH_DEFAULT, "ftpauth/default"},
{CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL, "ftpauth/ssl"},
{CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS, "ftpauth/tls"},
{CURLOPT_FTP_SSL_CCC, CURLFTPSSL_CCC_NONE, "ftpssl-ccc/none"},
{CURLOPT_FTP_SSL_CCC, CURLFTPSSL_CCC_PASSIVE, "ftpssl-ccc/passive"},
{CURLOPT_FTP_SSL_CCC, CURLFTPSSL_CCC_ACTIVE, "ftpssl-ccc/active"},
{CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_MULTICWD, "ftpmethod/multicwd"},
{CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_NOCWD, "ftpmethod/nocwd"},
{CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_SINGLECWD, "ftpmethod/singlecwd"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_OPTIONS, "rtspreq/options"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_DESCRIBE, "rtspreq/describe"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_ANNOUNCE, "rtspreq/announce"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_SETUP, "rtspreq/setup"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_PLAY, "rtspreq/play"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_PAUSE, "rtspreq/pause"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_TEARDOWN, "rtspreq/teardown"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_GET_PARAMETER, "rtspreq/get-parameter"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_SET_PARAMETER, "rtspreq/set-parameter"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_RECORD, "rtspreq/record"},
{CURLOPT_RTSP_REQUEST, CURL_RTSPREQ_RECEIVE, "rtspreq/receive"},
{CURLOPT_MIME_OPTIONS, CURLMIMEOPT_FORMESCAPE, "mimeopt/formescape"},
{CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE, "timecond/ifmodsince"},
{CURLOPT_TIMECONDITION, CURL_TIMECOND_IFUNMODSINCE, "timecond/ifunmodsince"},
{CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER, "ipresolve/whatever"},
{CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4, "ipresolve/v4"},
{CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6, "ipresolve/v6"},
{CURLOPT_USE_SSL, CURLUSESSL_NONE, "usessl/none"},
{CURLOPT_USE_SSL, CURLUSESSL_TRY, "usessl/try"},
{CURLOPT_USE_SSL, CURLUSESSL_CONTROL, "usessl/control"},
{CURLOPT_USE_SSL, CURLUSESSL_ALL, "usessl/all"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT, "sslversion/default"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1, "sslversion/tlsv1"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_SSLv2, "sslversion/sslv2"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_SSLv3, "sslversion/sslv3"},
#if CURL_AT_LEAST_VERSION(7,34,0)
{CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0, "sslversion/tlsv1.0"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1, "sslversion/tlsv1.1"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2, "sslversion/tlsv1.2"},
#endif
#if CURL_AT_LEAST_VERSION(7,52,0)
{CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_3, "sslversion/tlsv1.3"},
#endif
#if CURL_AT_LEAST_VERSION(7,54,0)
{CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_DEFAULT, "sslversion/max-default"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_0, "sslversion/max-tlsv1.0"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_1, "sslversion/max-tlsv1.1"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_2, "sslversion/max-tlsv1.2"},
{CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_3, "sslversion/max-tlsv1.3"},
#endif
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST, "sslopt/allow-beast"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST, "sslopt/allow-beast"},
#if CURL_AT_LEAST_VERSION(7,44,0)
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE, "sslopt/no-revoke"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE, "sslopt/no-revoke"},
#endif
#if CURL_AT_LEAST_VERSION(7,68,0)
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_PARTIALCHAIN, "sslopt/no-partialchain"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NO_PARTIALCHAIN, "sslopt/no-partialchain"},
#endif
#if CURL_AT_LEAST_VERSION(7,70,0)
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT, "sslopt/revoke-best-effort"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_REVOKE_BEST_EFFORT, "sslopt/revoke-best-effort"},
#endif
#if CURL_AT_LEAST_VERSION(7,71,0)
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA, "sslopt/native-ca"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA, "sslopt/native-ca"},
#endif
#if CURL_AT_LEAST_VERSION(7,77,0)
{CURLOPT_SSL_OPTIONS, CURLSSLOPT_AUTO_CLIENT_CERT, "sslopt/auto-client-cert"},
{CURLOPT_PROXY_SSL_OPTIONS, CURLSSLOPT_AUTO_CLIENT_CERT, "sslopt/auto-client-cert"},
#endif
{CURLOPT_GSSAPI_DELEGATION, CURLGSSAPI_DELEGATION_NONE, "gssapi-delegation/none"},
{CURLOPT_GSSAPI_DELEGATION, CURLGSSAPI_DELEGATION_FLAG, "gssapi-delegation/flag"},
{CURLOPT_GSSAPI_DELEGATION, CURLGSSAPI_DELEGATION_POLICY_FLAG, "gssapi-delegation/policy-flag"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY, "ssh-auth/publickey"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PASSWORD, "ssh-auth/password"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_HOST, "ssh-auth/host"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_KEYBOARD, "ssh-auth/keyboard"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_AGENT, "ssh-auth/agent"},
{CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_ANY, "ssh-auth/any"},
};
#define jurl_enum_size (sizeof(jurl_enums) / sizeof(struct jurl_enum))
static long get_eq(CURLoption opt, JanetKeyword kw) {
for (size_t i = 0; i < jurl_enum_size; i++) {
if (jurl_enums[i].opt == opt && !strcmp(jurl_enums[i].keyword, (const char*)kw)) {
return jurl_enums[i].value;
}
}
janet_panicf("jurl_setenum: unrecognized keyword for option %d: %s", opt, kw);
}
CURLcode jurl_setenum(jurl_handle *jurl, CURLoption opt, Janet val) {
long set = 0;
if (janet_checktype(val, JANET_KEYWORD)) {
set = get_eq(opt, janet_unwrap_keyword(val));
} else {
const Janet *args;
int32_t len;
if (!janet_indexed_view(val, &args, &len)) {
janet_panicf("jurl_setenum: expected keyword or indexed type, got %T", janet_type(val));
}
for (int32_t i = 0; i < len; i++) {
set |= get_eq(opt, janet_getkeyword(args, i));
}
}
return curl_easy_setopt(jurl->handle, opt, set);
}
|