@@ -42,11 +42,40 @@ var (
4242 reOptDep = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?(:.*)?$` )
4343 rePkgVer = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?$` )
4444
45- magicZSTD = []byte {0x28 , 0xB5 , 0x2F , 0xFD }
46- magicXZ = []byte {0xFD , 0x37 , 0x7A , 0x58 , 0x5A }
47- magicGZ = []byte {0x1F , 0x8B }
45+ maxMagicLength = 0
46+ magics = map [string ]struct {
47+ magic []byte
48+ archiver func () archiver.Reader
49+ }{
50+ "zst" : {
51+ magic : []byte {0x28 , 0xB5 , 0x2F , 0xFD },
52+ archiver : func () archiver.Reader {
53+ return archiver .NewTarZstd ()
54+ },
55+ },
56+ "xz" : {
57+ magic : []byte {0xFD , 0x37 , 0x7A , 0x58 , 0x5A },
58+ archiver : func () archiver.Reader {
59+ return archiver .NewTarXz ()
60+ },
61+ },
62+ "gz" : {
63+ magic : []byte {0x1F , 0x8B },
64+ archiver : func () archiver.Reader {
65+ return archiver .NewTarGz ()
66+ },
67+ },
68+ }
4869)
4970
71+ func init () {
72+ for _ , i := range magics {
73+ if nLen := len (i .magic ); nLen > maxMagicLength {
74+ maxMagicLength = nLen
75+ }
76+ }
77+ }
78+
5079type Package struct {
5180 Name string `json:"name"`
5281 Version string `json:"version"` // Includes version, release and epoch
@@ -94,7 +123,8 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
94123 if err != nil {
95124 return nil , err
96125 }
97- header := make ([]byte , 5 )
126+
127+ header := make ([]byte , maxMagicLength )
98128 _ , err = r .Read (header )
99129 if err != nil {
100130 return nil , err
@@ -106,16 +136,14 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
106136
107137 var tarball archiver.Reader
108138 var tarballType string
109- if bytes .Equal (header [:len (magicZSTD )], magicZSTD ) {
110- tarballType = "zst"
111- tarball = archiver .NewTarZstd ()
112- } else if bytes .Equal (header [:len (magicXZ )], magicXZ ) {
113- tarballType = "xz"
114- tarball = archiver .NewTarXz ()
115- } else if bytes .Equal (header [:len (magicGZ )], magicGZ ) {
116- tarballType = "gz"
117- tarball = archiver .NewTarGz ()
118- } else {
139+ for tarType , info := range magics {
140+ if bytes .Equal (header [:len (info .magic )], info .magic ) {
141+ tarballType = tarType
142+ tarball = info .archiver ()
143+ break
144+ }
145+ }
146+ if tarballType == "" || tarball == nil {
119147 return nil , errors .New ("not supported compression" )
120148 }
121149 err = tarball .Open (r , 0 )
0 commit comments