func extractEmbeddedLayer(file *os.File, layerID string, outputPath string) (*os.File, error) { util.Info("Extracting layer: ", layerID, "\n") _, err := file.Seek(0, 0) if err != nil { fmt.Errorf("error seeking file: %v", err) } layerTarPath := path.Join(layerID, "layer.tar") var layerFile *os.File fileWalker := func(t *tarball.TarFile) error { if filepath.Clean(t.Name()) == layerTarPath { layerFile, err = os.Create(outputPath) if err != nil { return fmt.Errorf("error creating layer: %v", err) } _, err = io.Copy(layerFile, t.TarStream) if err != nil { return fmt.Errorf("error getting layer: %v", err) } } return nil } tr := tar.NewReader(file) if err := tarball.Walk(*tr, fileWalker); err != nil { return nil, err } if layerFile == nil { return nil, fmt.Errorf("file %q not found", layerTarPath) } return layerFile, nil }
func getLayer(imgID, registry string, repoData *RepoData, imgSize int64) (io.ReadCloser, error) { client := &http.Client{} req, err := http.NewRequest("GET", "https://"+path.Join(registry, "images", imgID, "layer"), nil) if err != nil { return nil, err } setAuthToken(req, repoData.Tokens) setCookie(req, repoData.Cookie) util.Info("Downloading layer: ", imgID, "\n") res, err := client.Do(req) if err != nil { return nil, err } if res.StatusCode != 200 { res.Body.Close() return nil, fmt.Errorf("HTTP code: %d. URL: %s", res.StatusCode, req.URL) } return res.Body, nil }