From f7a82a216b2b05a46a23ab2fec9ef8a368743eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 1 Oct 2020 22:06:15 +0200 Subject: [PATCH] Avoid error from cache file being prematurely closed I have no idea what's going on there, so I'll just give up the streaming approach and read the entire contents of the cache file to memory. https://github.com/cli/cli/pull/2035/checks?check_run_id=1194798056 --- api/cache.go | 20 +++++++------------- api/cache_test.go | 1 + 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/api/cache.go b/api/cache.go index 006362504..9d6ee7ea0 100644 --- a/api/cache.go +++ b/api/cache.go @@ -62,16 +62,12 @@ func cacheKey(req *http.Request) (string, error) { return fmt.Sprintf("%x", digest), nil } -type readCloser struct { - io.Reader - io.Closer -} - func readCache(ttl time.Duration, cacheFile string, req *http.Request) (*http.Response, error) { f, err := os.Open(cacheFile) if err != nil { return nil, err } + defer f.Close() fs, err := f.Stat() if err != nil { @@ -83,15 +79,13 @@ func readCache(ttl time.Duration, cacheFile string, req *http.Request) (*http.Re return nil, errors.New("cache expired") } - res, err := http.ReadResponse(bufio.NewReader(f), req) - if res == nil { - res.Body = &readCloser{ - Reader: res.Body, - Closer: f, - } - } else { - f.Close() + body := &bytes.Buffer{} + _, err = io.Copy(body, f) + if err != nil { + return nil, err } + + res, err := http.ReadResponse(bufio.NewReader(body), req) return res, err } diff --git a/api/cache_test.go b/api/cache_test.go index 48255186f..8540e7d44 100644 --- a/api/cache_test.go +++ b/api/cache_test.go @@ -39,6 +39,7 @@ func Test_CacheReponse(t *testing.T) { if err != nil { return "", err } + defer res.Body.Close() resBody, err := ioutil.ReadAll(res.Body) if err != nil { err = fmt.Errorf("ReadAll: %w", err)