MakyuuIchaival/httputils/fileserver.go

69 lines
1,002 B
Go

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(),
}
}