shithub: mc

ref: f1c2aa0d83a485ac3506d007263631a0e338da4d
dir: /lib/http/session.myr/

View raw version
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)
}