zip.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package decoder
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "path"
  6. )
  7. type ZipPluginDecoder struct {
  8. PluginDecoder
  9. reader *zip.Reader
  10. err error
  11. }
  12. func NewZipPluginDecoder(binary []byte) (*ZipPluginDecoder, error) {
  13. reader, err := zip.NewReader(bytes.NewReader(binary), int64(len(binary)))
  14. decoder := &ZipPluginDecoder{
  15. reader: reader,
  16. err: err,
  17. }
  18. err = decoder.Open()
  19. if err != nil {
  20. return nil, err
  21. }
  22. return decoder, nil
  23. }
  24. func (z *ZipPluginDecoder) Open() error {
  25. if z.reader == nil {
  26. return z.err
  27. }
  28. return nil
  29. }
  30. func (z *ZipPluginDecoder) Walk(fn func(filename string, dir string) error) error {
  31. if z.reader == nil {
  32. return z.err
  33. }
  34. for _, file := range z.reader.File {
  35. // split the path into directory and filename
  36. dir, filename := path.Split(file.Name)
  37. if err := fn(filename, dir); err != nil {
  38. return err
  39. }
  40. }
  41. return nil
  42. }
  43. func (z *ZipPluginDecoder) Close() error {
  44. return nil
  45. }
  46. func (z *ZipPluginDecoder) ReadFile(filename string) ([]byte, error) {
  47. if z.reader == nil {
  48. return nil, z.err
  49. }
  50. file, err := z.reader.Open(filename)
  51. if err != nil {
  52. return nil, err
  53. }
  54. defer file.Close()
  55. data := new(bytes.Buffer)
  56. _, err = data.ReadFrom(file)
  57. if err != nil {
  58. return nil, err
  59. }
  60. return data.Bytes(), nil
  61. }