@@ -42,11 +42,40 @@ var (
42
42
reOptDep = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?(:.*)?$` )
43
43
rePkgVer = regexp .MustCompile (`^[a-zA-Z0-9@._+-]+([<>]?=?([0-9]+:)?[a-zA-Z0-9@._+-]+)?$` )
44
44
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
+ }
48
69
)
49
70
71
+ func init () {
72
+ for _ , i := range magics {
73
+ if nLen := len (i .magic ); nLen > maxMagicLength {
74
+ maxMagicLength = nLen
75
+ }
76
+ }
77
+ }
78
+
50
79
type Package struct {
51
80
Name string `json:"name"`
52
81
Version string `json:"version"` // Includes version, release and epoch
@@ -94,7 +123,8 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
94
123
if err != nil {
95
124
return nil , err
96
125
}
97
- header := make ([]byte , 5 )
126
+
127
+ header := make ([]byte , maxMagicLength )
98
128
_ , err = r .Read (header )
99
129
if err != nil {
100
130
return nil , err
@@ -106,16 +136,14 @@ func ParsePackage(r *packages.HashedBuffer) (*Package, error) {
106
136
107
137
var tarball archiver.Reader
108
138
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 {
119
147
return nil , errors .New ("not supported compression" )
120
148
}
121
149
err = tarball .Open (r , 0 )
0 commit comments