func serverStaticRouter(ctx *context.Context) { ctx.SetState(context.SC_STATIC_ROUTING) if ctx.Input.Method() != "GET" && ctx.Input.Method() != "HEAD" { return } requestPath := path.Clean(ctx.Input.Request.URL.Path) if RunMode == "dev" { Warn("Request path: ", requestPath) } if len(requestPath) == 0 || requestPath == "/" { return } i := 0 for prefix, staticDir := range StaticDir { if RunMode == "dev" { Warn("Static prefix: ", prefix) } /* root path's prefix is "" if len(prefix) == 0 { continue } */ if requestPath == "/favicon.ico" || requestPath == "/robots.txt" { file := path.Join(staticDir, requestPath) if utils.FileExists(file) { http.ServeFile(ctx.ResponseWriter, ctx.Request, file) return } else { i++ if i == len(StaticDir) { http.NotFound(ctx.ResponseWriter, ctx.Request) return } else { continue } } } if strings.HasPrefix(requestPath, prefix) { Warn("HasPressfix") if len(requestPath) > len(prefix) && requestPath[len(prefix)] != '/' { continue } file := path.Join(staticDir, requestPath[len(prefix):]) finfo, err := os.Stat(file) if err != nil { if RunMode == "dev" { Warn("Can't find the file:", file, err) } http.NotFound(ctx.ResponseWriter, ctx.Request) return } //if the request is dir and DirectoryIndex is false then if finfo.IsDir() { if !DirectoryIndex { exception("403", ctx) return } else if ctx.Input.Request.URL.Path[len(ctx.Input.Request.URL.Path)-1] != '/' { http.Redirect(ctx.ResponseWriter, ctx.Request, ctx.Input.Request.URL.Path+"/", 302) return } } else if strings.HasSuffix(requestPath, "/index.html") { file := path.Join(staticDir, requestPath) if utils.FileExists(file) { http.ServeFile(ctx.ResponseWriter, ctx.Request, file) return } } //This block obtained from (https://github.com/smithfox/beego) - it should probably get merged into astaxie/beego after a pull request isStaticFileToCompress := false if StaticExtensionsToGzip != nil && len(StaticExtensionsToGzip) > 0 { for _, statExtension := range StaticExtensionsToGzip { if strings.HasSuffix(strings.ToLower(file), strings.ToLower(statExtension)) { isStaticFileToCompress = true break } } } if isStaticFileToCompress { var contentEncoding string if EnableGzip { contentEncoding = getAcceptEncodingZip(ctx.Request) } memzipfile, err := openMemZipFile(file, contentEncoding) if err != nil { return } if contentEncoding == "gzip" { ctx.Output.Header("Content-Encoding", "gzip") } else if contentEncoding == "deflate" { ctx.Output.Header("Content-Encoding", "deflate") } else { ctx.Output.Header("Content-Length", strconv.FormatInt(finfo.Size(), 10)) } http.ServeContent(ctx.ResponseWriter, ctx.Request, file, finfo.ModTime(), memzipfile) } else { http.ServeFile(ctx.ResponseWriter, ctx.Request, file) } return } } }