diff options
Diffstat (limited to 'modules/caddyhttp/fileserver')
| -rw-r--r-- | modules/caddyhttp/fileserver/caddyfile.go | 83 | ||||
| -rw-r--r-- | modules/caddyhttp/fileserver/matcher.go | 22 | ||||
| -rw-r--r-- | modules/caddyhttp/fileserver/staticfiles.go | 13 | 
3 files changed, 74 insertions, 44 deletions
| diff --git a/modules/caddyhttp/fileserver/caddyfile.go b/modules/caddyhttp/fileserver/caddyfile.go index 7d9ddd9..6fa94e7 100644 --- a/modules/caddyhttp/fileserver/caddyfile.go +++ b/modules/caddyhttp/fileserver/caddyfile.go @@ -15,59 +15,58 @@  package fileserver  import ( -	"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile" +	"encoding/json" + +	"github.com/caddyserver/caddy/modules/caddyhttp/rewrite"  	"github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" +	"github.com/caddyserver/caddy/v2/modules/caddyhttp"  ) -// UnmarshalCaddyfile sets up the handler from Caddyfile tokens. Syntax: -// -//     file_server [<matcher>] [browse] { -//         hide <files...> -//         index <files...> -//         browse [<template_file>] -//         root <path> -//     } -// -// If browse is given on the first line, it can't be used in the block also. -// The default root is the one given by the root directive. -func (fsrv *FileServer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { -	for d.Next() { -		args := d.RemainingArgs() +func init() { +	httpcaddyfile.RegisterHandlerDirective("file_server", parseCaddyfile) +	httpcaddyfile.RegisterDirective("try_files", parseTryFiles) +} + +func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { +	var fsrv FileServer + +	for h.Next() { +		args := h.RemainingArgs()  		switch len(args) {  		case 0:  		case 1:  			if args[0] != "browse" { -				return d.ArgErr() +				return nil, h.ArgErr()  			}  			fsrv.Browse = new(Browse)  		default: -			return d.ArgErr() +			return nil, h.ArgErr()  		} -		for d.NextBlock() { -			switch d.Val() { +		for h.NextBlock() { +			switch h.Val() {  			case "hide": -				fsrv.Hide = d.RemainingArgs() +				fsrv.Hide = h.RemainingArgs()  				if len(fsrv.Hide) == 0 { -					return d.ArgErr() +					return nil, h.ArgErr()  				}  			case "index": -				fsrv.IndexNames = d.RemainingArgs() +				fsrv.IndexNames = h.RemainingArgs()  				if len(fsrv.Hide) == 0 { -					return d.ArgErr() +					return nil, h.ArgErr()  				}  			case "root": -				if !d.Args(&fsrv.Root) { -					return d.ArgErr() +				if !h.Args(&fsrv.Root) { +					return nil, h.ArgErr()  				}  			case "browse":  				if fsrv.Browse != nil { -					return d.Err("browsing is already configured") +					return nil, h.Err("browsing is already configured")  				}  				fsrv.Browse = new(Browse) -				d.Args(&fsrv.Browse.TemplateFile) +				h.Args(&fsrv.Browse.TemplateFile)  			default: -				return d.Errf("unknown subdirective '%s'", d.Val()) +				return nil, h.Errf("unknown subdirective '%s'", h.Val())  			}  		}  	} @@ -77,11 +76,29 @@ func (fsrv *FileServer) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {  		fsrv.Root = "{http.var.root}"  	} -	return nil +	return &fsrv, nil  } -// Bucket returns the HTTP Caddyfile handler bucket number. -func (fsrv FileServer) Bucket() int { return 7 } +func parseTryFiles(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error) { +	if !h.Next() { +		return nil, h.ArgErr() +	} + +	try := h.RemainingArgs() +	if len(try) == 0 { +		return nil, h.ArgErr() +	} + +	handler := rewrite.Rewrite{ +		URI: "{http.matchers.file.relative}{http.request.uri.query}", +	} -// Interface guard -var _ httpcaddyfile.HandlerDirective = (*FileServer)(nil) +	matcherSet := map[string]json.RawMessage{ +		"file": h.JSON(MatchFile{ +			Root:     "{http.var.root}", +			TryFiles: try, +		}, nil), +	} + +	return h.NewRoute(matcherSet, handler), nil +} diff --git a/modules/caddyhttp/fileserver/matcher.go b/modules/caddyhttp/fileserver/matcher.go index eca0e8f..b091250 100644 --- a/modules/caddyhttp/fileserver/matcher.go +++ b/modules/caddyhttp/fileserver/matcher.go @@ -20,16 +20,13 @@ import (  	"os"  	"time" -	"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"  	"github.com/caddyserver/caddy/v2" +	"github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"  	"github.com/caddyserver/caddy/v2/modules/caddyhttp"  )  func init() { -	caddy.RegisterModule(caddy.Module{ -		Name: "http.matchers.file", -		New:  func() interface{} { return new(MatchFile) }, -	}) +	caddy.RegisterModule(MatchFile{})  }  // MatchFile is an HTTP request matcher that can match @@ -52,12 +49,20 @@ type MatchFile struct {  	TryPolicy string `json:"try_policy,omitempty"`  } +// CaddyModule returns the Caddy module information. +func (MatchFile) CaddyModule() caddy.ModuleInfo { +	return caddy.ModuleInfo{ +		Name: "http.matchers.file", +		New:  func() caddy.Module { return new(MatchFile) }, +	} +} +  // UnmarshalCaddyfile sets up the matcher from Caddyfile tokens. Syntax:  //  //     file {  //         root <path>  //         try_files <files...> -//         try_policy <first_exist|smallest_size|largest_size|most_recent_modified> +//         try_policy first_exist|smallest_size|largest_size|most_recent_modified  //     }  //  func (m *MatchFile) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { @@ -82,6 +87,9 @@ func (m *MatchFile) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {  			}  		}  	} +	if m.Root == "" { +		m.Root = "{http.var.root}" +	}  	return nil  } @@ -121,7 +129,7 @@ func (m MatchFile) Match(r *http.Request) bool {  func (m MatchFile) selectFile(r *http.Request) (rel, abs string, matched bool) {  	repl := r.Context().Value(caddy.ReplacerCtxKey).(caddy.Replacer) -	root := repl.ReplaceAll(m.Root, "") +	root := repl.ReplaceAll(m.Root, ".")  	// if list of files to try was omitted entirely,  	// assume URL path diff --git a/modules/caddyhttp/fileserver/staticfiles.go b/modules/caddyhttp/fileserver/staticfiles.go index 1b542cf..cdac453 100644 --- a/modules/caddyhttp/fileserver/staticfiles.go +++ b/modules/caddyhttp/fileserver/staticfiles.go @@ -36,10 +36,7 @@ import (  func init() {  	weakrand.Seed(time.Now().UnixNano()) -	caddy.RegisterModule(caddy.Module{ -		Name: "http.handlers.file_server", -		New:  func() interface{} { return new(FileServer) }, -	}) +	caddy.RegisterModule(FileServer{})  }  // FileServer implements a static file server responder for Caddy. @@ -50,6 +47,14 @@ type FileServer struct {  	Browse     *Browse  `json:"browse,omitempty"`  } +// CaddyModule returns the Caddy module information. +func (FileServer) CaddyModule() caddy.ModuleInfo { +	return caddy.ModuleInfo{ +		Name: "http.handlers.file_server", +		New:  func() caddy.Module { return new(FileServer) }, +	} +} +  // Provision sets up the static files responder.  func (fsrv *FileServer) Provision(ctx caddy.Context) error {  	if fsrv.IndexNames == nil { | 
