Search code examples
httpgomux

GOLANG How can I load a certain html file from templates directory using http.FileServer


func main() {
    mux := http.NewServeMux()
    staticHandler := http.FileServer(http.Dir("./templates"))
    mux.Handle("/", http.StripPrefix("/", staticHandler))
    log.Fatal(http.ListenAndServe(":8080", mux))
}

I want to load a html file which is in 'templates' directory. if there are more than one files in 'templates', how can I select certain file to load?


Solution

  • You can use http.ServeFile() to build your own file server.

    See sketch below.

    Then you can intercept the served files within your custom fileHandler.ServeHTTP().

    package main
    
    import (
        "log"
        "net/http"
        "path"
        "path/filepath"
        "strings"
    )
    
    func main() {
        mux := http.NewServeMux()
    
        //staticHandler := http.FileServer(http.Dir("./templates"))
        staticHandler := fileServer("./templates")
    
        mux.Handle("/", http.StripPrefix("/", staticHandler))
        log.Printf("listening")
        log.Fatal(http.ListenAndServe(":8080", mux))
    }
    
    // returns custom file server
    func fileServer(root string) http.Handler {
        return &fileHandler{root}
    }
    
    // custom file server
    type fileHandler struct {
        root string
    }
    
    func (f *fileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        upath := r.URL.Path
        if !strings.HasPrefix(upath, "/") {
            upath = "/" + upath
            r.URL.Path = upath
        }
        name := filepath.Join(f.root, path.Clean(upath))
        log.Printf("fileHandler.ServeHTTP: path=%s", name)
        http.ServeFile(w, r, name)
    }