From e24143a1962c16763cb73f4e41b30117bcf0d80c Mon Sep 17 00:00:00 2001 From: Simon Zolin Date: Fri, 24 Apr 2020 15:50:57 +0300 Subject: [PATCH] - Web: flush the bufferred response data before performing global operations --- home/control_install.go | 7 +++++-- home/control_update.go | 4 +++- home/tls.go | 5 ++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/home/control_install.go b/home/control_install.go index 4a39983f..864ad96b 100644 --- a/home/control_install.go +++ b/home/control_install.go @@ -351,6 +351,11 @@ func (web *Web) handleInstallConfigure(w http.ResponseWriter, r *http.Request) { registerControlHandlers() + returnOK(w) + if f, ok := w.(http.Flusher); ok { + f.Flush() + } + // this needs to be done in a goroutine because Shutdown() is a blocking call, and it will block // until all requests are finished, and _we_ are inside a request right now, so it will block indefinitely if restartHTTP { @@ -358,8 +363,6 @@ func (web *Web) handleInstallConfigure(w http.ResponseWriter, r *http.Request) { _ = Context.web.httpServer.Shutdown(context.TODO()) }() } - - returnOK(w) } func (web *Web) registerInstallHandlers() { diff --git a/home/control_update.go b/home/control_update.go index b0080e44..6115fac1 100644 --- a/home/control_update.go +++ b/home/control_update.go @@ -548,7 +548,9 @@ func handleUpdate(w http.ResponseWriter, r *http.Request) { } returnOK(w) + if f, ok := w.(http.Flusher); ok { + f.Flush() + } - time.Sleep(time.Second) // wait (hopefully) until response is sent (not sure whether it's really necessary) go finishUpdate(u) } diff --git a/home/tls.go b/home/tls.go index 1e6267fe..5977f859 100644 --- a/home/tls.go +++ b/home/tls.go @@ -279,11 +279,14 @@ func (t *TLSMod) handleTLSConfigure(w http.ResponseWriter, r *http.Request) { tlsConfigStatus: t.status, } marshalTLS(w, data2) + if f, ok := w.(http.Flusher); ok { + f.Flush() + } + // this needs to be done in a goroutine because Shutdown() is a blocking call, and it will block // until all requests are finished, and _we_ are inside a request right now, so it will block indefinitely if restartHTTPS { go func() { - time.Sleep(time.Second) // TODO: could not find a way to reliably know that data was fully sent to client by https server, so we wait a bit to let response through before closing the server Context.web.TLSConfigChanged(data) }() }