summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/caddyhttp/staticerror.go50
1 files changed, 49 insertions, 1 deletions
diff --git a/modules/caddyhttp/staticerror.go b/modules/caddyhttp/staticerror.go
index d2d255e..914e6c1 100644
--- a/modules/caddyhttp/staticerror.go
+++ b/modules/caddyhttp/staticerror.go
@@ -20,6 +20,7 @@ import (
"strconv"
"github.com/caddyserver/caddy/v2"
+ "github.com/caddyserver/caddy/v2/caddyconfig/caddyfile"
)
func init() {
@@ -50,6 +51,50 @@ func (StaticError) CaddyModule() caddy.ModuleInfo {
}
}
+// UnmarshalCaddyfile sets up the handler from Caddyfile tokens. Syntax:
+//
+// error [<matcher>] <status>|<message> [<status>] {
+// message <text>
+// }
+//
+// If there is just one argument (other than the matcher), it is considered
+// to be a status code if it's a valid positive integer of 3 digits.
+func (e *StaticError) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
+ for d.Next() {
+ args := d.RemainingArgs()
+ switch len(args) {
+ case 1:
+ if len(args[0]) == 3 {
+ if num, err := strconv.Atoi(args[0]); err == nil && num > 0 {
+ e.StatusCode = WeakString(args[0])
+ break
+ }
+ }
+ e.Error = args[0]
+ case 2:
+ e.Error = args[0]
+ e.StatusCode = WeakString(args[1])
+ default:
+ return d.ArgErr()
+ }
+
+ for d.NextBlock(0) {
+ switch d.Val() {
+ case "message":
+ if e.Error != "" {
+ return d.Err("message already specified")
+ }
+ if !d.AllArgs(&e.Error) {
+ return d.ArgErr()
+ }
+ default:
+ return d.Errf("unrecognized subdirective '%s'", d.Val())
+ }
+ }
+ }
+ return nil
+}
+
func (e StaticError) ServeHTTP(w http.ResponseWriter, r *http.Request, _ Handler) error {
repl := r.Context().Value(caddy.ReplacerCtxKey).(*caddy.Replacer)
@@ -66,4 +111,7 @@ func (e StaticError) ServeHTTP(w http.ResponseWriter, r *http.Request, _ Handler
}
// Interface guard
-var _ MiddlewareHandler = (*StaticError)(nil)
+var (
+ _ MiddlewareHandler = (*StaticError)(nil)
+ _ caddyfile.Unmarshaler = (*StaticError)(nil)
+)