package filemanager import ( "fmt" "io/ioutil" "net/http" "text/template" "github.com/mholt/caddy" "github.com/mholt/caddy/caddyhttp/httpserver" ) func init() { caddy.RegisterPlugin("filemanager", caddy.Plugin{ ServerType: "http", Action: setup, }) } // setup configures a new Browse middleware instance. func setup(c *caddy.Controller) error { // Second argument would be the template file to use tplBytes, err := Asset("templates/template.tmpl") if err != nil { return err } tplText := string(tplBytes) // Build the template tpl, err := template.New("listing").Parse(tplText) if err != nil { return err } Template = tpl configs, err := fileManagerParse(c) if err != nil { return err } f := FileManager{ Configs: configs, IgnoreIndexes: false, } httpserver.GetConfig(c.Key).AddMiddleware(func(next httpserver.Handler) httpserver.Handler { f.Next = next return f }) return nil } func fileManagerParse(c *caddy.Controller) ([]Config, error) { var configs []Config appendCfg := func(fmc Config) error { for _, c := range configs { if c.PathScope == fmc.PathScope { return fmt.Errorf("duplicate file managing config for %s", c.PathScope) } } configs = append(configs, fmc) return nil } for c.Next() { var fmc = Config{ PathScope: ".", BaseURL: "/", StyleSheet: "", } for c.NextBlock() { switch c.Val() { case "show": if !c.NextArg() { return configs, c.ArgErr() } fmc.PathScope = c.Val() case "on": if !c.NextArg() { return configs, c.ArgErr() } fmc.BaseURL = c.Val() case "styles": if !c.NextArg() { return configs, c.ArgErr() } tplBytes, err := ioutil.ReadFile(c.Val()) if err != nil { return configs, err } fmc.StyleSheet = string(tplBytes) } } fmc.Root = http.Dir(fmc.PathScope) // Save configuration err := appendCfg(fmc) if err != nil { return configs, err } } return configs, nil }