package main import ( "io" "net" "net/http" ) // Server that handles http responses type Server struct { headerNames []string logger LoggerHandler } func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { for _, headerName := range s.headerNames { possibleIP := req.Header.Get(headerName) if possibleIP == "" { continue } ip, err := NewIP(possibleIP) if err != nil { continue } s.sendResponse(w, ip) return } addr, _, err := net.SplitHostPort(req.RemoteAddr) if err != nil { s.handleError(w, http.StatusBadRequest, err, "Could not get IP address from request") return } ip, err := NewIP(addr) if err != nil { s.handleError(w, http.StatusBadRequest, err, "Could not parse IP address"+addr) return } s.sendResponse(w, ip) } func (s *Server) sendResponse(resp http.ResponseWriter, ip *IP) { io.WriteString(resp, ip.String()+"\n") s.logger.Printf("Request from %s %s\n", ip.version, ip) } func (s *Server) handleError(resp http.ResponseWriter, status int, err error, message string) { resp.WriteHeader(status) io.WriteString(resp, message) s.logger.Printf("Error handling request: %s (%s)", message, err) }