diff --git a/README b/README index b9b601b..ef5be7a 100644 --- a/README +++ b/README @@ -40,9 +40,10 @@ gobyexample.com signups = topics * web app - * serve static files + * middleware in general + * return status code * log requests - * basic auth + * serve static files * force https * force canonical host * not found page diff --git a/src/xx-elapsed.go b/src/xx-elapsed.go index 96b52e7..e5ee6d3 100644 --- a/src/xx-elapsed.go +++ b/src/xx-elapsed.go @@ -5,6 +5,5 @@ import ("time"; "fmt") func main() { start := time.Now() time.Sleep(3 * time.Second) - finish := time.Now() - fmt.Println(finish.Sub(start)) + fmt.Println(time.Since(start)) } diff --git a/src/xx-http-server-log.go b/src/xx-http-server-log.go new file mode 100644 index 0000000..afa816a --- /dev/null +++ b/src/xx-http-server-log.go @@ -0,0 +1,35 @@ +package main + +import ("net/http"; "fmt"; "time") + +func hello(res http.ResponseWriter, req *http.Request) { + res.Header().Set("Content-Type", "text/plain") + time.Sleep(time.Millisecond * 50) + fmt.Fprintln(res, "Hello logged world") +} + +func wrapLogging(f http.HandlerFunc, logs chan string) http.HandlerFunc { + return func(res http.ResponseWriter, req *http.Request) { + start := time.Now() + f(res, req) + method := req.Method + path := req.URL.Path + elapsed := float64(time.Since(start)) / 1000000.0 + logs <- fmt.Sprintf("method=%s path=%s elapsed=%f", method, path, elapsed) + + } +} + +func runLogging(logs chan string) { + for log := range logs { + fmt.Println(log) + } +} + +func main() { + logs := make(chan string, 10000) + go runLogging(logs) + handler := wrapLogging(hello, logs) + http.HandleFunc("/", handler) + http.ListenAndServe(":5000", nil) +}