package main import ( "fmt" "log/slog" "net" "net/http" "time" ) type TimeHandler struct{} func (th TimeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte(time.Now().Format(time.RFC3339))) } func RequestToIP(r *http.Request) string { ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { slog.Error(fmt.Sprintf("Wrong format of address: %q", r.RemoteAddr)) } return ip } func RequestIPHandler(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.Info(RequestToIP(r)) h.ServeHTTP(w, r) }) } func main() { server := http.Server{ Addr: ":10100", ReadTimeout: 30 * time.Second, WriteTimeout: 90 * time.Second, IdleTimeout: 120 * time.Second, Handler: RequestIPHandler(TimeHandler{}), } err := server.ListenAndServe() if err != nil { if err != http.ErrServerClosed { panic(err) } } }