Browse Source
caddyhttp: Fix redir html status code, improve flow (#3987)
* Fix html redir code, improve flow
* Fix integer check error and add tests
master
Tyler Kropp
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
138 additions and
6 deletions
-
caddyconfig/httpcaddyfile/builtins.go
-
caddyconfig/httpcaddyfile/builtins_test.go
|
|
@ -22,6 +22,7 @@ import ( |
|
|
|
"io/ioutil" |
|
|
|
"net/http" |
|
|
|
"reflect" |
|
|
|
"strconv" |
|
|
|
"strings" |
|
|
|
|
|
|
|
"github.com/caddyserver/caddy/v2" |
|
|
@ -462,14 +463,14 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { |
|
|
|
if h.NextArg() { |
|
|
|
code = h.Val() |
|
|
|
} |
|
|
|
if code == "permanent" { |
|
|
|
|
|
|
|
var body string |
|
|
|
switch code { |
|
|
|
case "permanent": |
|
|
|
code = "301" |
|
|
|
} |
|
|
|
if code == "temporary" || code == "" { |
|
|
|
case "temporary", "": |
|
|
|
code = "302" |
|
|
|
} |
|
|
|
var body string |
|
|
|
if code == "html" { |
|
|
|
case "html": |
|
|
|
// Script tag comes first since that will better imitate a redirect in the browser's
|
|
|
|
// history, but the meta tag is a fallback for most non-JS clients.
|
|
|
|
const metaRedir = `<!DOCTYPE html> |
|
|
@ -484,6 +485,15 @@ func parseRedir(h Helper) (caddyhttp.MiddlewareHandler, error) { |
|
|
|
` |
|
|
|
safeTo := html.EscapeString(to) |
|
|
|
body = fmt.Sprintf(metaRedir, safeTo, safeTo, safeTo, safeTo) |
|
|
|
code = "302" |
|
|
|
default: |
|
|
|
codeInt, err := strconv.Atoi(code) |
|
|
|
if err != nil { |
|
|
|
return nil, h.Errf("Not a supported redir code type or not valid integer: '%s'", code) |
|
|
|
} |
|
|
|
if codeInt < 300 || codeInt > 399 { |
|
|
|
return nil, h.Errf("Redir code not in the 3xx range: '%v'", codeInt) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return caddyhttp.StaticResponse{ |
|
|
|
|
|
@ -51,3 +51,125 @@ func TestLogDirectiveSyntax(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func TestRedirDirectiveSyntax(t *testing.T) { |
|
|
|
for i, tc := range []struct { |
|
|
|
input string |
|
|
|
expectError bool |
|
|
|
}{ |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir :8081 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /api/* :8081 300 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir :8081 300 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /api/* :8081 399 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir :8081 399 |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /old.html /new.html |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /old.html /new.html temporary |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir https://example.com{uri} permanent
|
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /old.html /new.html permanent |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /old.html /new.html html |
|
|
|
}`, |
|
|
|
expectError: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir /old.html /new.html htlm |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 200 |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 400 |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 temp |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 perm |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
input: `:8080 { |
|
|
|
redir * :8081 php |
|
|
|
}`, |
|
|
|
expectError: true, |
|
|
|
}, |
|
|
|
} { |
|
|
|
|
|
|
|
adapter := caddyfile.Adapter{ |
|
|
|
ServerType: ServerType{}, |
|
|
|
} |
|
|
|
|
|
|
|
_, _, err := adapter.Adapt([]byte(tc.input), nil) |
|
|
|
|
|
|
|
if err != nil != tc.expectError { |
|
|
|
t.Errorf("Test %d error expectation failed Expected: %v, got %s", i, tc.expectError, err) |
|
|
|
continue |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|