From 856c864e9867113c015f19c66d10205f5b81a2f6 Mon Sep 17 00:00:00 2001 From: Roman Bataev Date: Tue, 27 Mar 2018 21:18:38 -0700 Subject: [PATCH] joker.http/start-file-server --- std/http.joke | 7 +++++++ std/http/a_http.go | 22 ++++++++++++++++++++++ std/http/http_native.go | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/std/http.joke b/std/http.joke index b3daa0059..503fb58a1 100644 --- a/std/http.joke +++ b/std/http.joke @@ -26,3 +26,10 @@ {:added "1.0" :go "startServer(addr, handler)"} [^String addr ^Callable handler]) + +(defn start-file-server + "Starts HTTP server on the TCP network address addr that + serves HTTP requests with the contents of the file system rooted at root." + {:added "1.0" + :go "startFileServer(addr, root)"} + [^String addr ^String root]) diff --git a/std/http/a_http.go b/std/http/a_http.go index 88bed2bc6..90fee97a5 100644 --- a/std/http/a_http.go +++ b/std/http/a_http.go @@ -24,6 +24,22 @@ var send_ Proc = func(args []Object) Object { return NIL } +var start_file_server_ Proc = func(args []Object) Object { + c := len(args) + switch { + case c == 2: + + addr := ExtractString(args, 0) + root := ExtractString(args, 1) + res := startFileServer(addr, root) + return res + + default: + PanicArity(c) + } + return NIL +} + var start_server_ Proc = func(args []Object) Object { c := len(args) switch { @@ -62,6 +78,12 @@ httpNamespace.InternVar("send", send_, - headers (map) - content-length (int)`, "1.0")) +httpNamespace.InternVar("start-file-server", start_file_server_, + MakeMeta( + NewListFrom(NewVectorFrom(MakeSymbol("addr"), MakeSymbol("root"))), + `Starts HTTP server on the TCP network address addr that + serves HTTP requests with the contents of the file system rooted at root.`, "1.0")) + httpNamespace.InternVar("start-server", start_server_, MakeMeta( NewListFrom(NewVectorFrom(MakeSymbol("addr"), MakeSymbol("handler"))), diff --git a/std/http/http_native.go b/std/http/http_native.go index 150e9b5db..ebdd7f148 100644 --- a/std/http/http_native.go +++ b/std/http/http_native.go @@ -158,3 +158,9 @@ func startServer(addr string, handler Callable) Object { PanicOnErr(err) return NIL } + +func startFileServer(addr string, root string) Object { + err := http.ListenAndServe(addr, http.FileServer(http.Dir(root))) + PanicOnErr(err) + return NIL +}