summaryrefslogtreecommitdiff
path: root/lib/http/session.myr
blob: d641cda7f348972b01a2d100747c66a423ab1e9f (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
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 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)
	| `bio.Ok _:	/* nothing */
	| `bio.Err _:	s.err = true
	| `bio.Eof:	s.err = true
	;;
	-> s.err
}

const ioflush = {s
	bio.flush(s.f)
}