mirror of
https://github.com/datarhei/core.git
synced 2025-09-27 04:16:25 +08:00
95 lines
1.8 KiB
Go
95 lines
1.8 KiB
Go
// mime-type middleware
|
|
package mime
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/labstack/echo/v4/middleware"
|
|
)
|
|
|
|
// Config defines the config for Mime middleware.
|
|
type Config struct {
|
|
// Skipper defines a function to skip middleware.
|
|
Skipper middleware.Skipper
|
|
|
|
MimeTypesFile string
|
|
DefaultContentType string
|
|
}
|
|
|
|
// DefaultConfig is the default Gzip middleware config.
|
|
var DefaultConfig = Config{
|
|
Skipper: middleware.DefaultSkipper,
|
|
MimeTypesFile: "",
|
|
DefaultContentType: "application/data",
|
|
}
|
|
|
|
func New() echo.MiddlewareFunc {
|
|
return NewWithConfig(DefaultConfig)
|
|
}
|
|
|
|
func NewWithConfig(config Config) echo.MiddlewareFunc {
|
|
if config.Skipper == nil {
|
|
config.Skipper = DefaultConfig.Skipper
|
|
}
|
|
|
|
mimeTypes := loadMimeFile(config.MimeTypesFile)
|
|
|
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
|
return func(c echo.Context) error {
|
|
if config.Skipper(c) {
|
|
return next(c)
|
|
}
|
|
|
|
ext := filepath.Ext(c.Request().URL.Path)
|
|
mimeType := mimeTypes[ext]
|
|
|
|
if mimeType == "" {
|
|
mimeType = config.DefaultContentType
|
|
}
|
|
|
|
if mimeType != "" {
|
|
c.Response().Header().Set(echo.HeaderContentType, mimeType)
|
|
}
|
|
|
|
return next(c)
|
|
}
|
|
}
|
|
}
|
|
|
|
func loadMimeFile(filename string) map[string]string {
|
|
mimeTypes := make(map[string]string)
|
|
|
|
f, err := os.Open(filename)
|
|
if err != nil {
|
|
return mimeTypes
|
|
}
|
|
defer f.Close()
|
|
|
|
scanner := bufio.NewScanner(f)
|
|
for scanner.Scan() {
|
|
fields := strings.Fields(scanner.Text())
|
|
if len(fields) <= 1 || fields[0][0] == '#' {
|
|
continue
|
|
}
|
|
mimeType := fields[0]
|
|
|
|
for _, ext := range fields[1:] {
|
|
if ext[0] == '#' {
|
|
break
|
|
}
|
|
|
|
mimeTypes[ext] = mimeType
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
return mimeTypes
|
|
}
|
|
|
|
return mimeTypes
|
|
}
|