mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-27 06:03:48 +03:00
ea7e4b4024
* httpcaddyfile: Add shorthands for parameterized placeholders httpcaddyfile: Now with regexp instead httpcaddyfile: Allow dashes, gofmt httpcaddyfile: Compile regexp only once httpcaddyfile: Cleanup struct httpcaddyfile: Optimize the replacers, pull out of the loop httpcaddyfile: Add `{port}` shorthand * httpcaddyfile: Switch `r.` to `re.`
587 lines
8.7 KiB
Go
587 lines
8.7 KiB
Go
package integration
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/caddyserver/caddy/v2/caddytest"
|
|
)
|
|
|
|
func TestHttpOnlyOnLocalhost(t *testing.T) {
|
|
caddytest.AssertAdapt(t, `
|
|
localhost:80 {
|
|
respond /version 200 {
|
|
body "hello from localhost"
|
|
}
|
|
}
|
|
`, "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) {
|
|
caddytest.AssertAdapt(t, `
|
|
: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) {
|
|
caddytest.AssertAdapt(t, `
|
|
a.caddy.localhost {
|
|
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) {
|
|
caddytest.AssertAdapt(t, `
|
|
http://a.caddy.localhost {
|
|
respond /version 200 {
|
|
body "hello from localhost"
|
|
}
|
|
}
|
|
`, "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) {
|
|
caddytest.AssertAdapt(t, `
|
|
http://a.caddy.localhost:81 {
|
|
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
|
|
respond @matcher2 "post"
|
|
|
|
@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) {
|
|
caddytest.AssertAdapt(t, `
|
|
localhost:80
|
|
respond * "{header.content-type} {labels.0} {query.p} {path.0} {re.name.0}"
|
|
`, "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
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}`)
|
|
}
|