123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- package vessel
- import (
- "archive/zip"
- "io"
- "net/http"
- "os"
- )
- // File implements an http.File
- type File struct {
- r io.ReadCloser
- zip *zip.File
- offset int64
- }
- // verify we implement the http.File interface
- var _ http.File = (*File)(nil)
- func newFile(z *zip.File) (*File, error) {
- r, err := z.Open()
- if err != nil {
- return nil, err
- }
- return &File{
- r: r,
- zip: z,
- }, nil
- }
- // Readdir implements http.File
- func (f *File) Readdir(count int) ([]os.FileInfo, error) {
- log.Log("read dir: %s\n", f.zip.Name)
- return nil, os.ErrPermission
- }
- // Stat implements http.File
- func (f *File) Stat() (os.FileInfo, error) {
- return f.zip.FileInfo(), nil
- }
- // Seek implements io.Seeker
- func (f *File) Seek(offset int64, whence int) (int64, error) {
- return f.offset, os.ErrInvalid
- }
- // Read implements io.Reader
- func (f *File) Read(p []byte) (n int, err error) {
- c, err := f.r.Read(p)
- if err != nil {
- f.offset += int64(c)
- }
- return c, err
- }
- // Close implements io.Closer
- func (f *File) Close() error {
- return f.r.Close()
- }
|