Static http file server in Go
Go is a great language for building network based applications. It comes with some excellent tools for creating web-apps out of the box.
I often want to create a “simple http server” to serve up the current
directory, usually I reach for python -m SimpleHTTPServer
, but in the
spirit of re-inventing the wheel I decided to see how Go could handle
this task.
It turned out to be remarkably simple. Go comes with a static file server
as part of the net/http
package, in this example I’ve added a couple of flags that
allow specifying the port and the root filesystem path for the process.
// httpserver.go
package main
import (
"flag"
"net/http"
)
var port = flag.String("port", "8080", "Define what TCP port to bind to")
var root = flag.String("root", ".", "Define the root filesystem path")
func main() {
flag.Parse()
panic(http.ListenAndServe(":"+*port, http.FileServer(http.Dir(*root))))
}
The actual meat of the program is the second line inside the main
function. http.ListenAndServe
accepts an address to listen on as the first argument,
and an object which implements the http.Handler
interface as the second,
in this case http.FileServer
. If
ListenAndServe
returns an error (most likely because another process
is using the desired port) then the process will panic
and exit.
If you’ve got Go installed then this can be run directly.
$ go run httpserver.go
Or you can compile it to a standalone binary.
$ go build httpserver.go
$ ./httpserver
The file server implementation that Go provides even handles serving index.html
from a directory if no file is specified, and provides a directory
listing if there is no index.html
present.
For more details check out Go’s implementation of http.FileServer
.
The code shown in this article is available on GitHub.