http_file.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package vessel
  2. import (
  3. "archive/zip"
  4. "io"
  5. "net/http"
  6. "os"
  7. )
  8. // File implements an http.File
  9. type File struct {
  10. r io.ReadCloser
  11. zip *zip.File
  12. offset int64
  13. }
  14. // verify we implement the http.File interface
  15. var _ http.File = (*File)(nil)
  16. func newFile(z *zip.File) (*File, error) {
  17. r, err := z.Open()
  18. if err != nil {
  19. return nil, err
  20. }
  21. return &File{
  22. r: r,
  23. zip: z,
  24. }, nil
  25. }
  26. // Readdir implements http.File
  27. func (f *File) Readdir(count int) ([]os.FileInfo, error) {
  28. log.Log("read dir: %s\n", f.zip.Name)
  29. return nil, os.ErrPermission
  30. }
  31. // Stat implements http.File
  32. func (f *File) Stat() (os.FileInfo, error) {
  33. return f.zip.FileInfo(), nil
  34. }
  35. // Seek implements io.Seeker
  36. func (f *File) Seek(offset int64, whence int) (int64, error) {
  37. return f.offset, os.ErrInvalid
  38. }
  39. // Read implements io.Reader
  40. func (f *File) Read(p []byte) (n int, err error) {
  41. c, err := f.r.Read(p)
  42. if err != nil {
  43. f.offset += int64(c)
  44. }
  45. return c, err
  46. }
  47. // Close implements io.Closer
  48. func (f *File) Close() error {
  49. return f.r.Close()
  50. }