69 lines
1,002 B
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(),
|
|
}
|
|
}
|