mirror of
https://github.com/caddyserver/caddy.git
synced 2026-04-26 10:49:51 -04:00
Some checks failed
Tests / test (./cmd/caddy/caddy, ~1.26.0, ubuntu-latest, 0, 1.26, linux) (push) Failing after 15m2s
Tests / test (s390x on IBM Z) (push) Has been skipped
Tests / goreleaser-check (push) Has been skipped
Cross-Build / build (~1.26.0, 1.26, aix) (push) Failing after 11m36s
Cross-Build / build (~1.26.0, 1.26, darwin) (push) Successful in 1m32s
Cross-Build / build (~1.26.0, 1.26, dragonfly) (push) Failing after 2m3s
Cross-Build / build (~1.26.0, 1.26, freebsd) (push) Failing after 2m2s
Cross-Build / build (~1.26.0, 1.26, illumos) (push) Failing after 11m12s
Cross-Build / build (~1.26.0, 1.26, linux) (push) Successful in 6m45s
Cross-Build / build (~1.26.0, 1.26, netbsd) (push) Failing after 2m3s
Cross-Build / build (~1.26.0, 1.26, openbsd) (push) Successful in 1m57s
Cross-Build / build (~1.26.0, 1.26, solaris) (push) Failing after 56s
Cross-Build / build (~1.26.0, 1.26, windows) (push) Failing after 51s
Lint / lint (ubuntu-latest, linux) (push) Failing after 1m24s
Lint / govulncheck (push) Failing after 1m51s
Lint / dependency-review (push) Failing after 3m55s
OpenSSF Scorecard supply-chain security / Scorecard analysis (push) Failing after 20s
Tests / test (./cmd/caddy/caddy, ~1.26.0, macos-14, 0, 1.26, mac) (push) Has been cancelled
Tests / test (./cmd/caddy/caddy.exe, ~1.26.0, windows-latest, True, 1.26, windows) (push) Has been cancelled
Lint / lint (macos-14, mac) (push) Has been cancelled
Lint / lint (windows-latest, windows) (push) Has been cancelled
148 lines
3.7 KiB
Plaintext
148 lines
3.7 KiB
Plaintext
:8884
|
|
|
|
reverse_proxy 127.0.0.1:65535 {
|
|
lb_retries 5
|
|
|
|
# request matchers (backward-compatible, non-expression)
|
|
lb_retry_match {
|
|
method POST PUT
|
|
}
|
|
lb_retry_match {
|
|
path /foo*
|
|
}
|
|
lb_retry_match {
|
|
header X-Idempotency-Key *
|
|
}
|
|
|
|
# response status code via expression
|
|
lb_retry_match {
|
|
expression `{rp.status_code} in [502, 503, 504]`
|
|
}
|
|
|
|
# response header via expression
|
|
lb_retry_match {
|
|
expression `{rp.header.X-Retry} == "true"`
|
|
}
|
|
|
|
# CEL request functions combined with response placeholders
|
|
lb_retry_match {
|
|
expression `method('POST') && {rp.status_code} >= 500`
|
|
}
|
|
lb_retry_match {
|
|
expression `path('/api*') && {rp.status_code} in [502, 503]`
|
|
}
|
|
lb_retry_match {
|
|
expression `host('example.com') && {rp.status_code} == 503`
|
|
}
|
|
lb_retry_match {
|
|
expression `query({'retry': 'true'}) && {rp.status_code} >= 500`
|
|
}
|
|
lb_retry_match {
|
|
expression `header({'X-Idempotency-Key': '*'}) && {rp.status_code} in [502, 503]`
|
|
}
|
|
lb_retry_match {
|
|
expression `protocol('https') && {rp.status_code} == 502`
|
|
}
|
|
lb_retry_match {
|
|
expression `path_regexp('^/api/v[0-9]+/') && {rp.status_code} >= 500`
|
|
}
|
|
lb_retry_match {
|
|
expression `header_regexp('Content-Type', '^application/json') && {rp.status_code} == 502`
|
|
}
|
|
|
|
# transport error handling via placeholder
|
|
lb_retry_match {
|
|
expression `{rp.is_transport_error} || {rp.status_code} in [502, 503]`
|
|
}
|
|
lb_retry_match {
|
|
expression `{rp.is_transport_error} && method('POST')`
|
|
}
|
|
}
|
|
----------
|
|
{
|
|
"apps": {
|
|
"http": {
|
|
"servers": {
|
|
"srv0": {
|
|
"listen": [
|
|
":8884"
|
|
],
|
|
"routes": [
|
|
{
|
|
"handle": [
|
|
{
|
|
"handler": "reverse_proxy",
|
|
"load_balancing": {
|
|
"retries": 5,
|
|
"retry_match": [
|
|
{
|
|
"method": [
|
|
"POST",
|
|
"PUT"
|
|
]
|
|
},
|
|
{
|
|
"path": [
|
|
"/foo*"
|
|
]
|
|
},
|
|
{
|
|
"header": {
|
|
"X-Idempotency-Key": [
|
|
"*"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"expression": "{http.reverse_proxy.status_code} in [502, 503, 504]"
|
|
},
|
|
{
|
|
"expression": "{http.reverse_proxy.header.X-Retry} == \"true\""
|
|
},
|
|
{
|
|
"expression": "method('POST') \u0026\u0026 {http.reverse_proxy.status_code} \u003e= 500"
|
|
},
|
|
{
|
|
"expression": "path('/api*') \u0026\u0026 {http.reverse_proxy.status_code} in [502, 503]"
|
|
},
|
|
{
|
|
"expression": "host('example.com') \u0026\u0026 {http.reverse_proxy.status_code} == 503"
|
|
},
|
|
{
|
|
"expression": "query({'retry': 'true'}) \u0026\u0026 {http.reverse_proxy.status_code} \u003e= 500"
|
|
},
|
|
{
|
|
"expression": "header({'X-Idempotency-Key': '*'}) \u0026\u0026 {http.reverse_proxy.status_code} in [502, 503]"
|
|
},
|
|
{
|
|
"expression": "protocol('https') \u0026\u0026 {http.reverse_proxy.status_code} == 502"
|
|
},
|
|
{
|
|
"expression": "path_regexp('^/api/v[0-9]+/') \u0026\u0026 {http.reverse_proxy.status_code} \u003e= 500"
|
|
},
|
|
{
|
|
"expression": "header_regexp('Content-Type', '^application/json') \u0026\u0026 {http.reverse_proxy.status_code} == 502"
|
|
},
|
|
{
|
|
"expression": "{http.reverse_proxy.is_transport_error} || {http.reverse_proxy.status_code} in [502, 503]"
|
|
},
|
|
{
|
|
"expression": "{http.reverse_proxy.is_transport_error} \u0026\u0026 method('POST')"
|
|
}
|
|
]
|
|
},
|
|
"upstreams": [
|
|
{
|
|
"dial": "127.0.0.1:65535"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|