func (s *dockerImageSource) GetBlob(ctx context.Context, info types.BlobInfo, cache types.BlobInfoCache) (io.ReadCloser, int64, error) {
	if len(info.URLs) != 0 {
		return s.getExternalBlob(ctx, info.URLs)
	}

	path := fmt.Sprintf(blobsPath, reference.Path(s.ref.ref), info.Digest.String())
	logrus.Debugf("Downloading %s", path)
	res, err := s.c.makeRequest(ctx, "GET", path, nil, nil, v2Auth, nil)
	if err != nil {
		return nil, 0, err
	}
	if res.StatusCode != http.StatusOK {
		// print url also
		return nil, 0, errors.Errorf("Invalid status code returned when fetching blob %d (%s)", res.StatusCode, http.StatusText(res.StatusCode))
	}
	cache.RecordKnownLocation(s.ref.Transport(), bicTransportScope(s.ref), info.Digest, newBICLocationReference(s.ref))
	return res.Body, getBlobSize(res), nil
}
func (s *dockerImageSource) GetBlob(ctx context.Context, info types.BlobInfo, cache types.BlobInfoCache) (io.ReadCloser, int64, error) {
	if len(info.URLs) != 0 {
		return s.getExternalBlob(ctx, info.URLs)
	}

	path := fmt.Sprintf(blobsPath, reference.Path(s.ref.ref), info.Digest.String())
	logrus.Debugf("Downloading %s", path)
	res, err := s.c.makeRequest(ctx, "GET", path, nil, nil, v2Auth, nil)
	if err != nil {
		return nil, 0, err
	}
	if res.StatusCode != http.StatusOK {
		
		return nil, 0, errors.Errorf("Invalid status code returned when fetching blob %d (%s)", res.StatusCode, http.StatusText(res.StatusCode))
	}
	cache.RecordKnownLocation(s.ref.Transport(), bicTransportScope(s.ref), info.Digest, newBICLocationReference(s.ref))
	return res.Body, getBlobSize(res), nil
}
func ( s * dockerImageSource ) GetBlob ( ctx context . Context , info types . BlobInfo , cache types . BlobInfoCache ) ( io . ReadCloser , int64 , error ) { if len ( info . URLs ) != 0 { return s . getExternalBlob ( ctx , info . URLs ) } path := fmt . Sprintf ( blobsPath , reference . Path ( s . ref . ref ) , info . Digest . String ( ) ) logrus . Debugf ( " " , path ) res , err := s . c . makeRequest ( ctx , " " , path , nil , nil , v2Auth , nil ) if err != nil { return nil , 0 , err } if res . StatusCode != http . StatusOK { // print url also return nil , 0 , errors . Errorf ( " " , res . StatusCode , http . StatusText ( res . StatusCode ) ) } cache . RecordKnownLocation ( s . ref . Transport ( ) , bicTransportScope ( s . ref ) , info . Digest , newBICLocationReference ( s . ref ) ) return res . Body , getBlobSize ( res ) , nil }
// GetBlob returns a stream for the specified blob, and the blob’s size (or -1 if unknown).
// The Digest field in BlobInfo is guaranteed to be provided, Size may be -1 and MediaType may be optionally provided.
// May update BlobInfoCache, preferably after it knows for certain that a blob truly exists at a specific location.
GetBlob returns a stream for the specified blob and the blob’s size ( or - 1 if unknown ) . The Digest field in BlobInfo is guaranteed to be provided Size may be - 1 and MediaType may be optionally provided . May update BlobInfoCache preferably after it knows for certain that a blob truly exists at a specific location .