ref: 528ac41dc8b1b23ce8a22fee1c296bbe9a6742cc
parent: f04c9a908e796e5356e961d84158dfe6b1c25d7a
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Jul 2 17:25:10 EDT 2018
Move stuff to examples.
--- a/bld.proj
+++ b/bld.proj
@@ -5,5 +5,6 @@
bench
support
doc
+ examples
;;
--- /dev/null
+++ b/examples/bld.sub
@@ -1,0 +1,21 @@
+# http examples
+bin h {noinst} =
+ h.myr
+
+ lib @/lib/sys:sys
+ lib @/lib/std:std
+ lib @/lib/bio:bio
+ lib @/lib/http:http
+ lib @/lib/thread:thread
+;;
+
+bin srvdot {noinst} =
+ srvdot.myr
+
+ lib @/lib/sys:sys
+ lib @/lib/std:std
+ lib @/lib/bio:bio
+ lib @/lib/http:http
+ lib @/lib/thread:thread
+;;
+
--- /dev/null
+++ b/examples/h.myr
@@ -1,0 +1,90 @@
+use std
+use http
+
+const main = {args
+ var data, method, showhdr, hdrs, out
+ var s, u, r
+ var cmd
+
+ cmd = std.optparse(args, &[
+ .argdesc = "url...",
+ .minargs = 1,
+ .opts = [
+ [.opt='m', .arg="method", .desc="http method to use"],
+ [.opt='d', .arg="data", .desc="data to put in request body"],
+ [.opt='o', .arg="out", .desc="output file name"],
+ [.opt='H', .desc="show headers"],
+ [.opt='D', .arg="hdr", .desc="define custom header"]
+ ][:]
+ ])
+
+ showhdr = false
+ method = "get"
+ data = ""
+ hdrs = [][:]
+ out = ""
+ for opt : cmd.opts
+ match opt
+ | ('m', m): method = m
+ | ('d', d): data = d
+ | ('o', o): out = o
+ | ('H', ""): showhdr = true
+ | ('D', def): parsedef(&hdrs, def)
+ | _: std.die("unreachable")
+ ;;
+ ;;
+
+ for url : cmd.args
+ if !std.hasprefix(url, "http")
+ url = std.fmt("http://{}", url)
+ ;;
+ u = std.try(http.parseurl(url))
+ s = std.try(http.mksession(u.schema, u.host, u.port))
+
+ match method
+ | "get": r = http.getreq(s, &[.url=u, .hdrs=hdrs])
+ | "head": r = http.headreq(s, &[.url=u, .hdrs=hdrs])
+ | "delete": r = http.deletereq(s, &[.url=u, .hdrs=hdrs])
+ | "trace": r = http.tracereq(s, &[.url=u, .hdrs=hdrs])
+ | "options": r = http.optionsreq(s, &[.url=u, .hdrs=hdrs])
+ | "put": r = http.putreq(s, &[.url=u, .hdrs=hdrs], data)
+ | "post": r = http.postreq(s, &[.url=u, .hdrs=hdrs], data)
+ | unknown: std.fatal("unknown method '{}'\n", unknown)
+ ;;
+
+ match r
+ | `std.Ok resp:
+ if showhdr
+ std.put("status: {}\n", resp.status)
+ for (k, v) : resp.hdrs
+ std.put("{}: {}\n", k, v)
+ ;;
+ ;;
+ if out.len != 0
+ if !std.blat(out, resp.body, 0o644)
+ std.fatal("could not write output: {}\n", out)
+ ;;
+ else
+ std.fblat(std.Out, resp.body)
+ ;;
+ http.freeresp(resp)
+ | `std.Err e:
+ std.put("{}\n", e)
+ ;;
+ http.urlfree(u)
+ ;;
+}
+
+const parsedef = {hdrs, hdr
+ var key, val
+
+ match std.strfind(hdr, ":")
+ | `std.None:
+ std.fatal("bad header string {}\n", hdr)
+ | `std.Some idx:
+ key = std.sldup(std.strstrip(hdr[:idx]))
+ val = std.sldup(std.strstrip(hdr[idx+1:]))
+ std.slpush(hdrs, (key, val))
+ ;;
+}
+
--- /dev/null
+++ b/examples/srvdot.myr
@@ -1,0 +1,66 @@
+use std
+use http
+
+const main = {args
+ var srv, ann, cmd
+
+ cmd = std.optparse(args, &[
+ .maxargs=0,
+ .opts = [[.opt='a', .arg="ann", .desc="announce on `ann`"]][:]
+ ])
+ ann = "tcp!localhost!8080"
+ for opt : cmd.opts
+ match opt
+ | ('a', a): ann = a
+ | _: std.die("unreachable")
+ ;;
+ ;;
+
+ match http.announce(ann)
+ | `std.Ok s: srv = s
+ | `std.Err e: std.fatal("unable to announce: {}\n", e)
+ ;;
+
+ http.serve(srv, route)
+}
+
+const route = {srv, sess, req
+ std.put("Reading path {}\n", req.url.path)
+ match req.url.path
+ | "/ping": respond(srv, sess, 200, "pong")
+ | "/quit": http.shutdown(srv)
+ | fspath: showfile(srv, sess, req.url.path)
+ ;;
+}
+
+const showfile = {srv, sess, path
+ var eb : byte[128]
+ var p
+
+ p = std.pathcat(".", path)
+ match std.slurp(p)
+ | `std.Ok buf:
+ respond(srv, sess, 200, buf)
+ std.slfree(buf)
+ | `std.Err e:
+ respond(srv, sess, 404, std.bfmt(eb[:], "error reading {}: {}\n", p, e))
+ ;;
+ std.slfree(p)
+}
+
+
+const respond = {srv, sess, status, body
+ var resp
+
+ resp = std.mk([
+ .status=status,
+ .hdrs = [][:],
+ .len = 0,
+ .err = `std.None,
+ .reason = "",
+ .body = body,
+ .enc = `http.Length
+ ])
+ http.respond(srv, sess, resp)
+ std.free(resp)
+}
--- a/lib/http/h.myr
+++ /dev/null
@@ -1,90 +1,0 @@
-use std
-use http
-
-const main = {args
- var data, method, showhdr, hdrs, out
- var s, u, r
- var cmd
-
- cmd = std.optparse(args, &[
- .argdesc = "url...",
- .minargs = 1,
- .opts = [
- [.opt='m', .arg="method", .desc="http method to use"],
- [.opt='d', .arg="data", .desc="data to put in request body"],
- [.opt='o', .arg="out", .desc="output file name"],
- [.opt='H', .desc="show headers"],
- [.opt='D', .arg="hdr", .desc="define custom header"]
- ][:]
- ])
-
- showhdr = false
- method = "get"
- data = ""
- hdrs = [][:]
- out = ""
- for opt : cmd.opts
- match opt
- | ('m', m): method = m
- | ('d', d): data = d
- | ('o', o): out = o
- | ('H', ""): showhdr = true
- | ('D', def): parsedef(&hdrs, def)
- | _: std.die("unreachable")
- ;;
- ;;
-
- for url : cmd.args
- if !std.hasprefix(url, "http")
- url = std.fmt("http://{}", url)
- ;;
- u = std.try(http.parseurl(url))
- s = std.try(http.mksession(u.schema, u.host, u.port))
-
- match method
- | "get": r = http.getreq(s, &[.url=u, .hdrs=hdrs])
- | "head": r = http.headreq(s, &[.url=u, .hdrs=hdrs])
- | "delete": r = http.deletereq(s, &[.url=u, .hdrs=hdrs])
- | "trace": r = http.tracereq(s, &[.url=u, .hdrs=hdrs])
- | "options": r = http.optionsreq(s, &[.url=u, .hdrs=hdrs])
- | "put": r = http.putreq(s, &[.url=u, .hdrs=hdrs], data)
- | "post": r = http.postreq(s, &[.url=u, .hdrs=hdrs], data)
- | unknown: std.fatal("unknown method '{}'\n", unknown)
- ;;
-
- match r
- | `std.Ok resp:
- if showhdr
- std.put("status: {}\n", resp.status)
- for (k, v) : resp.hdrs
- std.put("{}: {}\n", k, v)
- ;;
- ;;
- if out.len != 0
- if !std.blat(out, resp.body, 0o644)
- std.fatal("could not write output: {}\n", out)
- ;;
- else
- std.fblat(std.Out, resp.body)
- ;;
- http.freeresp(resp)
- | `std.Err e:
- std.put("{}\n", e)
- ;;
- http.urlfree(u)
- ;;
-}
-
-const parsedef = {hdrs, hdr
- var key, val
-
- match std.strfind(hdr, ":")
- | `std.None:
- std.fatal("bad header string {}\n", hdr)
- | `std.Some idx:
- key = std.sldup(std.strstrip(hdr[:idx]))
- val = std.sldup(std.strstrip(hdr[idx+1:]))
- std.slpush(hdrs, (key, val))
- ;;
-}
-
--- a/lib/http/srvdot.myr
+++ /dev/null
@@ -1,66 +1,0 @@
-use std
-use http
-
-const main = {args
- var srv, ann, cmd
-
- cmd = std.optparse(args, &[
- .maxargs=0,
- .opts = [[.opt='a', .arg="ann", .desc="announce on `ann`"]][:]
- ])
- ann = "tcp!localhost!8080"
- for opt : cmd.opts
- match opt
- | ('a', a): ann = a
- | _: std.die("unreachable")
- ;;
- ;;
-
- match http.announce(ann)
- | `std.Ok s: srv = s
- | `std.Err e: std.fatal("unable to announce: {}\n", e)
- ;;
-
- http.serve(srv, route)
-}
-
-const route = {srv, sess, req
- std.put("Reading path {}\n", req.url.path)
- match req.url.path
- | "/ping": respond(srv, sess, 200, "pong")
- | "/quit": http.shutdown(srv)
- | fspath: showfile(srv, sess, req.url.path)
- ;;
-}
-
-const showfile = {srv, sess, path
- var eb : byte[128]
- var p
-
- p = std.pathcat(".", path)
- match std.slurp(p)
- | `std.Ok buf:
- respond(srv, sess, 200, buf)
- std.slfree(buf)
- | `std.Err e:
- respond(srv, sess, 404, std.bfmt(eb[:], "error reading {}: {}\n", p, e))
- ;;
- std.slfree(p)
-}
-
-
-const respond = {srv, sess, status, body
- var resp
-
- resp = std.mk([
- .status=status,
- .hdrs = [][:],
- .len = 0,
- .err = `std.None,
- .reason = "",
- .body = body,
- .enc = `http.Length
- ])
- http.respond(srv, sess, resp)
- std.free(resp)
-}
--- a/mk/bootstrap/bootstrap+FreeBSD-amd64.sh
+++ b/mk/bootstrap/bootstrap+FreeBSD-amd64.sh
@@ -145,5 +145,5 @@
$pwd/6/6m -I lib/sys -I lib/std -I lib/bio -I lib/regex -I lib/thread mbld/test.myr
$pwd/6/6m -I lib/sys -I lib/std -I lib/bio -I lib/regex -I lib/thread mbld/deps.myr
$pwd/6/6m -I lib/sys -I lib/std -I lib/bio -I lib/regex -I lib/thread mbld/main.myr
- ld -o mbld/mbld $pwd/rt/_myrrt.o mbld/deps.o mbld/main.o mbld/util.o mbld/cpufeatures.o mbld/libs.o mbld/syssel.o mbld/config.o mbld/opts.o mbld/subtest.o mbld/types.o mbld/test.o mbld/install.o mbld/parse.o mbld/build.o -Llib/thread -lthread -Llib/bio -lbio -Llib/regex -lregex -Llib/std -lstd -Llib/sys -lsys
+ ld --gc-sections -o mbld/mbld $pwd/rt/_myrrt.o mbld/deps.o mbld/main.o mbld/util.o mbld/cpufeatures.o mbld/libs.o mbld/syssel.o mbld/config.o mbld/opts.o mbld/subtest.o mbld/types.o mbld/test.o mbld/install.o mbld/parse.o mbld/build.o -Llib/thread -lthread -Llib/bio -lbio -Llib/regex -lregex -Llib/std -lstd -Llib/sys -lsys
true