github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/filesystem/fsutil/fs-http-func.go (about) 1 package fsutil 2 3 import ( 4 "bytes" 5 "errors" 6 "net/http" 7 "os" 8 "time" 9 ) 10 11 func NewHTTPFuncFS(f func(name string) (http.File, error)) http.FileSystem { 12 return HTTPFuncFS(f) 13 } 14 15 type HTTPFuncFS func(name string) (http.File, error) 16 17 func (f HTTPFuncFS) Open(name string) (http.File, error) { 18 return f(name) 19 } 20 21 func NewHTTPBytesFile(name string, modTime time.Time, data []byte) *HTTPBytesFile { 22 return &HTTPBytesFile{ 23 name: name, 24 modTime: modTime, 25 Reader: bytes.NewReader(data), 26 } 27 } 28 29 type HTTPBytesFile struct { 30 *bytes.Reader 31 name string 32 modTime time.Time 33 } 34 35 func (f *HTTPBytesFile) Close() error { 36 return nil 37 } 38 39 func (f *HTTPBytesFile) Readdir(count int) ([]os.FileInfo, error) { 40 return nil, errors.New("HTTPBytesFile does not support Readdir()") 41 } 42 43 func (f *HTTPBytesFile) Stat() (os.FileInfo, error) { 44 return NewHTTPFileInfo(f.name, int64(f.Reader.Len()), os.FileMode(0644), f.modTime, nil), nil 45 } 46 47 func NewHTTPFileInfo(name string, size int64, mode os.FileMode, modTime time.Time, sys interface{}) *HTTPFileInfo { 48 return &HTTPFileInfo{ 49 name: name, 50 size: size, 51 mode: mode, 52 modTime: modTime, 53 sys: sys, 54 } 55 } 56 57 // HTTPFileInfo implements os.FileInfo 58 type HTTPFileInfo struct { 59 name string 60 size int64 61 mode os.FileMode 62 modTime time.Time 63 isDir bool 64 sys interface{} 65 } 66 67 // Name returns the base name of the file 68 func (i *HTTPFileInfo) Name() string { return i.name } 69 70 // Size returns the length in bytes 71 func (i *HTTPFileInfo) Size() int64 { return i.size } 72 73 // Mode returns file mode bits 74 func (i *HTTPFileInfo) Mode() os.FileMode { return i.mode } 75 76 // ModTime returns the modification time 77 func (i *HTTPFileInfo) ModTime() time.Time { return i.modTime } 78 79 // IsDir is an abbreviation for Mode().IsDir() 80 func (i *HTTPFileInfo) IsDir() bool { return i.mode.IsDir() } 81 82 // Sys is underlying data source (can return nil) 83 func (i *HTTPFileInfo) Sys() interface{} { return i.sys }