ref: de10733eadd13153e899a30538a4c21f95af4b9c
dir: /lib/http/session.myr/
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) }