package main import ( "fmt" "net/http" "log" ) var( metrics_num_passwords int ) func main() { log.Println("Starting HTTP listener") http.HandleFunc("/", httpHandler) http.HandleFunc("/metrics", metricsHandler) listenErr := http.ListenAndServe(":80", nil) // set listen port if listenErr != nil { log.Fatalln(listenErr.Error()) } } // Handling incoming HTTP connections func httpHandler(w http.ResponseWriter, r *http.Request) { // Get user/pass combo user, pass, ok := r.BasicAuth() if ok { // This also includes empty user/pass combos (if they are correctly encoded) // To avoid them, use `len(user) > 0 && len(pass) > 0` log.Printf("%s: %s %s:%s@%s%s", r.RemoteAddr, r.Method, user, pass, r.Host, r.URL.Path) // Raise stats metrics_num_passwords++ } else { log.Printf("%s: %s %s%s", r.RemoteAddr, r.Method, r.Host, r.URL.Path) } // Decline that try w.Header().Set("WWW-Authenticate", `Basic realm="Protected Area"`) w.WriteHeader(http.StatusUnauthorized) } // Handle HTTP /metrics requests func metricsHandler(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "num_passwords %d\n", metrics_num_passwords) }