committed by
GitHub
12 changed files with 592 additions and 573 deletions
@ -0,0 +1,71 @@ |
|||||
|
{ |
||||
|
debug |
||||
|
http_port 8080 |
||||
|
https_port 8443 |
||||
|
default_sni localhost |
||||
|
order root first |
||||
|
storage file_system { |
||||
|
root /data |
||||
|
} |
||||
|
acme_ca https://example.com |
||||
|
acme_ca_root /path/to/ca.crt |
||||
|
email test@example.com |
||||
|
admin off |
||||
|
on_demand_tls { |
||||
|
ask https://example.com |
||||
|
interval 30s |
||||
|
burst 20 |
||||
|
} |
||||
|
local_certs |
||||
|
key_type ed25519 |
||||
|
} |
||||
|
|
||||
|
:80 |
||||
|
---------- |
||||
|
{ |
||||
|
"admin": { |
||||
|
"disabled": true |
||||
|
}, |
||||
|
"logging": { |
||||
|
"logs": { |
||||
|
"default": { |
||||
|
"level": "DEBUG" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"storage": { |
||||
|
"module": "file_system", |
||||
|
"root": "/data" |
||||
|
}, |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"http_port": 8080, |
||||
|
"https_port": 8443, |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"tls": { |
||||
|
"automation": { |
||||
|
"policies": [ |
||||
|
{ |
||||
|
"issuer": { |
||||
|
"module": "internal" |
||||
|
} |
||||
|
} |
||||
|
], |
||||
|
"on_demand": { |
||||
|
"rate_limit": { |
||||
|
"interval": 30000000000, |
||||
|
"burst": 20 |
||||
|
}, |
||||
|
"ask": "https://example.com" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,37 @@ |
|||||
|
:80 { |
||||
|
respond /version 200 { |
||||
|
body "hello from localhost" |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"path": [ |
||||
|
"/version" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "hello from localhost", |
||||
|
"handler": "static_response", |
||||
|
"status_code": 200 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
http://a.caddy.localhost { |
||||
|
respond /version 200 { |
||||
|
body "hello from localhost" |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"host": [ |
||||
|
"a.caddy.localhost" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "subroute", |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "hello from localhost", |
||||
|
"handler": "static_response", |
||||
|
"status_code": 200 |
||||
|
} |
||||
|
], |
||||
|
"match": [ |
||||
|
{ |
||||
|
"path": [ |
||||
|
"/version" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"terminal": true |
||||
|
} |
||||
|
], |
||||
|
"automatic_https": { |
||||
|
"skip": [ |
||||
|
"a.caddy.localhost" |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
localhost:80 { |
||||
|
respond /version 200 { |
||||
|
body "hello from localhost" |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"host": [ |
||||
|
"localhost" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "subroute", |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "hello from localhost", |
||||
|
"handler": "static_response", |
||||
|
"status_code": 200 |
||||
|
} |
||||
|
], |
||||
|
"match": [ |
||||
|
{ |
||||
|
"path": [ |
||||
|
"/version" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"terminal": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,59 @@ |
|||||
|
http://a.caddy.localhost:81 { |
||||
|
respond /version 200 { |
||||
|
body "hello from localhost" |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":81" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"host": [ |
||||
|
"a.caddy.localhost" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "subroute", |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "hello from localhost", |
||||
|
"handler": "static_response", |
||||
|
"status_code": 200 |
||||
|
} |
||||
|
], |
||||
|
"match": [ |
||||
|
{ |
||||
|
"path": [ |
||||
|
"/version" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"terminal": true |
||||
|
} |
||||
|
], |
||||
|
"automatic_https": { |
||||
|
"skip": [ |
||||
|
"a.caddy.localhost" |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
a.caddy.localhost { |
||||
|
respond /version 200 { |
||||
|
body "hello from localhost" |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":443" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"host": [ |
||||
|
"a.caddy.localhost" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "subroute", |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "hello from localhost", |
||||
|
"handler": "static_response", |
||||
|
"status_code": 200 |
||||
|
} |
||||
|
], |
||||
|
"match": [ |
||||
|
{ |
||||
|
"path": [ |
||||
|
"/version" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"terminal": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
:80 |
||||
|
|
||||
|
log { |
||||
|
output file /var/log/access.log { |
||||
|
roll_size 1gb |
||||
|
roll_keep 5 |
||||
|
roll_keep_for 90d |
||||
|
} |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"logging": { |
||||
|
"logs": { |
||||
|
"default": { |
||||
|
"exclude": [ |
||||
|
"http.log.access.log0" |
||||
|
] |
||||
|
}, |
||||
|
"log0": { |
||||
|
"writer": { |
||||
|
"filename": "/var/log/access.log", |
||||
|
"output": "file", |
||||
|
"roll_keep": 5, |
||||
|
"roll_keep_days": 90, |
||||
|
"roll_size_mb": 954 |
||||
|
}, |
||||
|
"include": [ |
||||
|
"http.log.access.log0" |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"logs": { |
||||
|
"default_logger_name": "log0" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
:80 { |
||||
|
@matcher { |
||||
|
method GET |
||||
|
} |
||||
|
respond @matcher "get" |
||||
|
|
||||
|
@matcher2 method POST |
||||
|
respond @matcher2 "post" |
||||
|
|
||||
|
@matcher3 not method PUT |
||||
|
respond @matcher3 "not put" |
||||
|
} |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"method": [ |
||||
|
"GET" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "get", |
||||
|
"handler": "static_response" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"method": [ |
||||
|
"POST" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "post", |
||||
|
"handler": "static_response" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"not": [ |
||||
|
{ |
||||
|
"method": [ |
||||
|
"PUT" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "not put", |
||||
|
"handler": "static_response" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
:80 |
||||
|
|
||||
|
@test { |
||||
|
not { |
||||
|
header Abc "123" |
||||
|
header Bcd "123" |
||||
|
} |
||||
|
} |
||||
|
respond @test 403 |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"not": [ |
||||
|
{ |
||||
|
"header": { |
||||
|
"Abc": [ |
||||
|
"123" |
||||
|
], |
||||
|
"Bcd": [ |
||||
|
"123" |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "static_response", |
||||
|
"status_code": 403 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
localhost:80 |
||||
|
respond * "{header.content-type} {labels.0} {query.p} {path.0} {re.name.0}" |
||||
|
---------- |
||||
|
{ |
||||
|
"apps": { |
||||
|
"http": { |
||||
|
"servers": { |
||||
|
"srv0": { |
||||
|
"listen": [ |
||||
|
":80" |
||||
|
], |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"match": [ |
||||
|
{ |
||||
|
"host": [ |
||||
|
"localhost" |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"handler": "subroute", |
||||
|
"routes": [ |
||||
|
{ |
||||
|
"handle": [ |
||||
|
{ |
||||
|
"body": "{http.request.header.content-type} {http.request.host.labels.0} {http.request.uri.query.p} {http.request.uri.path.0} {http.regexp.name.0}", |
||||
|
"handler": "static_response" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"terminal": true |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -1,587 +1,47 @@ |
|||||
package integration |
package integration |
||||
|
|
||||
import ( |
import ( |
||||
|
"io/ioutil" |
||||
|
"regexp" |
||||
|
"strings" |
||||
"testing" |
"testing" |
||||
|
|
||||
"github.com/caddyserver/caddy/v2/caddytest" |
"github.com/caddyserver/caddy/v2/caddytest" |
||||
) |
) |
||||
|
|
||||
func TestHttpOnlyOnLocalhost(t *testing.T) { |
func TestCaddyfileAdaptToJSON(t *testing.T) { |
||||
caddytest.AssertAdapt(t, ` |
// load the list of test files from the dir
|
||||
localhost:80 { |
files, err := ioutil.ReadDir("./caddyfile_adapt") |
||||
respond /version 200 { |
if err != nil { |
||||
body "hello from localhost" |
t.Errorf("failed to read caddyfile_adapt dir: %s", err) |
||||
} |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"host": [ |
|
||||
"localhost" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "subroute", |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "hello from localhost", |
|
||||
"handler": "static_response", |
|
||||
"status_code": 200 |
|
||||
} |
|
||||
], |
|
||||
"match": [ |
|
||||
{ |
|
||||
"path": [ |
|
||||
"/version" |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"terminal": true |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
} |
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestHttpOnlyOnAnyAddress(t *testing.T) { |
// prep a regexp to fix strings on windows
|
||||
caddytest.AssertAdapt(t, ` |
winNewlines := regexp.MustCompile(`\r?\n`) |
||||
:80 { |
|
||||
respond /version 200 { |
|
||||
body "hello from localhost" |
|
||||
} |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"path": [ |
|
||||
"/version" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "hello from localhost", |
|
||||
"handler": "static_response", |
|
||||
"status_code": 200 |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestHttpsOnDomain(t *testing.T) { |
for _, f := range files { |
||||
caddytest.AssertAdapt(t, ` |
if f.IsDir() { |
||||
a.caddy.localhost { |
continue |
||||
respond /version 200 { |
|
||||
body "hello from localhost" |
|
||||
} |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":443" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"host": [ |
|
||||
"a.caddy.localhost" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "subroute", |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "hello from localhost", |
|
||||
"handler": "static_response", |
|
||||
"status_code": 200 |
|
||||
} |
|
||||
], |
|
||||
"match": [ |
|
||||
{ |
|
||||
"path": [ |
|
||||
"/version" |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"terminal": true |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
} |
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestHttpOnlyOnDomain(t *testing.T) { |
// read the test file
|
||||
caddytest.AssertAdapt(t, ` |
filename := f.Name() |
||||
http://a.caddy.localhost {
|
data, err := ioutil.ReadFile("./caddyfile_adapt/" + filename) |
||||
respond /version 200 { |
if err != nil { |
||||
body "hello from localhost" |
t.Errorf("failed to read %s dir: %s", filename, err) |
||||
} |
} |
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"host": [ |
|
||||
"a.caddy.localhost" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "subroute", |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "hello from localhost", |
|
||||
"handler": "static_response", |
|
||||
"status_code": 200 |
|
||||
} |
|
||||
], |
|
||||
"match": [ |
|
||||
{ |
|
||||
"path": [ |
|
||||
"/version" |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"terminal": true |
|
||||
} |
|
||||
], |
|
||||
"automatic_https": { |
|
||||
"skip": [ |
|
||||
"a.caddy.localhost" |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestHttpOnlyOnNonStandardPort(t *testing.T) { |
// split the Caddyfile (first) and JSON (second) parts
|
||||
caddytest.AssertAdapt(t, ` |
parts := strings.Split(string(data), "----------") |
||||
http://a.caddy.localhost:81 {
|
caddyfile, json := strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]) |
||||
respond /version 200 { |
|
||||
body "hello from localhost" |
|
||||
} |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":81" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"host": [ |
|
||||
"a.caddy.localhost" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "subroute", |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "hello from localhost", |
|
||||
"handler": "static_response", |
|
||||
"status_code": 200 |
|
||||
} |
|
||||
], |
|
||||
"match": [ |
|
||||
{ |
|
||||
"path": [ |
|
||||
"/version" |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"terminal": true |
|
||||
} |
|
||||
], |
|
||||
"automatic_https": { |
|
||||
"skip": [ |
|
||||
"a.caddy.localhost" |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestMatcherSyntax(t *testing.T) { |
|
||||
caddytest.AssertAdapt(t, ` |
|
||||
:80 { |
|
||||
@matcher { |
|
||||
method GET |
|
||||
} |
|
||||
respond @matcher "get" |
|
||||
|
|
||||
@matcher2 method POST |
// replace windows newlines in the json with unix newlines
|
||||
respond @matcher2 "post" |
json = winNewlines.ReplaceAllString(json, "\n") |
||||
|
|
||||
@matcher3 not method PUT |
|
||||
respond @matcher3 "not put" |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"method": [ |
|
||||
"GET" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "get", |
|
||||
"handler": "static_response" |
|
||||
} |
|
||||
] |
|
||||
}, |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"method": [ |
|
||||
"POST" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "post", |
|
||||
"handler": "static_response" |
|
||||
} |
|
||||
] |
|
||||
}, |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"not": [ |
|
||||
{ |
|
||||
"method": [ |
|
||||
"PUT" |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "not put", |
|
||||
"handler": "static_response" |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestNotBlockMerging(t *testing.T) { |
|
||||
caddytest.AssertAdapt(t, ` |
|
||||
:80 |
|
||||
|
|
||||
@test { |
|
||||
not { |
|
||||
header Abc "123" |
|
||||
header Bcd "123" |
|
||||
} |
|
||||
} |
|
||||
respond @test 403 |
|
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"not": [ |
|
||||
{ |
|
||||
"header": { |
|
||||
"Abc": [ |
|
||||
"123" |
|
||||
], |
|
||||
"Bcd": [ |
|
||||
"123" |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "static_response", |
|
||||
"status_code": 403 |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestGlobalOptions(t *testing.T) { |
|
||||
caddytest.AssertAdapt(t, ` |
|
||||
{ |
|
||||
debug |
|
||||
http_port 8080 |
|
||||
https_port 8443 |
|
||||
default_sni localhost |
|
||||
order root first |
|
||||
storage file_system { |
|
||||
root /data |
|
||||
} |
|
||||
acme_ca https://example.com
|
|
||||
acme_ca_root /path/to/ca.crt |
|
||||
email test@example.com |
|
||||
admin off |
|
||||
on_demand_tls { |
|
||||
ask https://example.com
|
|
||||
interval 30s |
|
||||
burst 20 |
|
||||
} |
|
||||
local_certs |
|
||||
key_type ed25519 |
|
||||
} |
|
||||
|
|
||||
:80 |
|
||||
`, "caddyfile", `{ |
|
||||
"admin": { |
|
||||
"disabled": true |
|
||||
}, |
|
||||
"logging": { |
|
||||
"logs": { |
|
||||
"default": { |
|
||||
"level": "DEBUG" |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
"storage": { |
|
||||
"module": "file_system", |
|
||||
"root": "/data" |
|
||||
}, |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"http_port": 8080, |
|
||||
"https_port": 8443, |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
"tls": { |
|
||||
"automation": { |
|
||||
"policies": [ |
|
||||
{ |
|
||||
"issuer": { |
|
||||
"module": "internal" |
|
||||
} |
|
||||
} |
|
||||
], |
|
||||
"on_demand": { |
|
||||
"rate_limit": { |
|
||||
"interval": 30000000000, |
|
||||
"burst": 20 |
|
||||
}, |
|
||||
"ask": "https://example.com" |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestLogRollDays(t *testing.T) { |
|
||||
caddytest.AssertAdapt(t, ` |
|
||||
:80 |
|
||||
|
|
||||
log { |
|
||||
output file /var/log/access.log { |
|
||||
roll_size 1gb |
|
||||
roll_keep 5 |
|
||||
roll_keep_for 90d |
|
||||
} |
|
||||
} |
|
||||
`, "caddyfile", `{ |
|
||||
"logging": { |
|
||||
"logs": { |
|
||||
"default": { |
|
||||
"exclude": [ |
|
||||
"http.log.access.log0" |
|
||||
] |
|
||||
}, |
|
||||
"log0": { |
|
||||
"writer": { |
|
||||
"filename": "/var/log/access.log", |
|
||||
"output": "file", |
|
||||
"roll_keep": 5, |
|
||||
"roll_keep_days": 90, |
|
||||
"roll_size_mb": 954 |
|
||||
}, |
|
||||
"include": [ |
|
||||
"http.log.access.log0" |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"logs": { |
|
||||
"default_logger_name": "log0" |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}`) |
|
||||
} |
|
||||
|
|
||||
func TestShorthandParameterizedPlaceholders(t *testing.T) { |
// run the test
|
||||
caddytest.AssertAdapt(t, ` |
ok := caddytest.CompareAdapt(t, caddyfile, "caddyfile", json) |
||||
localhost:80 |
if !ok { |
||||
respond * "{header.content-type} {labels.0} {query.p} {path.0} {re.name.0}" |
t.Errorf("failed to adapt %s", filename) |
||||
`, "caddyfile", `{ |
|
||||
"apps": { |
|
||||
"http": { |
|
||||
"servers": { |
|
||||
"srv0": { |
|
||||
"listen": [ |
|
||||
":80" |
|
||||
], |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"match": [ |
|
||||
{ |
|
||||
"host": [ |
|
||||
"localhost" |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"handler": "subroute", |
|
||||
"routes": [ |
|
||||
{ |
|
||||
"handle": [ |
|
||||
{ |
|
||||
"body": "{http.request.header.content-type} {http.request.host.labels.0} {http.request.uri.query.p} {http.request.uri.path.0} {http.regexp.name.0}", |
|
||||
"handler": "static_response" |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
], |
|
||||
"terminal": true |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
} |
|
||||
} |
} |
||||
} |
} |
||||
}`) |
|
||||
} |
} |
||||
|
Loading…
Reference in new issue