11package products
22
33import (
4+ "bytes"
45 "context"
56 "crypto/rand"
67 "encoding/json"
@@ -54,7 +55,7 @@ func newFilesDownloadCmd() *cobra.Command {
5455 path := cmdutil .JoinPath ("products" , productID , "files" , fileID , "download_url" )
5556 return admincmd .Run (fetchOpts , "Fetching download URL..." , func (client * adminapi.Client ) (json.RawMessage , error ) {
5657 return client .Get (path , url.Values {})
57- }, func (data json.RawMessage ) error {
58+ }, func (data json.RawMessage ) ( err error ) {
5859 resp , err := cmdutil.DecodeJSON [fileDownloadURLResponse ](data )
5960 if err != nil {
6061 return err
@@ -96,7 +97,7 @@ func newFilesDownloadCmd() *cobra.Command {
9697 }
9798 installDest = filepath .Join (filepath .Dir (stagingDir ), filepath .Base (dest ))
9899 defer func () {
99- stagedDownload . Close ( )
100+ err = errors . Join ( err , closeDownloadFile ( stagedDownload ) )
100101 os .Remove (stagedDownload .Name ())
101102 stagingDirLock .Close ()
102103 os .Remove (stagingDir )
@@ -106,17 +107,11 @@ func newFilesDownloadCmd() *cobra.Command {
106107 if err != nil {
107108 return err
108109 }
109- if machineOutput != nil {
110- defer func () {
111- machineOutput .Close ()
112- os .Remove (machineOutput .Name ())
113- }()
114- }
115110 if err := downloadToFile (opts , resp .SignedURL , stagedDownload , installDest , force ); err != nil {
116111 return err
117112 }
118113 if machineOutput != nil {
119- _ , err := io .Copy (opts .Out (), machineOutput )
114+ _ , err := io .Copy (opts .Out (), bytes . NewReader ( machineOutput ) )
120115 return err
121116 }
122117 return renderDownloadSuccess (opts , file , dest )
@@ -185,7 +180,7 @@ func prepareDownloadStaging(dest string) (string, io.Closer, *os.File, error) {
185180 return "" , nil , nil , err
186181 }
187182 if err := makeOpenPathPrivate (staged , 0o600 ); err != nil {
188- staged . Close ( )
183+ err = errors . Join ( err , closeDownloadFile ( staged ) )
189184 os .Remove (staged .Name ())
190185 lock .Close ()
191186 os .Remove (dir )
@@ -241,6 +236,13 @@ var downloadStallTimeout, downloadHTTPClient = 2 * time.Minute, &http.Client{Che
241236func refuseDownloadRedirects (_ * http.Request , _ []* http.Request ) error {
242237 return http .ErrUseLastResponse
243238}
239+ func closeDownloadFile (file * os.File ) error {
240+ err := file .Close ()
241+ if errors .Is (err , os .ErrClosed ) {
242+ return nil
243+ }
244+ return err
245+ }
244246func downloadToFile (opts cmdutil.Options , signedURL string , staged * os.File , dest string , force bool ) error {
245247 downloadURL , err := url .Parse (signedURL )
246248 if err != nil || downloadURL .Scheme != "https" || downloadURL .Host == "" || downloadURL .User != nil {
@@ -325,7 +327,7 @@ func stallAwareDownloadError(ctx, parent context.Context, err error) error {
325327 }
326328 return fmt .Errorf ("downloading the file failed: %w" , err )
327329}
328- func stageDownloadOutput (opts cmdutil.Options , file json.RawMessage , stagingDir , dest string ) (* os. File , error ) {
330+ func stageDownloadOutput (opts cmdutil.Options , file json.RawMessage , stagingDir , dest string ) (output [] byte , err error ) {
329331 if ! opts .UsesJSONOutput () {
330332 return nil , nil
331333 }
@@ -341,24 +343,23 @@ func stageDownloadOutput(opts cmdutil.Options, file json.RawMessage, stagingDir,
341343 if err != nil {
342344 return nil , err
343345 }
344- if err := makeOpenPathPrivate ( staged , 0o600 ); err != nil {
345- staged . Close ( )
346+ defer func () {
347+ err = errors . Join ( err , closeDownloadFile ( staged ) )
346348 os .Remove (staged .Name ())
349+ }()
350+ if err = makeOpenPathPrivate (staged , 0o600 ); err != nil {
347351 return nil , err
348352 }
349353 stagedOpts := opts
350354 stagedOpts .Stdout = staged
351- if err := cmdutil .PrintJSONResponse (stagedOpts , data ); err != nil {
352- staged .Close ()
353- os .Remove (staged .Name ())
355+ if err = cmdutil .PrintJSONResponse (stagedOpts , data ); err != nil {
354356 return nil , err
355357 }
356- if _ , err := staged .Seek (0 , io .SeekStart ); err != nil {
357- staged .Close ()
358- os .Remove (staged .Name ())
358+ if err = staged .Close (); err != nil {
359359 return nil , err
360360 }
361- return staged , nil
361+ output , err = os .ReadFile (staged .Name ())
362+ return output , err
362363}
363364
364365type stallTimeoutReader struct {
0 commit comments