func runHandler(resp http.ResponseWriter, req *http.Request, fn func(resp http.ResponseWriter, req *http.Request) error, errfn httputil.Error) { defer func() { if rv := recover(); rv != nil { err := errors.New("handler panic") logError(req, err, rv) errfn(resp, req, http.StatusInternalServerError, err) } }() if s := req.Header.Get("X-Real-Ip"); s != "" && httputil.StripPort(req.RemoteAddr) == "127.0.0.1" { req.RemoteAddr = s } req.Body = http.MaxBytesReader(resp, req.Body, 2048) req.ParseForm() var rb httputil.ResponseBuffer err := fn(&rb, req) if err == nil { rb.WriteTo(resp) } else if e, ok := err.(*httpError); ok { if e.status >= 500 { logError(req, err, nil) } errfn(resp, req, e.status, e.err) } else { logError(req, err, nil) errfn(resp, req, http.StatusInternalServerError, err) } }
func isRobot(req *http.Request) bool { if robotPat.MatchString(req.Header.Get("User-Agent")) { return true } host := httputil.StripPort(req.RemoteAddr) n, err := db.IncrementCounter(host, 1) if err != nil { log.Printf("error incrementing counter for %s, %v\n", host, err) return false } if n > *robot { log.Printf("robot %.2f %s %s", n, host, req.Header.Get("User-Agent")) return true } return false }