diff --git a/codex/download.go b/codex/download.go index 9e1f958..2bc476d 100644 --- a/codex/download.go +++ b/codex/download.go @@ -208,20 +208,32 @@ func (node CodexNode) DownloadStream(ctx context.Context, cid string, options Do return bridge.callError("cGoCodexDownloadLocal") } - var cancelErr error - select { - case <-ctx.Done(): - cancelErr = node.DownloadCancel(cid) - default: - // continue - } + done := make(chan struct{}) + channelError := make(chan error, 1) + go func() { + select { + case <-ctx.Done(): + channelError <- node.DownloadCancel(cid) + case <-done: + // Nothing to do, download finished + } + }() _, err = bridge.wait() + close(done) + + // Extract the potential cancellation error + var cancelError error + select { + case cancelError = <-channelError: + default: + } if err != nil { - if cancelErr != nil { - return fmt.Errorf("upload canceled: %v, but failed to cancel upload session: %v", ctx.Err(), cancelErr) + if cancelError != nil { + return fmt.Errorf("download canceled: %v, but failed to cancel download session: %v", ctx.Err(), cancelError) } + return err } diff --git a/codex/upload.go b/codex/upload.go index cd71f8d..0643d87 100644 --- a/codex/upload.go +++ b/codex/upload.go @@ -305,15 +305,27 @@ func (node CodexNode) UploadFile(ctx context.Context, options UploadOptions) (st return "", bridge.callError("cGoCodexUploadFile") } - var cancelErr error - select { - case <-ctx.Done(): - cancelErr = node.UploadCancel(sessionId) - default: - // continue - } + done := make(chan struct{}) + channelError := make(chan error, 1) + go func() { + select { + case <-ctx.Done(): + channelError <- node.UploadCancel(sessionId) + case <-done: + // Nothing to do, upload finished + } + }() _, err = bridge.wait() + close(done) + + // Extract the potential cancellation error + var cancelErr error + select { + case cancelErr = <-channelError: + default: + } + if err != nil { if cancelErr != nil { return "", fmt.Errorf("upload canceled: %v, but failed to cancel upload session: %v", ctx.Err(), cancelErr)