2017-10-31 3 views
2

내가 http.FileServer가 설정 한 Last-Modified -header를 대체하기 위해 노력하고있어,하지만 내가 제공하기 위해 노력하고있어 파일의 Last-Modified - 시간에 돌아갑니다 :재정 마지막으로 수정 헤더 http.FileServer

var myTime time.Time 

func main() { 
    myTime = time.Now()   

    fs := http.StripPrefix("/folder/", SetCacheHeader(http.FileServer(http.Dir("/folder/")))) 
    http.Handle("/folder/", fs) 
    http.ListenAndServe(":80", nil) 
} 

SetCacheHeader -handler는 :

func SetCacheHeader(h http.Handler) http.Handler { 
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     w.Header().Set("Last-Modified", myTime.Format(http.TimeFormat)) 
     h.ServeHTTP(w, r) 
    }) 
} 

답변

4

http.FileServer()에 의해 반환되는 핸들러는 무조건 http.serveFile()http.serveContent() 안 export FUNC의 "Last-Modified" 헤더를 설정 파일 서버 핸들러를 호출하기 전에 설정 한 내용이 덮어 쓰기됩니다. 이것에 관해서는 정말로 아무것도 할 수 없습니다. 물론 당신이 마지막으로 수정 된 시간을 통과 할 수

func ServeContent(w ResponseWriter, req *Request, name string, 
    modtime time.Time, content io.ReadSeeker) 

는 사용할 수 있지만 : 사용자 정의 - 마지막으로 수정 된 시간을 가진 파일의 콘텐츠를 제공해야하는 경우

, 당신은 http.ServeContent() 사용할 수 있습니다 http.FileServer()에서 제공하는 모든 편리한 기능을 잃게됩니다.

당신이 http.FileServer()를 계속 사용하려면 또 다른 옵션은 http.Dir 유형을 사용하지만, 당신은 당신이 원하는 마지막으로 수정 된 타임 스탬프를보고 할 수있는 당신이 http.FileServer()에 전달 자신의 http.FileSystem 구현을 만들 수 없습니다하는 것입니다.

이 다음과 같은 인터페이스를 구현해야하는 것 :

type FileSystem interface { 
     Open(name string) (File, error) 
} 

그래서 당신은 그것의 이름으로 파일을 열고, http.File를 구현하는 값을 반환하는 방법이 필요하다 :

type File interface { 
     io.Closer 
     io.Reader 
     io.Seeker 
     Readdir(count int) ([]os.FileInfo, error) 
     Stat() (os.FileInfo, error) 
} 

반환하는 값()은 Stat() (os.FileInfo, error) 메서드 구현을 가질 수 있습니다. os.FileInfo 반환 값에 마지막으로 수정 한 시간이 포함됩니다. Stat()의 fileinfo가 반환 한 타임 스탬프와 일치하는 사용자 정의 마지막 수정 시간 소인을 반환하려면 Readdir() 메서드도 구현해야합니다.

관련 문제