package storage import ( "errors" "mime" "os" "path/filepath" "time" ) type File struct { Path string FSPath string LastModified time.Time Etag string Title string Encodings map[string]*os.File ContentType string } var ( ErrEncodingNotFound = errors.New("encoding not found") ) func NewFile(urlPath string, filename string) (*File, error) { f, err := os.Open(filename) if err != nil { return nil, err } stat, err := os.Stat(filename) if err != nil { return nil, err } file := &File{ Path: urlPath, FSPath: filename, LastModified: stat.ModTime(), Etag: "", Title: filename, Encodings: map[string]*os.File{ "identity": f, }, } file.ContentType = file.getContentType() return file, nil } func (f *File) AvailableEncodings() []string { encs := make([]string, 0, len(f.Encodings)) for enc := range f.Encodings { encs = append(encs, enc) } return encs } func (f *File) getContentType() string { ext := filepath.Ext(f.FSPath) if ext == "" { ext = ".html" } f.ContentType = mime.TypeByExtension(ext) return f.ContentType }