blob: 4c0c56da552b2781280d82d9af792823ae972394 (
plain)
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
|
use types::c;
use fmt;
use os;
export type CURL = opaque;
export type CURLcode = int;
export type CURLINFO = int;
def CURLOPT_URL = 10002;
def CURLINFO_LONG = 0x200000;
def CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2;
export @symbol("curl_easy_init") fn curl_easy_init() nullable *CURL;
export @symbol("curl_easy_cleanup") fn curl_easy_cleanup(handle: nullable *CURL) void;
export @symbol("curl_easy_setopt") fn curl_easy_setopt(
handle: nullable *CURL,
option: int,
parameter: const *c::char
) CURLcode;
export @symbol("curl_easy_perform") fn curl_easy_perform(easy_handle: nullable *CURL) CURLcode;
export @symbol("curl_easy_getinfo") fn curl_easy_getinfo(
easy_handle: nullable *CURL,
info: CURLINFO,
code: nullable *c::long
) CURLcode;
type curlerror = !(setopterr | performerr | getinfoerr);
type setopterr = !int;
type performerr = !int;
type getinfoerr = !int;
fn get(url: const str) (void | curlerror) = {
let c = curl_easy_init();
defer curl_easy_cleanup(c);
let c_url = c::fromstr(url);
defer free(c_url);
let res = curl_easy_setopt(c, CURLOPT_URL, c_url);
if (res != 0) {
return res: setopterr;
};
res = curl_easy_perform(c);
if (res != 0) {
return res: performerr;
};
let rc: c::long = 0;
res = curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &rc);
if (res != 0) {
return res: getinfoerr;
};
fmt::println(rc)!;
};
export fn main() void = {
if (len(os::args) != 2) {
fmt::fatalf("USAGE: {} <url>", os::args[0]);
};
match (get(os::args[1])) {
case void =>
yield;
case let err: setopterr =>
fmt::fatalf("setopt returned {} instead of 0", err: int);
case let err: performerr =>
fmt::fatalf("perform returned {} instead of 0", err: int);
case let err: getinfoerr =>
fmt::fatalf("getinfo returned {} instead of 0", err: int);
};
};
|