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)
| 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 |
| 281 | func 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 |