From c799e4a577e325d4ef3fd74ebd5415994096cd16 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 6 Jan 2016 00:25:24 +0000 Subject: [PATCH] net/http/pprof: stop profiling if client's connection closes Fixes #13833 Change-Id: If0bd5f7dcfc39d34680d11eb998050f0900d5a26 Reviewed-on: https://go-review.googlesource.com/18283 Reviewed-by: Russ Cox Run-TryBot: Brad Fitzpatrick --- src/net/http/pprof/pprof.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/net/http/pprof/pprof.go b/src/net/http/pprof/pprof.go index fd9154ac2a..63ff22123b 100644 --- a/src/net/http/pprof/pprof.go +++ b/src/net/http/pprof/pprof.go @@ -80,6 +80,17 @@ func Cmdline(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, strings.Join(os.Args, "\x00")) } +func sleep(w http.ResponseWriter, d time.Duration) { + var clientGone <-chan bool + if cn, ok := w.(http.CloseNotifier); ok { + clientGone = cn.CloseNotify() + } + select { + case <-time.After(d): + case <-clientGone: + } +} + // Profile responds with the pprof-formatted cpu profile. // The package initialization registers it as /debug/pprof/profile. func Profile(w http.ResponseWriter, r *http.Request) { @@ -100,7 +111,7 @@ func Profile(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Could not enable CPU profiling: %s\n", err) return } - time.Sleep(time.Duration(sec) * time.Second) + sleep(w, time.Duration(sec)*time.Second) pprof.StopCPUProfile() } @@ -124,7 +135,7 @@ func Trace(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Could not enable tracing: %s\n", err) return } - time.Sleep(time.Duration(sec) * time.Second) + sleep(w, time.Duration(sec)*time.Second) trace.Stop() } -- 2.50.0