summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/labstack/echo/middleware/static.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/labstack/echo/middleware/static.go')
-rw-r--r--vendor/github.com/labstack/echo/middleware/static.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/vendor/github.com/labstack/echo/middleware/static.go b/vendor/github.com/labstack/echo/middleware/static.go
new file mode 100644
index 00000000..793c1445
--- /dev/null
+++ b/vendor/github.com/labstack/echo/middleware/static.go
@@ -0,0 +1,118 @@
+package middleware
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/labstack/echo"
+)
+
+type (
+ // StaticConfig defines the config for Static middleware.
+ StaticConfig struct {
+ // Skipper defines a function to skip middleware.
+ Skipper Skipper
+
+ // Root directory from where the static content is served.
+ // Required.
+ Root string `json:"root"`
+
+ // Index file for serving a directory.
+ // Optional. Default value "index.html".
+ Index string `json:"index"`
+
+ // Enable HTML5 mode by forwarding all not-found requests to root so that
+ // SPA (single-page application) can handle the routing.
+ // Optional. Default value false.
+ HTML5 bool `json:"html5"`
+
+ // Enable directory browsing.
+ // Optional. Default value false.
+ Browse bool `json:"browse"`
+ }
+)
+
+var (
+ // DefaultStaticConfig is the default Static middleware config.
+ DefaultStaticConfig = StaticConfig{
+ Skipper: DefaultSkipper,
+ Index: "index.html",
+ }
+)
+
+// Static returns a Static middleware to serves static content from the provided
+// root directory.
+func Static(root string) echo.MiddlewareFunc {
+ c := DefaultStaticConfig
+ c.Root = root
+ return StaticWithConfig(c)
+}
+
+// StaticWithConfig returns a Static middleware with config.
+// See `Static()`.
+func StaticWithConfig(config StaticConfig) echo.MiddlewareFunc {
+ // Defaults
+ if config.Skipper == nil {
+ config.Skipper = DefaultStaticConfig.Skipper
+ }
+ if config.Index == "" {
+ config.Index = DefaultStaticConfig.Index
+ }
+
+ return func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ p := c.Param("*")
+ name := filepath.Join(config.Root, p)
+ fi, err := os.Stat(name)
+
+ if err != nil {
+ if os.IsNotExist(err) {
+ if config.HTML5 {
+ return c.File(filepath.Join(config.Root, config.Index))
+ }
+ return echo.ErrNotFound
+ }
+ return err
+ }
+
+ if fi.IsDir() {
+ if config.Browse {
+ return listDir(name, c.Response())
+ }
+ return c.File(filepath.Join(name, config.Index))
+ }
+ return c.File(name)
+ }
+ }
+}
+
+func listDir(name string, res *echo.Response) error {
+ dir, err := os.Open(name)
+ if err != nil {
+ return err
+ }
+ dirs, err := dir.Readdir(-1)
+ if err != nil {
+ return err
+ }
+
+ // Create a directory index
+ res.Header().Set(echo.HeaderContentType, echo.MIMETextHTMLCharsetUTF8)
+ if _, err = fmt.Fprintf(res, "<pre>\n"); err != nil {
+ return err
+ }
+ for _, d := range dirs {
+ name := d.Name()
+ color := "#212121"
+ if d.IsDir() {
+ color = "#e91e63"
+ name += "/"
+ }
+ if _, err = fmt.Fprintf(res, "<a href=\"%s\" style=\"color: %s;\">%s</a>\n", name, color, name); err != nil {
+ return err
+ }
+ }
+ _, err = fmt.Fprintf(res, "</pre>\n")
+ return err
+}