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
|
use std
use bio
use "types"
pkg http =
const mksession : (schema : schema, host : byte[:], port : uint16 -> std.result(session#, err))
const mksrvsession : (fd : std.fd -> session#)
const freesession : (s : session# -> void)
pkglocal const ioput : (s : session#, fmt : byte[:], args : ... -> bool)
pkglocal const iowrite : (s : session#, buf : byte[:] -> bool)
pkglocal const ioflush : (s : session# -> void)
;;
const mksession = {schema, host, port
var s, sess
match schema
| `Http: /* nothing */
| `Https: std.fatal("unsupported protocol\n")
;;
s = std.fmt("tcp!{}!{}", host, port)
match std.dial(s)
| `std.Err e: sess = `std.Err `Econn
| `std.Ok fd: sess = `std.Ok std.mk([
.err = false,
.ua = std.sldup("Myrfoo HTTP"),
.host = std.sldup(host),
.f = bio.mkfile(fd, bio.Rw)
])
;;
std.slfree(s)
-> sess
}
const mksrvsession = {fd
-> std.mk([
.err = false,
.srvname = std.sldup("Myrfoo HTTP Server"),
.f = bio.mkfile(fd, bio.Rw),
])
}
const freesession = {s
bio.close(s.f)
std.slfree(s.host)
std.slfree(s.ua)
std.free(s)
}
const ioput = {s, fmt, args
var ap
if s.err
-> false
;;
ap = std.vastart(&args)
match bio.putv(s.f, fmt, &ap)
| `std.Ok _: /* nothing */
| `std.Err _: s.err = true
;;
-> s.err
}
const iowrite = {s, buf
if s.err
-> false
;;
match bio.write(s.f, buf)
| `std.Ok _: /* nothing */
| `std.Err _: s.err = true
;;
-> s.err
}
const ioflush = {s
bio.flush(s.f)
}
|