func streamToClient(ctx context.Context, w http.ResponseWriter, desc distribution.Descriptor, bw distribution.BlobWriter) error { setResponseHeaders(w, desc.Size, desc.MediaType, desc.Digest) reader, err := bw.Reader() if err != nil { return err } defer reader.Close() teeReader := io.TeeReader(reader, w) buf := make([]byte, 32768, 32786) var soFar int64 for { rd, err := teeReader.Read(buf) if err == nil || err == io.EOF { soFar += int64(rd) if soFar < desc.Size { // buffer underflow, keep trying continue } return nil } return err } }