MCPcopy
hub / github.com/hyperledger/fabric / ParseChaincodePackage

Function ParseChaincodePackage

core/chaincode/persistence/chaincode_package.go:281–339  ·  view source on GitHub ↗

ParseChaincodePackage parses a set of bytes as a chaincode package and returns the parsed package as a metadata struct and a code package

(source []byte)

Source from the content-addressed store, hash-verified

279// ParseChaincodePackage parses a set of bytes as a chaincode package
280// and returns the parsed package as a metadata struct and a code package
281func ParseChaincodePackage(source []byte) (*ChaincodePackageMetadata, []byte, error) {
282 gzReader, err := gzip.NewReader(bytes.NewBuffer(source))
283 if err != nil {
284 return &ChaincodePackageMetadata{}, nil, errors.Wrapf(err, "error reading as gzip stream")
285 }
286
287 tarReader := tar.NewReader(gzReader)
288
289 var codePackage []byte
290 var ccPackageMetadata *ChaincodePackageMetadata
291 for {
292 header, err := tarReader.Next()
293 if err == io.EOF {
294 break
295 }
296
297 if err != nil {
298 return ccPackageMetadata, nil, errors.Wrapf(err, "error inspecting next tar header")
299 }
300
301 if header.Typeflag != tar.TypeReg {
302 return ccPackageMetadata, nil, errors.Errorf("tar entry %s is not a regular file, type %v", header.Name, header.Typeflag)
303 }
304
305 fileBytes, err := io.ReadAll(tarReader)
306 if err != nil {
307 return ccPackageMetadata, nil, errors.Wrapf(err, "could not read %s from tar", header.Name)
308 }
309
310 switch header.Name {
311
312 case MetadataFile:
313 ccPackageMetadata = &ChaincodePackageMetadata{}
314 err := json.Unmarshal(fileBytes, ccPackageMetadata)
315 if err != nil {
316 return ccPackageMetadata, nil, errors.Wrapf(err, "could not unmarshal %s as json", MetadataFile)
317 }
318
319 case CodePackageFile:
320 codePackage = fileBytes
321 default:
322 logger.Warningf("Encountered unexpected file '%s' in top level of chaincode package", header.Name)
323 }
324 }
325
326 if codePackage == nil {
327 return ccPackageMetadata, nil, errors.Errorf("did not find a code package inside the package")
328 }
329
330 if ccPackageMetadata == nil {
331 return ccPackageMetadata, nil, errors.Errorf("did not find any package metadata (missing %s)", MetadataFile)
332 }
333
334 if err := ValidateLabel(ccPackageMetadata.Label); err != nil {
335 return ccPackageMetadata, nil, err
336 }
337
338 return ccPackageMetadata, codePackage, nil

Callers 2

PackageIDMethod · 0.92
ParseMethod · 0.85

Calls 5

ValidateLabelFunction · 0.85
NextMethod · 0.65
ErrorfMethod · 0.65
UnmarshalMethod · 0.65
WarningfMethod · 0.65

Tested by

no test coverage detected