1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-31 23:16:22 -07:00
gochan/pkg/server/servestatic.go
2023-01-06 14:38:35 -08:00

92 lines
2.6 KiB
Go

package server
import (
"net/http"
"os"
"path"
"strings"
"github.com/gochan-org/gochan/pkg/config"
"github.com/gochan-org/gochan/pkg/gcutil"
)
func serveFile(writer http.ResponseWriter, request *http.Request) {
systemCritical := config.GetSystemCriticalConfig()
siteConfig := config.GetSiteConfig()
requestPath := request.URL.Path
if len(systemCritical.WebRoot) > 0 && systemCritical.WebRoot != "/" {
requestPath = requestPath[len(systemCritical.WebRoot):]
}
filePath := path.Join(systemCritical.DocumentRoot, requestPath)
var fileBytes []byte
results, err := os.Stat(filePath)
if err != nil {
// the requested path isn't a file or directory, 404
ServeNotFound(writer, request)
return
}
//the file exists, or there is a folder here
if results.IsDir() {
//check to see if one of the specified index pages exists
var found bool
for _, value := range siteConfig.FirstPage {
newPath := path.Join(filePath, value)
_, err := os.Stat(newPath)
if err == nil {
filePath = newPath
found = true
break
}
}
if !found {
ServeNotFound(writer, request)
return
}
}
setFileHeaders(filePath, writer)
// serve the requested file
fileBytes, _ = os.ReadFile(filePath)
gcutil.LogAccess(request).Int("status", 200).Send()
writer.Write(fileBytes)
}
// set mime type/cache headers according to the file's extension
func setFileHeaders(filename string, writer http.ResponseWriter) {
extension := strings.ToLower(path.Ext(filename))
switch extension {
case ".png":
writer.Header().Set("Content-Type", "image/png")
writer.Header().Set("Cache-Control", "max-age=86400")
case ".gif":
writer.Header().Set("Content-Type", "image/gif")
writer.Header().Set("Cache-Control", "max-age=86400")
case ".jpg":
fallthrough
case ".jpeg":
writer.Header().Set("Content-Type", "image/jpeg")
writer.Header().Set("Cache-Control", "max-age=86400")
case ".css":
writer.Header().Set("Content-Type", "text/css")
writer.Header().Set("Cache-Control", "max-age=43200")
case ".js":
writer.Header().Set("Content-Type", "text/javascript")
writer.Header().Set("Cache-Control", "max-age=43200")
case ".json":
writer.Header().Set("Content-Type", "application/json")
writer.Header().Set("Cache-Control", "max-age=5, must-revalidate")
case ".webm":
writer.Header().Set("Content-Type", "video/webm")
writer.Header().Set("Cache-Control", "max-age=86400")
case ".htm":
fallthrough
case ".html":
writer.Header().Set("Content-Type", "text/html")
writer.Header().Set("Cache-Control", "max-age=5, must-revalidate")
default:
writer.Header().Set("Content-Type", "application/octet-stream")
writer.Header().Set("Cache-Control", "max-age=86400")
}
}