Browse Source
caddyhttp: Improve docs, and Caddyfile for respond directive
master
Matthew Holt
5 years ago
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with
23 additions and
8 deletions
-
modules/caddyhttp/matchers.go
-
modules/caddyhttp/staticresp.go
|
|
@ -35,7 +35,7 @@ import ( |
|
|
|
type ( |
|
|
|
// MatchHost matches requests by the Host value (case-insensitive).
|
|
|
|
//
|
|
|
|
// When used in an HTTP route,
|
|
|
|
// When used in a top-level HTTP route,
|
|
|
|
// [qualifying domain names](/docs/automatic-https#hostname-requirements)
|
|
|
|
// may trigger [automatic HTTPS](/docs/automatic-https), which automatically
|
|
|
|
// provisions and renews certificates for you. Before doing this, you
|
|
|
@ -55,8 +55,8 @@ type ( |
|
|
|
// - In the middle, for a globular match (`/accounts/*/info`)
|
|
|
|
//
|
|
|
|
// This matcher is fast, so it does not support regular expressions or
|
|
|
|
// capture groups. For slower but more capable matching, use the path_regexp
|
|
|
|
// matcher.
|
|
|
|
// capture groups. For slower but more powerful matching, use the
|
|
|
|
// path_regexp matcher.
|
|
|
|
MatchPath []string |
|
|
|
|
|
|
|
// MatchPathRE matches requests by a regular expression on the URI's path.
|
|
|
|
|
|
@ -54,24 +54,39 @@ func (StaticResponse) CaddyModule() caddy.ModuleInfo { |
|
|
|
|
|
|
|
// UnmarshalCaddyfile sets up the handler from Caddyfile tokens. Syntax:
|
|
|
|
//
|
|
|
|
// respond [<matcher>] <status> {
|
|
|
|
// respond [<matcher>] [<status>|[<body> [<status>]] {
|
|
|
|
// body <text>
|
|
|
|
// close
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// 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 (s *StaticResponse) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { |
|
|
|
for d.Next() { |
|
|
|
var statusCodeStr string |
|
|
|
if d.Args(&statusCodeStr) { |
|
|
|
s.StatusCode = WeakString(statusCodeStr) |
|
|
|
args := d.RemainingArgs() |
|
|
|
switch len(args) { |
|
|
|
case 1: |
|
|
|
if len(args[0]) == 3 { |
|
|
|
if num, err := strconv.Atoi(args[0]); err == nil && num > 0 { |
|
|
|
s.StatusCode = WeakString(args[0]) |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
s.Body = args[0] |
|
|
|
case 2: |
|
|
|
s.Body = args[0] |
|
|
|
s.StatusCode = WeakString(args[1]) |
|
|
|
default: |
|
|
|
return d.ArgErr() |
|
|
|
} |
|
|
|
|
|
|
|
for d.NextBlock(0) { |
|
|
|
switch d.Val() { |
|
|
|
case "body": |
|
|
|
if s.Body != "" { |
|
|
|
return d.Err("body already specified") |
|
|
|
} |
|
|
|
if !d.Args(&s.Body) { |
|
|
|
if !d.AllArgs(&s.Body) { |
|
|
|
return d.ArgErr() |
|
|
|
} |
|
|
|
case "close": |
|
|
|