func serverStaticRouter(ctx *context.Context) { if ctx.Input.Method() != "GET" && ctx.Input.Method() != "HEAD" { return } forbidden, filePath, fileInfo, err := lookupFile(ctx) if err == errNotStaticRequest { return } if forbidden { exception("403", ctx) return } if filePath == "" || fileInfo == nil { if BConfig.RunMode == DEV { logs.Warn("Can't find/open the file:", filePath, err) } http.NotFound(ctx.ResponseWriter, ctx.Request) return } if fileInfo.IsDir() { requestURL := ctx.Input.URL() if requestURL[len(requestURL)-1] != '/' { redirectURL := requestURL + "/" if ctx.Request.URL.RawQuery != "" { redirectURL = redirectURL + "?" + ctx.Request.URL.RawQuery } ctx.Redirect(302, redirectURL) } else { //serveFile will list dir http.ServeFile(ctx.ResponseWriter, ctx.Request, filePath) } return } var enableCompress = BConfig.EnableGzip && isStaticCompress(filePath) var acceptEncoding string if enableCompress { acceptEncoding = context.ParseEncoding(ctx.Request) } b, n, sch, err := openFile(filePath, fileInfo, acceptEncoding) if err != nil { if BConfig.RunMode == DEV { logs.Warn("Can't compress the file:", filePath, err) } http.NotFound(ctx.ResponseWriter, ctx.Request) return } if b { ctx.Output.Header("Content-Encoding", n) } else { ctx.Output.Header("Content-Length", strconv.FormatInt(sch.size, 10)) } http.ServeContent(ctx.ResponseWriter, ctx.Request, filePath, sch.modTime, sch) return }