Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. | |
| // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | |
| // See page 21. | |
| //!+ | |
| // Server3 is a minimal "echo" and counter server. | |
| package main | |
| import ( | |
| "fmt" | |
| "log" | |
| "net/http" | |
| "sync" | |
| ) | |
| var mu sync.Mutex | |
| var count int | |
| func main() { | |
| http.HandleFunc("/", handler) | |
| http.HandleFunc("/count", counter) | |
| log.Fatal(http.ListenAndServe("localhost:8000", nil)) | |
| } | |
| //!+handler | |
| // handler echoes the HTTP request. | |
| func handler(w http.ResponseWriter, r *http.Request) { | |
| fmt.Fprintf(w, "%s %s %s\n", r.Method, r.URL, r.Proto) | |
| for k, v := range r.Header { | |
| fmt.Fprintf(w, "Header[%q] = %q\n", k, v) | |
| } | |
| fmt.Fprintf(w, "Host = %q\n", r.Host) | |
| fmt.Fprintf(w, "RemoteAddr = %q\n", r.RemoteAddr) | |
| if err := r.ParseForm(); err != nil { | |
| log.Print(err) | |
| } | |
| for k, v := range r.Form { | |
| fmt.Fprintf(w, "Form[%q] = %q\n", k, v) | |
| } | |
| } | |
| //!-handler | |
| // counter echoes the number of calls so far. | |
| func counter(w http.ResponseWriter, r *http.Request) { | |
| mu.Lock() | |
| fmt.Fprintf(w, "Count %d", count) | |
| mu.Unlock() | |
| } | |
| //!- |