package httputils import ( "io" "os" "time" ) type Stream interface { io.Reader io.Closer } type SeekableStream interface { Stream io.Seeker } type DefinedStream interface { SeekableStream Size() int64 ModTime() time.Time } type FileStream struct { file *os.File size int64 modTime time.Time } const modTimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" func (fs *FileStream) Read(p []byte) (n int, err error) { return fs.file.Read(p) } func (fs *FileStream) Seek(offset int64, whence int) (int64, error) { return fs.file.Seek(offset, whence) } func (fs *FileStream) Close() error { return fs.file.Close() } func (fs *FileStream) Size() int64 { return fs.size } func (fs *FileStream) ModTime() time.Time { return fs.modTime } func NewStreamFromFile(file *os.File) DefinedStream { if file == nil { return nil } fstat, err := file.Stat() if err != nil { return nil } return &FileStream{ file: file, size: fstat.Size(), modTime: fstat.ModTime(), } }