diff options
Diffstat (limited to 'cmd/web/download.go')
| -rw-r--r-- | cmd/web/download.go | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/cmd/web/download.go b/cmd/web/download.go index 93c4ff5..1c70717 100644 --- a/cmd/web/download.go +++ b/cmd/web/download.go @@ -1,7 +1,10 @@ package main import ( + "io" "net/http" + "time" + "fmt" "github.com/gorilla/mux" ) @@ -20,14 +23,40 @@ func gameDownloader(w http.ResponseWriter, r *http.Request) { } w.Header().Add("Content-type", "application/tar") + w.Header().Add("Estimated-size", fmt.Sprintf("%d", g.Size)) Logger.Printf("Client %s is downloading: %s", r.RemoteAddr, game) - err := g.Package(w) - if err != nil { - Logger.Printf("Client %s Error Sending game: %s", r.RemoteAddr, err) - // Headers already sent, don't bother sending an error - return + + // Invert the writer so we can break up the copy and get progress + // information in here + rdr, pwrtr := io.Pipe() + go func() { + err := g.Package(pwrtr) + if err != nil { + Logger.Println("Error in package writing: ", err) + } + }() + + var total int64 + + start := time.Now() + for { + n, err := io.CopyN(w, rdr, 256*1024*1024) + if err == io.EOF { + break + } + if err != nil { + Logger.Printf("Client %s Error Sending game: %s", r.RemoteAddr, err) + // Headers already sent, don't bother sending an error + return + } + total += n + mb := float64(total / 1024 / 1024) + rate := mb / time.Since(start).Seconds() + + Logger.Printf("Client %s is downloading %s: %0.1f%% done %.2f mb/s", + r.RemoteAddr, game, float64(total)/float64(g.Size)*100, rate) } + Logger.Printf("Client %s finished downloading: %s", r.RemoteAddr, game) } - |
