package swampfile import ( "io" "path" "path/filepath" "strings" "time" ) type SwampOutFile interface { Path() string Size() int64 Modified() time.Time io.Reader io.Seeker io.Closer } type SwampInFile interface { Path() string Size() int64 Modified() time.Time io.Writer io.Seeker io.Closer } type FileReference struct { Path string UserAgent string } type DeletedSwampFile struct { Path string Size int64 } func (fr *FileReference) Clean(strict bool) (*FileReference, error) { c := filepath.FromSlash(path.Clean("/" + strings.Trim(fr.Path, "/"))) if c != fr.Path && strict { return nil, ErrUnacceptablePath } n := FileReference { c, fr.UserAgent, } return &n, nil }