func (a *BuyActivity) sendMissingChunksAndReturnResult(log bitwrk.Logger, client *http.Client, wishList []byte) (io.ReadCloser, error) { // Send data of missing chunks to seller pipeIn, pipeOut := io.Pipe() defer pipeIn.Close() mwriter := multipart.NewWriter(pipeOut) // Write work chunks into pipe for HTTP request go func() { defer pipeOut.Close() if part, err := mwriter.CreateFormFile("chunkdata", "chunkdata.bin"); err != nil { pipeOut.CloseWithError(err) return } else if err := cafs.WriteRequestedChunks(a.workFile, wishList, part); err != nil { pipeOut.CloseWithError(err) return } if err := mwriter.Close(); err != nil { pipeOut.CloseWithError(err) return } log.Printf("Missing chunk data transmitted successfully.") }() if r, err := a.postToSeller(pipeIn, mwriter.FormDataContentType(), client); err != nil { return nil, fmt.Errorf("Error sending work chunk data to seller: %v", err) } else { return r, nil } }
func (a *BuyActivity) sendMissingChunksAndReturnResult(log bitwrk.Logger, client *http.Client, wishList []byte, compressed bool) (io.ReadCloser, error) { // Send data of missing chunks to seller pipeIn, pipeOut := io.Pipe() defer pipeIn.Close() // Setup compression layer with dummy impl in case of uncompressed transmisison var compressor io.Writer var closeCompressor func() error if compressed { c := gzip.NewWriter(pipeOut) compressor = c closeCompressor = c.Close } else { compressor = pipeOut closeCompressor = func() error { return nil } } mwriter := multipart.NewWriter(compressor) // Communicate status back progressCallback := func(bytesToTransfer, bytesTransferred uint64) { a.execSync(func() { a.bytesToTransfer = bytesToTransfer a.bytesTransferred = bytesTransferred }) } // Write work chunks into pipe for HTTP request go func() { defer pipeOut.Close() if part, err := mwriter.CreateFormFile("chunkdata", "chunkdata.bin"); err != nil { pipeOut.CloseWithError(err) return } else if err := cafs.WriteRequestedChunks(a.workFile, wishList, part, progressCallback); err != nil { pipeOut.CloseWithError(err) return } if err := mwriter.Close(); err != nil { pipeOut.CloseWithError(err) return } if err := closeCompressor(); err != nil { pipeOut.CloseWithError(err) return } log.Printf("Missing chunk data transmitted successfully.") }() if r, err := a.postToSeller(pipeIn, mwriter.FormDataContentType(), compressed, client); err != nil { return nil, fmt.Errorf("Error sending work chunk data to seller: %v", err) } else { return r, nil } }