httpd.myr 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use std
  2. use http
  3. use escfmt
  4. use "dispatch"
  5. const httpd = {params
  6. var srv
  7. var ip, port
  8. ip=params[0]
  9. port=params[1]
  10. var serveropt = ["tcp","!",ip,"!",port]
  11. std.put("httpd running {}:{}\n",ip,port)
  12. match http.announce(std.strjoin(serveropt[:], ""))
  13. | `std.Ok s: srv = s
  14. | `std.Err e: std.fatal("unable to announce: {}\n", e)
  15. ;;
  16. http.serve(srv, handler)
  17. }
  18. const handler = {srv, sess, req
  19. var s = std.fmt("{}", escfmt.url(req.url.path))
  20. var url=req.url.path
  21. var charform
  22. var signc
  23. const signs = [0x23,0x24]
  24. for sign : signs[:]
  25. signc=std.fmt("{x}",sign)
  26. charform=std.fmt("{}", (sign : char))
  27. //std.put("{} , {} > {}\n",req.url.path,std.strcat("%",signc),charform)
  28. url=std.strreplace(url,std.strcat("%",signc),charform)
  29. ;;
  30. std.put("Reading reqpath {}\n", url)
  31. match url
  32. | "/ping": respond(srv, sess, 200, "pong")
  33. | fspath: showfile(srv, sess, url)
  34. ;;
  35. }
  36. const showfile = {srv, sess, path
  37. var eb : byte[128]
  38. var p
  39. p = std.pathcat(".", path)
  40. match std.slurp(p)
  41. | `std.Ok buf:
  42. respond(srv, sess, 200, buf)
  43. std.slfree(buf)
  44. | `std.Err e:
  45. respond(srv, sess, 404, std.bfmt(eb[:], "error reading {}: {}\n", p, e))
  46. ;;
  47. std.slfree(p)
  48. }
  49. const respond = {srv, sess, status, body
  50. var resp
  51. resp = std.mk([
  52. .status=status,
  53. .hdrs = [][:],
  54. .len = 0,
  55. .err = `std.None,
  56. .reason = "",
  57. .body = body,
  58. .enc = `http.Length
  59. ])
  60. http.respond(srv, sess, resp)
  61. std.free(resp)
  62. }
  63. const __init__ = {
  64. dispatch.register("httpd", httpd)
  65. }