Merge branch v2.11 into v3.2

This commit is contained in:
kevinpollet 2024-11-12 16:24:22 +01:00
commit b7b4dd9554
No known key found for this signature in database
GPG key ID: 0C9A5DDD1B292453
43 changed files with 1094 additions and 789 deletions

View file

@ -7,7 +7,7 @@ on:
env: env:
GO_VERSION: '1.23' GO_VERSION: '1.23'
GOLANGCI_LINT_VERSION: v1.61.0 GOLANGCI_LINT_VERSION: v1.62.0
MISSPELL_VERSION: v0.6.0 MISSPELL_VERSION: v0.6.0
jobs: jobs:

View file

@ -162,8 +162,6 @@ linters-settings:
linters: linters:
enable-all: true enable-all: true
disable: disable:
- execinquery # deprecated
- gomnd # deprecated
- sqlclosecheck # not relevant (SQL) - sqlclosecheck # not relevant (SQL)
- rowserrcheck # not relevant (SQL) - rowserrcheck # not relevant (SQL)
- cyclop # duplicate of gocyclo - cyclop # duplicate of gocyclo
@ -286,4 +284,18 @@ issues:
- path: pkg/types/metrics.go - path: pkg/types/metrics.go
linters: linters:
- goconst - goconst
- path: pkg/tls/certificate.go
text: 'the methods of "Certificates" use pointer receiver and non-pointer receiver.'
linters:
- recvcheck
- path: pkg/plugins/middlewarewasm.go
text: 'the methods of "wasmMiddlewareBuilder" use pointer receiver and non-pointer receiver.'
linters:
- recvcheck
output:
show-stats: true
sort-results: true
sort-order:
- linter
- file

View file

@ -25,7 +25,7 @@ global_job_config:
- export "PATH=${GOPATH}/bin:${PATH}" - export "PATH=${GOPATH}/bin:${PATH}"
- mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin" - mkdir -vp "${SEMAPHORE_GIT_DIR}" "${GOPATH}/bin"
- export GOPROXY=https://proxy.golang.org,direct - export GOPROXY=https://proxy.golang.org,direct
- curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.61.0 - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b "${GOPATH}/bin" v1.62.0
- curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin" - curl -sSfL https://gist.githubusercontent.com/traefiker/6d7ac019c11d011e4f131bb2cca8900e/raw/goreleaser.sh | bash -s -- -b "${GOPATH}/bin"
- checkout - checkout
- cache restore traefik-$(checksum go.sum) - cache restore traefik-$(checksum go.sum)

View file

@ -189,11 +189,11 @@ func setupServer(staticConfiguration *static.Configuration) (*server.Server, err
return nil, err return nil, err
} }
acmeProviders := initACMEProvider(staticConfiguration, &providerAggregator, tlsManager, httpChallengeProvider, tlsChallengeProvider) acmeProviders := initACMEProvider(staticConfiguration, providerAggregator, tlsManager, httpChallengeProvider, tlsChallengeProvider)
// Tailscale // Tailscale
tsProviders := initTailscaleProviders(staticConfiguration, &providerAggregator) tsProviders := initTailscaleProviders(staticConfiguration, providerAggregator)
// Observability // Observability

View file

@ -322,11 +322,11 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [ArvanCloud](https://www.arvancloud.ir/en) | `arvancloud` | `ARVANCLOUD_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/arvancloud) | | [ArvanCloud](https://www.arvancloud.ir/en) | `arvancloud` | `ARVANCLOUD_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/arvancloud) |
| [Auroradns](https://www.pcextreme.com/dns-health-checks) | `auroradns` | `AURORA_USER_ID`, `AURORA_KEY`, `AURORA_ENDPOINT` | [Additional configuration](https://go-acme.github.io/lego/dns/auroradns) | | [Auroradns](https://www.pcextreme.com/dns-health-checks) | `auroradns` | `AURORA_USER_ID`, `AURORA_KEY`, `AURORA_ENDPOINT` | [Additional configuration](https://go-acme.github.io/lego/dns/auroradns) |
| [Autodns](https://www.internetx.com/domains/autodns/) | `autodns` | `AUTODNS_API_USER`, `AUTODNS_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/autodns) | | [Autodns](https://www.internetx.com/domains/autodns/) | `autodns` | `AUTODNS_API_USER`, `AUTODNS_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/autodns) |
| [Azure](https://azure.microsoft.com/services/dns/) (DEPRECATED) | `azure` | `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_SUBSCRIPTION_ID`, `AZURE_TENANT_ID`, `AZURE_RESOURCE_GROUP`, `[AZURE_METADATA_ENDPOINT]` | [Additional configuration](https://go-acme.github.io/lego/dns/azure) | | [Azure](https://azure.microsoft.com/services/dns/) (DEPRECATED) | `azure` | `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_SUBSCRIPTION_ID`, `AZURE_TENANT_ID`, `AZURE_RESOURCE_GROUP`, `[AZURE_METADATA_ENDPOINT]` | [Additional configuration](https://go-acme.github.io/lego/dns/azure) |
| [AzureDNS](https://azure.microsoft.com/services/dns/) | `azuredns` | `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`, `AZURE_SUBSCRIPTION_ID`, `AZURE_RESOURCE_GROUP`, `[AZURE_ENVIRONMENT]`, `[AZURE_PRIVATE_ZONE]`, `[AZURE_ZONE_NAME]` | [Additional configuration](https://go-acme.github.io/lego/dns/azuredns) | | [AzureDNS](https://azure.microsoft.com/services/dns/) | `azuredns` | `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`, `AZURE_SUBSCRIPTION_ID`, `AZURE_RESOURCE_GROUP`, `[AZURE_ENVIRONMENT]`, `[AZURE_PRIVATE_ZONE]`, `[AZURE_ZONE_NAME]` | [Additional configuration](https://go-acme.github.io/lego/dns/azuredns) |
| [Bindman](https://github.com/labbsr0x/bindman-dns-webhook) | `bindman` | `BINDMAN_MANAGER_ADDRESS` | [Additional configuration](https://go-acme.github.io/lego/dns/bindman) | | [Bindman](https://github.com/labbsr0x/bindman-dns-webhook) | `bindman` | `BINDMAN_MANAGER_ADDRESS` | [Additional configuration](https://go-acme.github.io/lego/dns/bindman) |
| [Blue Cat](https://www.bluecatnetworks.com/) | `bluecat` | `BLUECAT_SERVER_URL`, `BLUECAT_USER_NAME`, `BLUECAT_PASSWORD`, `BLUECAT_CONFIG_NAME`, `BLUECAT_DNS_VIEW` | [Additional configuration](https://go-acme.github.io/lego/dns/bluecat) | | [Blue Cat](https://www.bluecatnetworks.com/) | `bluecat` | `BLUECAT_SERVER_URL`, `BLUECAT_USER_NAME`, `BLUECAT_PASSWORD`, `BLUECAT_CONFIG_NAME`, `BLUECAT_DNS_VIEW` | [Additional configuration](https://go-acme.github.io/lego/dns/bluecat) |
| [Brandit](https://www.brandit.com) | `brandit` | `BRANDIT_API_USERNAME`, `BRANDIT_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/brandit) | | [Brandit](https://www.brandit.com) (DEPRECATED) | `brandit` | `BRANDIT_API_USERNAME`, `BRANDIT_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/brandit) |
| [Bunny](https://bunny.net) | `bunny` | `BUNNY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/bunny) | | [Bunny](https://bunny.net) | `bunny` | `BUNNY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/bunny) |
| [Checkdomain](https://www.checkdomain.de/) | `checkdomain` | `CHECKDOMAIN_TOKEN`, | [Additional configuration](https://go-acme.github.io/lego/dns/checkdomain/) | | [Checkdomain](https://www.checkdomain.de/) | `checkdomain` | `CHECKDOMAIN_TOKEN`, | [Additional configuration](https://go-acme.github.io/lego/dns/checkdomain/) |
| [Civo](https://www.civo.com/) | `civo` | `CIVO_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/civo) | | [Civo](https://www.civo.com/) | `civo` | `CIVO_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/civo) |
@ -334,9 +334,10 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [CloudDNS](https://vshosting.eu/) | `clouddns` | `CLOUDDNS_CLIENT_ID`, `CLOUDDNS_EMAIL`, `CLOUDDNS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/clouddns) | | [CloudDNS](https://vshosting.eu/) | `clouddns` | `CLOUDDNS_CLIENT_ID`, `CLOUDDNS_EMAIL`, `CLOUDDNS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/clouddns) |
| [Cloudflare](https://www.cloudflare.com) | `cloudflare` | `CF_API_EMAIL`, `CF_API_KEY` [^5] or `CF_DNS_API_TOKEN`, `[CF_ZONE_API_TOKEN]` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudflare) | | [Cloudflare](https://www.cloudflare.com) | `cloudflare` | `CF_API_EMAIL`, `CF_API_KEY` [^5] or `CF_DNS_API_TOKEN`, `[CF_ZONE_API_TOKEN]` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudflare) |
| [ClouDNS](https://www.cloudns.net/) | `cloudns` | `CLOUDNS_AUTH_ID`, `CLOUDNS_AUTH_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudns) | | [ClouDNS](https://www.cloudns.net/) | `cloudns` | `CLOUDNS_AUTH_ID`, `CLOUDNS_AUTH_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudns) |
| [CloudXNS](https://www.cloudxns.net) | `cloudxns` | `CLOUDXNS_API_KEY`, `CLOUDXNS_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudxns) | | [CloudXNS](https://www.cloudxns.net) (DEPRECATED) | `cloudxns` | `CLOUDXNS_API_KEY`, `CLOUDXNS_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/cloudxns) |
| [ConoHa](https://www.conoha.jp) | `conoha` | `CONOHA_TENANT_ID`, `CONOHA_API_USERNAME`, `CONOHA_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/conoha) | | [ConoHa](https://www.conoha.jp) | `conoha` | `CONOHA_TENANT_ID`, `CONOHA_API_USERNAME`, `CONOHA_API_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/conoha) |
| [Constellix](https://constellix.com) | `constellix` | `CONSTELLIX_API_KEY`, `CONSTELLIX_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/constellix) | | [Constellix](https://constellix.com) | `constellix` | `CONSTELLIX_API_KEY`, `CONSTELLIX_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/constellix) |
| [Core-Networks](https://www.core-networks.de) | `corenetworks` | `CORENETWORKS_LOGIN`, `CORENETWORKS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/corenetworks) |
| [CPanel and WHM](https://cpanel.net/) | `cpanel` | `CPANEL_MODE`, `CPANEL_USERNAME`, `CPANEL_TOKEN`, `CPANEL_BASE_URL` | [Additional configuration](https://go-acme.github.io/lego/dns/cpanel) | | [CPanel and WHM](https://cpanel.net/) | `cpanel` | `CPANEL_MODE`, `CPANEL_USERNAME`, `CPANEL_TOKEN`, `CPANEL_BASE_URL` | [Additional configuration](https://go-acme.github.io/lego/dns/cpanel) |
| [Derak Cloud](https://derak.cloud/) | `derak` | `DERAK_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/derak) | | [Derak Cloud](https://derak.cloud/) | `derak` | `DERAK_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/derak) |
| [deSEC](https://desec.io) | `desec` | `DESEC_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/desec) | | [deSEC](https://desec.io) | `desec` | `DESEC_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/desec) |
@ -418,6 +419,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Rackspace](https://www.rackspace.com/cloud/dns) | `rackspace` | `RACKSPACE_USER`, `RACKSPACE_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/rackspace) | | [Rackspace](https://www.rackspace.com/cloud/dns) | `rackspace` | `RACKSPACE_USER`, `RACKSPACE_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/rackspace) |
| [RcodeZero](https://www.rcodezero.at) | `rcodezero` | `RCODEZERO_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/rcodezero) | | [RcodeZero](https://www.rcodezero.at) | `rcodezero` | `RCODEZERO_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/rcodezero) |
| [reg.ru](https://www.reg.ru) | `regru` | `REGRU_USERNAME`, `REGRU_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/regru) | | [reg.ru](https://www.reg.ru) | `regru` | `REGRU_USERNAME`, `REGRU_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/regru) |
| [Regfish](https://regfish.de) | `regfish` | `regfish` | [Additional configuration](https://go-acme.github.io/lego/dns/regfish) |
| [RFC2136](https://tools.ietf.org/html/rfc2136) | `rfc2136` | `RFC2136_TSIG_KEY`, `RFC2136_TSIG_SECRET`, `RFC2136_TSIG_ALGORITHM`, `RFC2136_NAMESERVER` | [Additional configuration](https://go-acme.github.io/lego/dns/rfc2136) | | [RFC2136](https://tools.ietf.org/html/rfc2136) | `rfc2136` | `RFC2136_TSIG_KEY`, `RFC2136_TSIG_SECRET`, `RFC2136_TSIG_ALGORITHM`, `RFC2136_NAMESERVER` | [Additional configuration](https://go-acme.github.io/lego/dns/rfc2136) |
| [RimuHosting](https://rimuhosting.com) | `rimuhosting` | `RIMUHOSTING_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/rimuhosting) | | [RimuHosting](https://rimuhosting.com) | `rimuhosting` | `RIMUHOSTING_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/rimuhosting) |
| [Route 53](https://aws.amazon.com/route53/) | `route53` | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `[AWS_REGION]`, `[AWS_HOSTED_ZONE_ID]` or a configured user/instance IAM profile. | [Additional configuration](https://go-acme.github.io/lego/dns/route53) | | [Route 53](https://aws.amazon.com/route53/) | `route53` | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `[AWS_REGION]`, `[AWS_HOSTED_ZONE_ID]` or a configured user/instance IAM profile. | [Additional configuration](https://go-acme.github.io/lego/dns/route53) |
@ -431,7 +433,9 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Simply.com](https://www.simply.com/en/domains/) | `simply` | `SIMPLY_ACCOUNT_NAME`, `SIMPLY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/simply) | | [Simply.com](https://www.simply.com/en/domains/) | `simply` | `SIMPLY_ACCOUNT_NAME`, `SIMPLY_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/simply) |
| [Sonic](https://www.sonic.com/) | `sonic` | `SONIC_USER_ID`, `SONIC_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/sonic) | | [Sonic](https://www.sonic.com/) | `sonic` | `SONIC_USER_ID`, `SONIC_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/sonic) |
| [Stackpath](https://www.stackpath.com/) | `stackpath` | `STACKPATH_CLIENT_ID`, `STACKPATH_CLIENT_SECRET`, `STACKPATH_STACK_ID` | [Additional configuration](https://go-acme.github.io/lego/dns/stackpath) | | [Stackpath](https://www.stackpath.com/) | `stackpath` | `STACKPATH_CLIENT_ID`, `STACKPATH_CLIENT_SECRET`, `STACKPATH_STACK_ID` | [Additional configuration](https://go-acme.github.io/lego/dns/stackpath) |
| [Technitium](https://technitium.com) | `technitium` | `TECHNITIUM_SERVER_BASE_URL`, `TECHNITIUM_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/technitium) |
| [Tencent Cloud DNS](https://cloud.tencent.com/product/cns) | `tencentcloud` | `TENCENTCLOUD_SECRET_ID`, `TENCENTCLOUD_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/tencentcloud) | | [Tencent Cloud DNS](https://cloud.tencent.com/product/cns) | `tencentcloud` | `TENCENTCLOUD_SECRET_ID`, `TENCENTCLOUD_SECRET_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/tencentcloud) |
| [Timeweb Cloud](https://timeweb.cloud) | `timewebcloud` | `TIMEWEBCLOUD_AUTH_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/timewebcloud) |
| [TransIP](https://www.transip.nl/) | `transip` | `TRANSIP_ACCOUNT_NAME`, `TRANSIP_PRIVATE_KEY_PATH` | [Additional configuration](https://go-acme.github.io/lego/dns/transip) | | [TransIP](https://www.transip.nl/) | `transip` | `TRANSIP_ACCOUNT_NAME`, `TRANSIP_PRIVATE_KEY_PATH` | [Additional configuration](https://go-acme.github.io/lego/dns/transip) |
| [UKFast SafeDNS](https://docs.ukfast.co.uk/domains/safedns/index.html) | `safedns` | `SAFEDNS_AUTH_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/safedns) | | [UKFast SafeDNS](https://docs.ukfast.co.uk/domains/safedns/index.html) | `safedns` | `SAFEDNS_AUTH_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/safedns) |
| [Ultradns](https://neustarsecurityservices.com/dns-services) | `ultradns` | `ULTRADNS_USERNAME`, `ULTRADNS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/ultradns) | | [Ultradns](https://neustarsecurityservices.com/dns-services) | `ultradns` | `ULTRADNS_USERNAME`, `ULTRADNS_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/ultradns) |
@ -441,6 +445,7 @@ For complete details, refer to your provider's _Additional configuration_ link.
| [Versio](https://www.versio.nl/domeinnamen) | `versio` | `VERSIO_USERNAME`, `VERSIO_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/versio) | | [Versio](https://www.versio.nl/domeinnamen) | `versio` | `VERSIO_USERNAME`, `VERSIO_PASSWORD` | [Additional configuration](https://go-acme.github.io/lego/dns/versio) |
| [VinylDNS](https://www.vinyldns.io) | `vinyldns` | `VINYLDNS_ACCESS_KEY`, `VINYLDNS_SECRET_KEY`, `VINYLDNS_HOST` | [Additional configuration](https://go-acme.github.io/lego/dns/vinyldns) | | [VinylDNS](https://www.vinyldns.io) | `vinyldns` | `VINYLDNS_ACCESS_KEY`, `VINYLDNS_SECRET_KEY`, `VINYLDNS_HOST` | [Additional configuration](https://go-acme.github.io/lego/dns/vinyldns) |
| [VK Cloud](https://mcs.mail.ru/) | `vkcloud` | `VK_CLOUD_PASSWORD`, `VK_CLOUD_PROJECT_ID`, `VK_CLOUD_USERNAME` | [Additional configuration](https://go-acme.github.io/lego/dns/vkcloud) | | [VK Cloud](https://mcs.mail.ru/) | `vkcloud` | `VK_CLOUD_PASSWORD`, `VK_CLOUD_PROJECT_ID`, `VK_CLOUD_USERNAME` | [Additional configuration](https://go-acme.github.io/lego/dns/vkcloud) |
| [Volcano Engine](https://www.volcengine.com) | `volcengine` | `VOLC_ACCESSKEY`, `VOLC_SECRETKEY` | [Additional configuration](https://go-acme.github.io/lego/dns/volcengine) |
| [Vscale](https://vscale.io/) | `vscale` | `VSCALE_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/vscale) | | [Vscale](https://vscale.io/) | `vscale` | `VSCALE_API_TOKEN` | [Additional configuration](https://go-acme.github.io/lego/dns/vscale) |
| [VULTR](https://www.vultr.com) | `vultr` | `VULTR_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/vultr) | | [VULTR](https://www.vultr.com) | `vultr` | `VULTR_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/vultr) |
| [Webnames](https://www.webnames.ru/) | `webnames` | `WEBNAMES_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/webnames) | | [Webnames](https://www.webnames.ru/) | `webnames` | `WEBNAMES_API_KEY` | [Additional configuration](https://go-acme.github.io/lego/dns/webnames) |

View file

@ -652,3 +652,10 @@ As a consequence, middlewares do not have access to those Connection headers,
and a new option has been introduced to specify which ones could go through the middleware chain before being removed: `<entrypoint>.forwardedHeaders.connection`. and a new option has been introduced to specify which ones could go through the middleware chain before being removed: `<entrypoint>.forwardedHeaders.connection`.
Please check out the [entrypoint forwarded headers connection option configuration](../routing/entrypoints.md#forwarded-headers) documentation. Please check out the [entrypoint forwarded headers connection option configuration](../routing/entrypoints.md#forwarded-headers) documentation.
## v2.11.14
### X-Forwarded-Prefix
In `v2.11.14`, the `X-Forwarded-Prefix` header is now handled like the other `X-Forwarded-*` headers: Traefik removes it when it's sent from an untrusted source.
Please refer to the Forwarded headers [documentation](https://doc.traefik.io/traefik/routing/entrypoints/#forwarded-headers) for more details.

View file

@ -5,4 +5,23 @@ description: "Reference the environment variables for static configuration in Tr
# Static Configuration: Environment variables # Static Configuration: Environment variables
!!! warning "Environment Variable Casing"
Traefik normalizes the environment variable key-value pairs by lowercasing them.
This means that when you interpolate a string in an environment variable's name,
that string will be treated as lowercase, regardless of its original casing.
For example, assuming you have set environment variables as follows:
```bash
export TRAEFIK_ENTRYPOINTS_WEB=true
export TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
export TRAEFIK_CERTIFICATESRESOLVERS_myResolver=true
export TRAEFIK_CERTIFICATESRESOLVERS_myResolver_ACME_CASERVER=....
```
Although the Entrypoint is named `WEB` and the Certificate Resolver is named `myResolver`,
they have to be referenced respectively as `web`, and `myresolver` in the configuration.
--8<-- "content/reference/static-configuration/env-ref.md" --8<-- "content/reference/static-configuration/env-ref.md"

View file

@ -579,7 +579,7 @@ Setting them has no effect for UDP entryPoints.
If zero, no timeout exists. If zero, no timeout exists.
Can be provided in a format supported by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration) or as raw values (digits). Can be provided in a format supported by [time.ParseDuration](https://golang.org/pkg/time/#ParseDuration) or as raw values (digits).
If no units are provided, the value is parsed assuming seconds. If no units are provided, the value is parsed assuming seconds.
We strongly suggest to adapt this value accordingly to the your needs. We strongly suggest adapting this value accordingly to your needs.
```yaml tab="File (YAML)" ```yaml tab="File (YAML)"
## Static configuration ## Static configuration

106
go.mod
View file

@ -18,7 +18,7 @@ require (
github.com/docker/go-connections v0.5.0 github.com/docker/go-connections v0.5.0
github.com/fatih/structs v1.1.0 github.com/fatih/structs v1.1.0
github.com/fsnotify/fsnotify v1.7.0 github.com/fsnotify/fsnotify v1.7.0
github.com/go-acme/lego/v4 v4.19.2 github.com/go-acme/lego/v4 v4.20.2
github.com/go-kit/kit v0.13.0 github.com/go-kit/kit v0.13.0
github.com/go-kit/log v0.2.1 github.com/go-kit/log v0.2.1
github.com/golang/protobuf v1.5.4 github.com/golang/protobuf v1.5.4
@ -29,8 +29,8 @@ require (
github.com/hashicorp/go-hclog v1.6.3 github.com/hashicorp/go-hclog v1.6.3
github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/go-retryablehttp v0.7.7 github.com/hashicorp/go-retryablehttp v0.7.7
github.com/hashicorp/go-version v1.6.0 github.com/hashicorp/go-version v1.7.0
github.com/hashicorp/nomad/api v0.0.0-20240122103822-8a4bd61caf74 // No tag on the repo. github.com/hashicorp/nomad/api v0.0.0-20231213195942-64e3dca9274b // No tag on the repo.
github.com/http-wasm/http-wasm-host-go v0.7.0 github.com/http-wasm/http-wasm-host-go v0.7.0
github.com/influxdata/influxdb-client-go/v2 v2.7.0 github.com/influxdata/influxdb-client-go/v2 v2.7.0
github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // No tag on the repo. github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab // No tag on the repo.
@ -85,12 +85,12 @@ require (
go.opentelemetry.io/otel/trace v1.29.0 go.opentelemetry.io/otel/trace v1.29.0
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // No tag on the repo. golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // No tag on the repo.
golang.org/x/mod v0.21.0 golang.org/x/mod v0.21.0
golang.org/x/net v0.29.0 golang.org/x/net v0.30.0
golang.org/x/sys v0.25.0 golang.org/x/sys v0.26.0
golang.org/x/text v0.18.0 golang.org/x/text v0.19.0
golang.org/x/time v0.6.0 golang.org/x/time v0.7.0
golang.org/x/tools v0.25.0 golang.org/x/tools v0.25.0
google.golang.org/grpc v1.66.2 google.golang.org/grpc v1.67.1
gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
k8s.io/api v0.31.1 k8s.io/api v0.31.1
@ -105,17 +105,17 @@ require (
) )
require ( require (
cloud.google.com/go/auth v0.9.3 // indirect cloud.google.com/go/auth v0.10.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
cloud.google.com/go/compute/metadata v0.5.1 // indirect cloud.google.com/go/compute/metadata v0.5.2 // indirect
dario.cat/mergo v1.0.0 // indirect dario.cat/mergo v1.0.0 // indirect
github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect
@ -136,30 +136,30 @@ require (
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
github.com/VividCortex/gohistogram v1.0.0 // indirect github.com/VividCortex/gohistogram v1.0.0 // indirect
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
github.com/aliyun/alibaba-cloud-sdk-go v1.63.15 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.63.47 // indirect
github.com/armon/go-metrics v0.4.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect
github.com/aws/aws-sdk-go-v2 v1.30.5 // indirect github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect
github.com/aws/aws-sdk-go-v2/config v1.27.33 // indirect github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect
github.com/aws/aws-sdk-go-v2/service/lightsail v1.40.6 // indirect github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.3 // indirect
github.com/aws/aws-sdk-go-v2/service/route53 v1.43.2 // indirect github.com/aws/aws-sdk-go-v2/service/route53 v1.46.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
github.com/aws/smithy-go v1.20.4 // indirect github.com/aws/smithy-go v1.22.0 // indirect
github.com/benbjohnson/clock v1.3.0 // indirect github.com/benbjohnson/clock v1.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
github.com/bytedance/sonic v1.10.0 // indirect github.com/bytedance/sonic v1.10.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/civo/civogo v0.3.11 // indirect github.com/civo/civogo v0.3.11 // indirect
github.com/cloudflare/cloudflare-go v0.104.0 // indirect github.com/cloudflare/cloudflare-go v0.108.0 // indirect
github.com/containerd/containerd v1.7.20 // indirect github.com/containerd/containerd v1.7.20 // indirect
github.com/containerd/log v0.1.0 // indirect github.com/containerd/log v0.1.0 // indirect
github.com/containerd/platforms v0.2.1 // indirect github.com/containerd/platforms v0.2.1 // indirect
@ -176,7 +176,7 @@ require (
github.com/docker/go-units v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect
github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/exoscale/egoscale/v3 v3.1.5 // indirect github.com/exoscale/egoscale/v3 v3.1.7 // indirect
github.com/fatih/color v1.17.0 // indirect github.com/fatih/color v1.17.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect
@ -198,12 +198,12 @@ require (
github.com/go-playground/validator/v10 v10.16.0 // indirect github.com/go-playground/validator/v10 v10.16.0 // indirect
github.com/go-resty/resty/v2 v2.13.1 // indirect github.com/go-resty/resty/v2 v2.13.1 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/go-viper/mapstructure/v2 v2.1.0 // indirect github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/go-zookeeper/zk v1.0.3 // indirect github.com/go-zookeeper/zk v1.0.3 // indirect
github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-json v0.10.3 // indirect
github.com/gofrs/flock v0.12.1 // indirect github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/google/gnostic-models v0.6.8 // indirect github.com/google/gnostic-models v0.6.8 // indirect
@ -215,7 +215,7 @@ require (
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/googleapis/gax-go/v2 v2.13.0 // indirect
github.com/gophercloud/gophercloud v1.14.0 // indirect github.com/gophercloud/gophercloud v1.14.1 // indirect
github.com/gophercloud/utils v0.0.0-20231010081019-80377eca5d56 // indirect github.com/gophercloud/utils v0.0.0-20231010081019-80377eca5d56 // indirect
github.com/gravitational/trace v1.1.16-0.20220114165159-14a9a7dd6aaf // indirect github.com/gravitational/trace v1.1.16-0.20220114165159-14a9a7dd6aaf // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
@ -229,7 +229,7 @@ require (
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/serf v0.10.1 // indirect
github.com/huandu/xstrings v1.5.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.114 // indirect github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.120 // indirect
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect
github.com/imdario/mergo v0.3.16 // indirect github.com/imdario/mergo v0.3.16 // indirect
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect
@ -245,7 +245,7 @@ require (
github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
github.com/labbsr0x/goh v1.0.1 // indirect github.com/labbsr0x/goh v1.0.1 // indirect
github.com/leodido/go-urn v1.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect
github.com/linode/linodego v1.40.0 // indirect github.com/linode/linodego v1.42.0 // indirect
github.com/liquidweb/liquidweb-cli v0.6.9 // indirect github.com/liquidweb/liquidweb-cli v0.6.9 // indirect
github.com/liquidweb/liquidweb-go v1.6.4 // indirect github.com/liquidweb/liquidweb-go v1.6.4 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
@ -288,7 +288,7 @@ require (
github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
github.com/oracle/oci-go-sdk/v65 v65.73.0 // indirect github.com/oracle/oci-go-sdk/v65 v65.77.1 // indirect
github.com/ovh/go-ovh v1.6.0 // indirect github.com/ovh/go-ovh v1.6.0 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
@ -298,7 +298,8 @@ require (
github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect
github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/qpack v0.5.1 // indirect
github.com/redis/go-redis/v9 v9.2.1 // indirect github.com/redis/go-redis/v9 v9.6.1 // indirect
github.com/regfish/regfish-dnsapi-go v0.1.1 // indirect
github.com/rs/cors v1.7.0 // indirect github.com/rs/cors v1.7.0 // indirect
github.com/sacloud/api-client-go v0.2.10 // indirect github.com/sacloud/api-client-go v0.2.10 // indirect
github.com/sacloud/go-http v0.1.8 // indirect github.com/sacloud/go-http v0.1.8 // indirect
@ -313,7 +314,7 @@ require (
github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/shopspring/decimal v1.4.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
github.com/softlayer/softlayer-go v1.1.5 // indirect github.com/softlayer/softlayer-go v1.1.7 // indirect
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
github.com/sony/gobreaker v0.5.0 // indirect github.com/sony/gobreaker v0.5.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect
@ -322,21 +323,22 @@ require (
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.18.2 // indirect github.com/spf13/viper v1.18.2 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1002 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1034 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1002 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1034 // indirect
github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect
github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect github.com/tklauser/numcpus v0.6.1 // indirect
github.com/transip/gotransip/v6 v6.26.0 // indirect github.com/transip/gotransip/v6 v6.26.0 // indirect
github.com/ultradns/ultradns-go-sdk v1.7.0-20240913052650-970ca9a // indirect github.com/ultradns/ultradns-go-sdk v1.8.0-20241010134910-243eeec // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/vinyldns/go-vinyldns v0.9.16 // indirect github.com/vinyldns/go-vinyldns v0.9.16 // indirect
github.com/volcengine/volc-sdk-golang v1.0.183 // indirect
github.com/vultr/govultr/v3 v3.9.1 // indirect github.com/vultr/govultr/v3 v3.9.1 // indirect
github.com/x448/float16 v0.8.4 // indirect github.com/x448/float16 v0.8.4 // indirect
github.com/yandex-cloud/go-genproto v0.0.0-20240911120709-1fa0cb6f47c2 // indirect github.com/yandex-cloud/go-genproto v0.0.0-20241101135610-76a0cfc1a773 // indirect
github.com/yandex-cloud/go-sdk v0.0.0-20240911121212-e4e74d0d02f5 // indirect github.com/yandex-cloud/go-sdk v0.0.0-20241101143304-947cf519f6bd // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect
github.com/zeebo/errs v1.2.2 // indirect github.com/zeebo/errs v1.2.2 // indirect
go.etcd.io/etcd/api/v3 v3.5.14 // indirect go.etcd.io/etcd/api/v3 v3.5.14 // indirect
@ -356,20 +358,20 @@ require (
go.uber.org/ratelimit v0.3.0 // indirect go.uber.org/ratelimit v0.3.0 // indirect
go.uber.org/zap v1.26.0 // indirect go.uber.org/zap v1.26.0 // indirect
golang.org/x/arch v0.4.0 // indirect golang.org/x/arch v0.4.0 // indirect
golang.org/x/crypto v0.27.0 // indirect golang.org/x/crypto v0.28.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect
golang.org/x/sync v0.8.0 // indirect golang.org/x/sync v0.8.0 // indirect
golang.org/x/term v0.24.0 // indirect golang.org/x/term v0.25.0 // indirect
google.golang.org/api v0.197.0 // indirect google.golang.org/api v0.204.0 // indirect
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
google.golang.org/protobuf v1.34.2 // indirect google.golang.org/protobuf v1.35.1 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/h2non/gock.v1 v1.0.16 // indirect gopkg.in/h2non/gock.v1 v1.0.16 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/ns1/ns1-go.v2 v2.12.0 // indirect gopkg.in/ns1/ns1-go.v2 v2.12.2 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/klog/v2 v2.130.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect

539
go.sum

File diff suppressed because it is too large Load diff

View file

@ -41,7 +41,7 @@ func (s *HTTPSuite) TestSimpleConfiguration() {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"serviceHTTP": { "serviceHTTP": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: boolRef(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://bacon:80", URL: "http://bacon:80",
@ -81,6 +81,4 @@ func startTestServerWithResponse(response []byte) (ts *httptest.Server) {
return ts return ts
} }
func boolRef(b bool) *bool { func pointer[T any](v T) *T { return &v }
return &b
}

View file

@ -3,7 +3,7 @@ package dashboard
import ( import (
"io/fs" "io/fs"
"net/http" "net/http"
"net/url" "strings"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/traefik/traefik/v3/webui" "github.com/traefik/traefik/v3/webui"
@ -25,7 +25,8 @@ func Append(router *mux.Router, customAssets fs.FS) {
router.Methods(http.MethodGet). router.Methods(http.MethodGet).
Path("/"). Path("/").
HandlerFunc(func(resp http.ResponseWriter, req *http.Request) { HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
http.Redirect(resp, req, safePrefix(req)+"/dashboard/", http.StatusFound) prefix := strings.TrimSuffix(req.Header.Get("X-Forwarded-Prefix"), "/")
http.Redirect(resp, req, prefix+"/dashboard/", http.StatusFound)
}) })
router.Methods(http.MethodGet). router.Methods(http.MethodGet).
@ -58,21 +59,3 @@ func (g Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
http.FileServerFS(assets).ServeHTTP(w, r) http.FileServerFS(assets).ServeHTTP(w, r)
} }
func safePrefix(req *http.Request) string {
prefix := req.Header.Get("X-Forwarded-Prefix")
if prefix == "" {
return ""
}
parse, err := url.Parse(prefix)
if err != nil {
return ""
}
if parse.Host != "" {
return ""
}
return parse.Path
}

View file

@ -10,53 +10,8 @@ import (
"time" "time"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func Test_safePrefix(t *testing.T) {
testCases := []struct {
desc string
value string
expected string
}{
{
desc: "host",
value: "https://example.com",
expected: "",
},
{
desc: "host with path",
value: "https://example.com/foo/bar?test",
expected: "",
},
{
desc: "path",
value: "/foo/bar",
expected: "/foo/bar",
},
{
desc: "path without leading slash",
value: "foo/bar",
expected: "foo/bar",
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {
t.Parallel()
req, err := http.NewRequest(http.MethodGet, "http://localhost", nil)
require.NoError(t, err)
req.Header.Set("X-Forwarded-Prefix", test.value)
prefix := safePrefix(req)
assert.Equal(t, test.expected, prefix)
})
}
}
func Test_ContentSecurityPolicy(t *testing.T) { func Test_ContentSecurityPolicy(t *testing.T) {
testCases := []struct { testCases := []struct {
desc string desc string

View file

@ -19,7 +19,7 @@ import (
"github.com/traefik/traefik/v3/pkg/config/static" "github.com/traefik/traefik/v3/pkg/config/static"
) )
func Bool(v bool) *bool { return &v } func pointer[T any](v T) *T { return &v }
func TestHandler_HTTP(t *testing.T) { func TestHandler_HTTP(t *testing.T) {
type expected struct { type expected struct {
@ -415,7 +415,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -432,7 +432,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.2", URL: "http://127.0.0.2",
@ -501,7 +501,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -518,7 +518,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.2", URL: "http://127.0.0.2",
@ -535,7 +535,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.3", URL: "http://127.0.0.3",
@ -565,7 +565,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -583,7 +583,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.2", URL: "http://127.0.0.2",
@ -614,7 +614,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -632,7 +632,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.2", URL: "http://127.0.0.2",
@ -663,7 +663,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -692,7 +692,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",
@ -721,7 +721,7 @@ func TestHandler_HTTP(t *testing.T) {
si := &runtime.ServiceInfo{ si := &runtime.ServiceInfo{
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",

View file

@ -38,7 +38,7 @@ func TestHandler_RawData(t *testing.T) {
"foo-service@myprovider": { "foo-service@myprovider": {
Service: &dynamic.Service{ Service: &dynamic.Service{
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://127.0.0.1", URL: "http://127.0.0.1",

View file

@ -341,11 +341,7 @@ func (m tcpMiddlewareRepresentation) status() string {
return m.Status return m.Status
} }
type orderedByName interface { func sortByName[T orderedWithName](direction string, results []T) {
orderedWithName
}
func sortByName[T orderedByName](direction string, results []T) {
// Ascending // Ascending
if direction == ascendantSorting { if direction == ascendantSorting {
sort.Slice(results, func(i, j int) bool { sort.Slice(results, func(i, j int) bool {

View file

@ -13,8 +13,7 @@ import (
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
) )
func Bool(v bool) *bool { return &v } func pointer[T any](v T) *T { return &v }
func String(v string) *string { return &v }
func TestDecodeConfiguration(t *testing.T) { func TestDecodeConfiguration(t *testing.T) {
labels := map[string]string{ labels := map[string]string{
@ -283,7 +282,7 @@ func TestDecodeConfiguration(t *testing.T) {
Port: "42", Port: "42",
}, },
}, },
TerminationDelay: func(i int) *int { return &i }(42), TerminationDelay: pointer(42),
ProxyProtocol: &dynamic.ProxyProtocol{Version: 42}, ProxyProtocol: &dynamic.ProxyProtocol{Version: 42},
ServersTransport: "foo", ServersTransport: "foo",
}, },
@ -295,7 +294,7 @@ func TestDecodeConfiguration(t *testing.T) {
Port: "42", Port: "42",
}, },
}, },
TerminationDelay: func(i int) *int { return &i }(42), TerminationDelay: pointer(42),
ProxyProtocol: &dynamic.ProxyProtocol{Version: 2}, ProxyProtocol: &dynamic.ProxyProtocol{Version: 2},
ServersTransport: "foo", ServersTransport: "foo",
}, },
@ -485,7 +484,7 @@ func TestDecodeConfiguration(t *testing.T) {
"foobar", "foobar",
"fiibar", "fiibar",
}, },
ForceSlash: Bool(true), ForceSlash: pointer(true),
}, },
}, },
"Middleware18": { "Middleware18": {
@ -561,7 +560,7 @@ func TestDecodeConfiguration(t *testing.T) {
Cert: "foobar", Cert: "foobar",
Key: "foobar", Key: "foobar",
InsecureSkipVerify: true, InsecureSkipVerify: true,
CAOptional: Bool(true), CAOptional: pointer(true),
}, },
TrustForwardHeader: true, TrustForwardHeader: true,
AuthResponseHeaders: []string{ AuthResponseHeaders: []string{
@ -615,14 +614,14 @@ func TestDecodeConfiguration(t *testing.T) {
"foobar", "foobar",
"fiibar", "fiibar",
}, },
SSLRedirect: Bool(true), SSLRedirect: pointer(true),
SSLTemporaryRedirect: Bool(true), SSLTemporaryRedirect: pointer(true),
SSLHost: String("foobar"), SSLHost: pointer("foobar"),
SSLProxyHeaders: map[string]string{ SSLProxyHeaders: map[string]string{
"name0": "foobar", "name0": "foobar",
"name1": "foobar", "name1": "foobar",
}, },
SSLForceHost: Bool(true), SSLForceHost: pointer(true),
STSSeconds: 42, STSSeconds: 42,
STSIncludeSubdomains: true, STSIncludeSubdomains: true,
STSPreload: true, STSPreload: true,
@ -636,7 +635,7 @@ func TestDecodeConfiguration(t *testing.T) {
ContentSecurityPolicyReportOnly: "foobar", ContentSecurityPolicyReportOnly: "foobar",
PublicKey: "foobar", PublicKey: "foobar",
ReferrerPolicy: "foobar", ReferrerPolicy: "foobar",
FeaturePolicy: String("foobar"), FeaturePolicy: pointer("foobar"),
PermissionsPolicy: "foobar", PermissionsPolicy: "foobar",
IsDevelopment: true, IsDevelopment: true,
}, },
@ -696,9 +695,9 @@ func TestDecodeConfiguration(t *testing.T) {
"name0": "foobar", "name0": "foobar",
"name1": "foobar", "name1": "foobar",
}, },
FollowRedirects: func(v bool) *bool { return &v }(true), FollowRedirects: pointer(true),
}, },
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(time.Second), FlushInterval: ptypes.Duration(time.Second),
}, },
@ -727,9 +726,9 @@ func TestDecodeConfiguration(t *testing.T) {
"name0": "foobar", "name0": "foobar",
"name1": "foobar", "name1": "foobar",
}, },
FollowRedirects: func(v bool) *bool { return &v }(true), FollowRedirects: pointer(true),
}, },
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(time.Second), FlushInterval: ptypes.Duration(time.Second),
}, },
@ -810,7 +809,7 @@ func TestEncodeConfiguration(t *testing.T) {
}, },
}, },
ServersTransport: "foo", ServersTransport: "foo",
TerminationDelay: func(i int) *int { return &i }(42), TerminationDelay: pointer(42),
}, },
}, },
"Service1": { "Service1": {
@ -821,7 +820,7 @@ func TestEncodeConfiguration(t *testing.T) {
}, },
}, },
ServersTransport: "foo", ServersTransport: "foo",
TerminationDelay: func(i int) *int { return &i }(42), TerminationDelay: pointer(42),
}, },
}, },
}, },
@ -1008,7 +1007,7 @@ func TestEncodeConfiguration(t *testing.T) {
"foobar", "foobar",
"fiibar", "fiibar",
}, },
ForceSlash: Bool(true), ForceSlash: pointer(true),
}, },
}, },
"Middleware18": { "Middleware18": {
@ -1092,7 +1091,7 @@ func TestEncodeConfiguration(t *testing.T) {
Cert: "foobar", Cert: "foobar",
Key: "foobar", Key: "foobar",
InsecureSkipVerify: true, InsecureSkipVerify: true,
CAOptional: Bool(true), CAOptional: pointer(true),
}, },
TrustForwardHeader: true, TrustForwardHeader: true,
AuthResponseHeaders: []string{ AuthResponseHeaders: []string{
@ -1146,14 +1145,14 @@ func TestEncodeConfiguration(t *testing.T) {
"foobar", "foobar",
"fiibar", "fiibar",
}, },
SSLRedirect: Bool(true), SSLRedirect: pointer(true),
SSLTemporaryRedirect: Bool(true), SSLTemporaryRedirect: pointer(true),
SSLHost: String("foobar"), SSLHost: pointer("foobar"),
SSLProxyHeaders: map[string]string{ SSLProxyHeaders: map[string]string{
"name0": "foobar", "name0": "foobar",
"name1": "foobar", "name1": "foobar",
}, },
SSLForceHost: Bool(true), SSLForceHost: pointer(true),
STSSeconds: 42, STSSeconds: 42,
STSIncludeSubdomains: true, STSIncludeSubdomains: true,
STSPreload: true, STSPreload: true,
@ -1167,7 +1166,7 @@ func TestEncodeConfiguration(t *testing.T) {
ContentSecurityPolicyReportOnly: "foobar", ContentSecurityPolicyReportOnly: "foobar",
PublicKey: "foobar", PublicKey: "foobar",
ReferrerPolicy: "foobar", ReferrerPolicy: "foobar",
FeaturePolicy: String("foobar"), FeaturePolicy: pointer("foobar"),
PermissionsPolicy: "foobar", PermissionsPolicy: "foobar",
IsDevelopment: true, IsDevelopment: true,
}, },
@ -1218,7 +1217,7 @@ func TestEncodeConfiguration(t *testing.T) {
"name1": "foobar", "name1": "foobar",
}, },
}, },
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(time.Second), FlushInterval: ptypes.Duration(time.Second),
}, },
@ -1247,7 +1246,7 @@ func TestEncodeConfiguration(t *testing.T) {
"name1": "foobar", "name1": "foobar",
}, },
}, },
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(time.Second), FlushInterval: ptypes.Duration(time.Second),
}, },

View file

@ -27,14 +27,14 @@ type EntryPoint struct {
// GetAddress strips any potential protocol part of the address field of the // GetAddress strips any potential protocol part of the address field of the
// entry point, in order to return the actual address. // entry point, in order to return the actual address.
func (ep EntryPoint) GetAddress() string { func (ep *EntryPoint) GetAddress() string {
splitN := strings.SplitN(ep.Address, "/", 2) splitN := strings.SplitN(ep.Address, "/", 2)
return splitN[0] return splitN[0]
} }
// GetProtocol returns the protocol part of the address field of the entry point. // GetProtocol returns the protocol part of the address field of the entry point.
// If none is specified, it defaults to "tcp". // If none is specified, it defaults to "tcp".
func (ep EntryPoint) GetProtocol() (string, error) { func (ep *EntryPoint) GetProtocol() (string, error) {
splitN := strings.SplitN(ep.Address, "/", 2) splitN := strings.SplitN(ep.Address, "/", 2)
if len(splitN) < 2 { if len(splitN) < 2 {
return "tcp", nil return "tcp", nil

View file

@ -20,6 +20,8 @@ import (
const delta float64 = 1e-10 const delta float64 = 1e-10
func pointer[T any](v T) *T { return &v }
func TestNewServiceHealthChecker_durations(t *testing.T) { func TestNewServiceHealthChecker_durations(t *testing.T) {
testCases := []struct { testCases := []struct {
desc string desc string
@ -285,7 +287,7 @@ func TestServiceHealthChecker_checkHealthHTTP_NotFollowingRedirects(t *testing.T
config := &dynamic.ServerHealthCheck{ config := &dynamic.ServerHealthCheck{
Path: "/path", Path: "/path",
FollowRedirects: Bool(false), FollowRedirects: pointer(false),
Interval: dynamic.DefaultHealthCheckInterval, Interval: dynamic.DefaultHealthCheckInterval,
Timeout: dynamic.DefaultHealthCheckTimeout, Timeout: dynamic.DefaultHealthCheckTimeout,
} }
@ -454,7 +456,3 @@ func TestServiceHealthChecker_Launch(t *testing.T) {
}) })
} }
} }
func Bool(b bool) *bool {
return &b
}

View file

@ -14,7 +14,6 @@ import (
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"regexp"
"strconv" "strconv"
"strings" "strings"
"testing" "testing"
@ -812,10 +811,10 @@ func assertValidLogData(t *testing.T, expected string, logData []byte) {
assert.Equal(t, resultExpected[OriginContentSize], result[OriginContentSize], formatErrMessage) assert.Equal(t, resultExpected[OriginContentSize], result[OriginContentSize], formatErrMessage)
assert.Equal(t, resultExpected[RequestRefererHeader], result[RequestRefererHeader], formatErrMessage) assert.Equal(t, resultExpected[RequestRefererHeader], result[RequestRefererHeader], formatErrMessage)
assert.Equal(t, resultExpected[RequestUserAgentHeader], result[RequestUserAgentHeader], formatErrMessage) assert.Equal(t, resultExpected[RequestUserAgentHeader], result[RequestUserAgentHeader], formatErrMessage)
assert.Regexp(t, regexp.MustCompile(`\d*`), result[RequestCount], formatErrMessage) assert.Regexp(t, `\d*`, result[RequestCount], formatErrMessage)
assert.Equal(t, resultExpected[RouterName], result[RouterName], formatErrMessage) assert.Equal(t, resultExpected[RouterName], result[RouterName], formatErrMessage)
assert.Equal(t, resultExpected[ServiceURL], result[ServiceURL], formatErrMessage) assert.Equal(t, resultExpected[ServiceURL], result[ServiceURL], formatErrMessage)
assert.Regexp(t, regexp.MustCompile(`\d*ms`), result[Duration], formatErrMessage) assert.Regexp(t, `\d*ms`, result[Duration], formatErrMessage)
} }
func captureStdout(t *testing.T) (out *os.File, restoreStdout func()) { func captureStdout(t *testing.T) (out *os.File, restoreStdout func()) {

View file

@ -20,6 +20,7 @@ const (
xForwardedServer = "X-Forwarded-Server" xForwardedServer = "X-Forwarded-Server"
xForwardedURI = "X-Forwarded-Uri" xForwardedURI = "X-Forwarded-Uri"
xForwardedMethod = "X-Forwarded-Method" xForwardedMethod = "X-Forwarded-Method"
xForwardedPrefix = "X-Forwarded-Prefix"
xForwardedTLSClientCert = "X-Forwarded-Tls-Client-Cert" xForwardedTLSClientCert = "X-Forwarded-Tls-Client-Cert"
xForwardedTLSClientCertInfo = "X-Forwarded-Tls-Client-Cert-Info" xForwardedTLSClientCertInfo = "X-Forwarded-Tls-Client-Cert-Info"
xRealIP = "X-Real-Ip" xRealIP = "X-Real-Ip"
@ -35,6 +36,7 @@ var xHeaders = []string{
xForwardedServer, xForwardedServer,
xForwardedURI, xForwardedURI,
xForwardedMethod, xForwardedMethod,
xForwardedPrefix,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xRealIP, xRealIP,

View file

@ -48,6 +48,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "10.0.1.0, 10.0.1.12", xForwardedFor: "10.0.1.0, 10.0.1.12",
@ -55,6 +56,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "GET", xForwardedMethod: "GET",
xForwardedTLSClientCert: "Cert", xForwardedTLSClientCert: "Cert",
xForwardedTLSClientCertInfo: "CertInfo", xForwardedTLSClientCertInfo: "CertInfo",
xForwardedPrefix: "/prefix",
}, },
}, },
{ {
@ -68,6 +70,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "", xForwardedFor: "",
@ -75,6 +78,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "", xForwardedMethod: "",
xForwardedTLSClientCert: "", xForwardedTLSClientCert: "",
xForwardedTLSClientCertInfo: "", xForwardedTLSClientCertInfo: "",
xForwardedPrefix: "",
}, },
}, },
{ {
@ -88,6 +92,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "10.0.1.0, 10.0.1.12", xForwardedFor: "10.0.1.0, 10.0.1.12",
@ -95,6 +100,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "GET", xForwardedMethod: "GET",
xForwardedTLSClientCert: "Cert", xForwardedTLSClientCert: "Cert",
xForwardedTLSClientCertInfo: "CertInfo", xForwardedTLSClientCertInfo: "CertInfo",
xForwardedPrefix: "/prefix",
}, },
}, },
{ {
@ -108,6 +114,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "", xForwardedFor: "",
@ -115,6 +122,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "", xForwardedMethod: "",
xForwardedTLSClientCert: "", xForwardedTLSClientCert: "",
xForwardedTLSClientCertInfo: "", xForwardedTLSClientCertInfo: "",
xForwardedPrefix: "",
}, },
}, },
{ {
@ -128,6 +136,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "10.0.1.0, 10.0.1.12", xForwardedFor: "10.0.1.0, 10.0.1.12",
@ -135,6 +144,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "GET", xForwardedMethod: "GET",
xForwardedTLSClientCert: "Cert", xForwardedTLSClientCert: "Cert",
xForwardedTLSClientCertInfo: "CertInfo", xForwardedTLSClientCertInfo: "CertInfo",
xForwardedPrefix: "/prefix",
}, },
}, },
{ {
@ -148,6 +158,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: {"GET"}, xForwardedMethod: {"GET"},
xForwardedTLSClientCert: {"Cert"}, xForwardedTLSClientCert: {"Cert"},
xForwardedTLSClientCertInfo: {"CertInfo"}, xForwardedTLSClientCertInfo: {"CertInfo"},
xForwardedPrefix: {"/prefix"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
xForwardedFor: "", xForwardedFor: "",
@ -155,6 +166,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedMethod: "", xForwardedMethod: "",
xForwardedTLSClientCert: "", xForwardedTLSClientCert: "",
xForwardedTLSClientCertInfo: "", xForwardedTLSClientCertInfo: "",
xForwardedPrefix: "",
}, },
}, },
{ {
@ -283,6 +295,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
xForwardedProto: {"foo"}, xForwardedProto: {"foo"},
@ -293,6 +306,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: {"foo"}, xForwardedPort: {"foo"},
xForwardedTLSClientCert: {"foo"}, xForwardedTLSClientCert: {"foo"},
xForwardedTLSClientCertInfo: {"foo"}, xForwardedTLSClientCertInfo: {"foo"},
xForwardedPrefix: {"foo"},
xRealIP: {"foo"}, xRealIP: {"foo"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
@ -304,6 +318,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: "80", xForwardedPort: "80",
xForwardedTLSClientCert: "", xForwardedTLSClientCert: "",
xForwardedTLSClientCertInfo: "", xForwardedTLSClientCertInfo: "",
xForwardedPrefix: "",
xRealIP: "", xRealIP: "",
connection: "", connection: "",
}, },
@ -321,6 +336,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
xForwardedProto: {"foo"}, xForwardedProto: {"foo"},
@ -331,6 +347,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: {"foo"}, xForwardedPort: {"foo"},
xForwardedTLSClientCert: {"foo"}, xForwardedTLSClientCert: {"foo"},
xForwardedTLSClientCertInfo: {"foo"}, xForwardedTLSClientCertInfo: {"foo"},
xForwardedPrefix: {"foo"},
xRealIP: {"foo"}, xRealIP: {"foo"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
@ -342,6 +359,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: "foo", xForwardedPort: "foo",
xForwardedTLSClientCert: "foo", xForwardedTLSClientCert: "foo",
xForwardedTLSClientCertInfo: "foo", xForwardedTLSClientCertInfo: "foo",
xForwardedPrefix: "foo",
xRealIP: "foo", xRealIP: "foo",
connection: "", connection: "",
}, },
@ -358,6 +376,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
incomingHeaders: map[string][]string{ incomingHeaders: map[string][]string{
@ -370,6 +389,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
xForwardedProto: {"foo"}, xForwardedProto: {"foo"},
@ -380,6 +400,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: {"foo"}, xForwardedPort: {"foo"},
xForwardedTLSClientCert: {"foo"}, xForwardedTLSClientCert: {"foo"},
xForwardedTLSClientCertInfo: {"foo"}, xForwardedTLSClientCertInfo: {"foo"},
xForwardedPrefix: {"foo"},
xRealIP: {"foo"}, xRealIP: {"foo"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
@ -391,6 +412,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: "80", xForwardedPort: "80",
xForwardedTLSClientCert: "", xForwardedTLSClientCert: "",
xForwardedTLSClientCertInfo: "", xForwardedTLSClientCertInfo: "",
xForwardedPrefix: "",
xRealIP: "", xRealIP: "",
connection: "", connection: "",
}, },
@ -407,6 +429,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
incomingHeaders: map[string][]string{ incomingHeaders: map[string][]string{
@ -419,6 +442,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort, xForwardedPort,
xForwardedTLSClientCert, xForwardedTLSClientCert,
xForwardedTLSClientCertInfo, xForwardedTLSClientCertInfo,
xForwardedPrefix,
xRealIP, xRealIP,
}, },
xForwardedProto: {"foo"}, xForwardedProto: {"foo"},
@ -429,6 +453,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: {"foo"}, xForwardedPort: {"foo"},
xForwardedTLSClientCert: {"foo"}, xForwardedTLSClientCert: {"foo"},
xForwardedTLSClientCertInfo: {"foo"}, xForwardedTLSClientCertInfo: {"foo"},
xForwardedPrefix: {"foo"},
xRealIP: {"foo"}, xRealIP: {"foo"},
}, },
expectedHeaders: map[string]string{ expectedHeaders: map[string]string{
@ -440,6 +465,7 @@ func TestServeHTTP(t *testing.T) {
xForwardedPort: "foo", xForwardedPort: "foo",
xForwardedTLSClientCert: "foo", xForwardedTLSClientCert: "foo",
xForwardedTLSClientCertInfo: "foo", xForwardedTLSClientCertInfo: "foo",
xForwardedPrefix: "foo",
xRealIP: "foo", xRealIP: "foo",
connection: "", connection: "",
}, },

View file

@ -76,7 +76,7 @@ func NewMuxer() (*Muxer, error) {
// Match returns the handler of the first route matching the connection metadata, // Match returns the handler of the first route matching the connection metadata,
// and whether the match is exactly from the rule HostSNI(*). // and whether the match is exactly from the rule HostSNI(*).
func (m Muxer) Match(meta ConnData) (tcp.Handler, bool) { func (m *Muxer) Match(meta ConnData) (tcp.Handler, bool) {
for _, route := range m.routes { for _, route := range m.routes {
if route.matchers.match(meta) { if route.matchers.match(meta) {
return route.handler, route.catchAll return route.handler, route.catchAll

View file

@ -67,8 +67,8 @@ type ProviderAggregator struct {
} }
// NewProviderAggregator returns an aggregate of all the providers configured in the static configuration. // NewProviderAggregator returns an aggregate of all the providers configured in the static configuration.
func NewProviderAggregator(conf static.Providers) ProviderAggregator { func NewProviderAggregator(conf static.Providers) *ProviderAggregator {
p := ProviderAggregator{ p := &ProviderAggregator{
providersThrottleDuration: time.Duration(conf.ProvidersThrottleDuration), providersThrottleDuration: time.Duration(conf.ProvidersThrottleDuration),
} }
@ -168,12 +168,12 @@ func (p *ProviderAggregator) AddProvider(provider provider.Provider) error {
} }
// Init the provider. // Init the provider.
func (p ProviderAggregator) Init() error { func (p *ProviderAggregator) Init() error {
return nil return nil
} }
// Provide calls the provide method of every providers. // Provide calls the provide method of every providers.
func (p ProviderAggregator) Provide(configurationChan chan<- dynamic.Message, pool *safe.Pool) error { func (p *ProviderAggregator) Provide(configurationChan chan<- dynamic.Message, pool *safe.Pool) error {
if p.fileProvider != nil { if p.fileProvider != nil {
p.launchProvider(configurationChan, pool, p.fileProvider) p.launchProvider(configurationChan, pool, p.fileProvider)
} }
@ -193,7 +193,7 @@ func (p ProviderAggregator) Provide(configurationChan chan<- dynamic.Message, po
return nil return nil
} }
func (p ProviderAggregator) launchProvider(configurationChan chan<- dynamic.Message, pool *safe.Pool, prd provider.Provider) { func (p *ProviderAggregator) launchProvider(configurationChan chan<- dynamic.Message, pool *safe.Pool, prd provider.Provider) {
jsonConf, err := redactor.RemoveCredentials(prd) jsonConf, err := redactor.RemoveCredentials(prd)
if err != nil { if err != nil {
log.Debug().Err(err).Msgf("Cannot marshal the provider configuration %T", prd) log.Debug().Err(err).Msgf("Cannot marshal the provider configuration %T", prd)

View file

@ -15,8 +15,7 @@ import (
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
) )
func Int(v int) *int { return &v } func pointer[T any](v T) *T { return &v }
func Bool(v bool) *bool { return &v }
func TestDefaultRule(t *testing.T) { func TestDefaultRule(t *testing.T) {
testCases := []struct { testCases := []struct {
@ -67,7 +66,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -125,7 +124,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -175,7 +174,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -225,7 +224,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -281,7 +280,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -375,7 +374,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -436,7 +435,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "https://127.0.0.1:443", URL: "https://127.0.0.1:443",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -530,7 +529,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "https://127.0.0.2:444", URL: "https://127.0.0.2:444",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -615,7 +614,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -628,7 +627,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -695,7 +694,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -759,7 +758,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -826,7 +825,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -882,7 +881,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -939,7 +938,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -988,7 +987,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1050,7 +1049,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1102,7 +1101,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1115,7 +1114,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1297,7 +1296,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1352,7 +1351,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1433,7 +1432,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1501,7 +1500,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1585,7 +1584,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1649,7 +1648,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1727,7 +1726,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1797,7 +1796,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1853,7 +1852,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1910,7 +1909,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "h2c://127.0.0.1:8080", URL: "h2c://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1961,7 +1960,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1974,7 +1973,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:8080", URL: "http://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2207,7 +2206,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2274,7 +2273,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2710,7 +2709,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2801,7 +2800,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3019,7 +3018,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "https://127.0.0.1:80", URL: "https://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3033,7 +3032,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "https://127.0.0.2:80", URL: "https://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3319,7 +3318,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3495,7 +3494,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3508,7 +3507,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:81", URL: "http://127.0.0.1:81",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3611,7 +3610,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:81", URL: "http://127.0.0.1:81",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3691,7 +3690,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3704,7 +3703,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:81", URL: "http://127.0.0.1:81",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3803,7 +3802,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3816,7 +3815,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:81", URL: "http://127.0.0.1:81",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3829,7 +3828,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:82", URL: "http://127.0.0.1:82",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3842,7 +3841,7 @@ func TestFilterHealthStatuses(t *testing.T) {
URL: "http://127.0.0.1:83", URL: "http://127.0.0.1:83",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },

View file

@ -74,7 +74,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -137,7 +137,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -202,7 +202,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -259,7 +259,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -316,7 +316,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -379,7 +379,7 @@ func TestDynConfBuilder_DefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -613,7 +613,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -696,7 +696,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -709,7 +709,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -792,7 +792,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -856,7 +856,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -921,7 +921,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -978,7 +978,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1048,7 +1048,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1108,7 +1108,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1121,7 +1121,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1185,7 +1185,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1431,7 +1431,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1494,7 +1494,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1594,7 +1594,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1681,7 +1681,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1790,7 +1790,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1871,7 +1871,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1974,7 +1974,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2060,7 +2060,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2136,7 +2136,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2149,7 +2149,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2213,7 +2213,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2278,7 +2278,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "h2c://127.0.0.1:8080", URL: "h2c://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2337,7 +2337,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2350,7 +2350,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:8080", URL: "http://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2554,7 +2554,7 @@ func TestDynConfBuilder_build(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"Test": { "Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2819,7 +2819,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2894,7 +2894,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3368,7 +3368,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3549,7 +3549,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://192.168.0.1:8081", URL: "http://192.168.0.1:8081",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3612,7 +3612,7 @@ func TestDynConfBuilder_build(t *testing.T) {
URL: "http://127.0.0.1:79", URL: "http://127.0.0.1:79",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -4031,6 +4031,4 @@ func TestDynConfBuilder_getIPAddress_swarm(t *testing.T) {
} }
} }
func Int(v int) *int { return &v } func pointer[T any](v T) *T { return &v }
func Bool(v bool) *bool { return &v }

View file

@ -14,8 +14,7 @@ import (
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
) )
func Int(v int) *int { return &v } func pointer[T any](v T) *T { return &v }
func Bool(v bool) *bool { return &v }
func TestDefaultRule(t *testing.T) { func TestDefaultRule(t *testing.T) {
testCases := []struct { testCases := []struct {
@ -69,7 +68,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://10.0.0.1:1337", URL: "http://10.0.0.1:1337",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -127,7 +126,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -187,7 +186,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -239,7 +238,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -291,7 +290,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -349,7 +348,7 @@ func TestDefaultRule(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -558,7 +557,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -631,7 +630,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -644,7 +643,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -717,7 +716,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -776,7 +775,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -836,7 +835,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -888,7 +887,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -953,7 +952,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1008,7 +1007,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1021,7 +1020,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1080,7 +1079,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1291,7 +1290,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1349,7 +1348,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1439,7 +1438,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1516,7 +1515,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1610,7 +1609,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1681,7 +1680,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1769,7 +1768,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.3:80", URL: "http://127.0.0.3:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1846,7 +1845,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1912,7 +1911,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1925,7 +1924,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1984,7 +1983,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2044,7 +2043,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "h2c://127.0.0.1:8080", URL: "h2c://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2104,7 +2103,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "h2c://127.0.0.1:8040", URL: "h2c://127.0.0.1:8040",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2172,7 +2171,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:32124", URL: "http://127.0.0.1:32124",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2185,7 +2184,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:32123", URL: "http://127.0.0.1:32123",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2239,7 +2238,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2252,7 +2251,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:8080", URL: "http://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2542,7 +2541,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2612,7 +2611,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3046,7 +3045,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3206,7 +3205,7 @@ func Test_buildConfiguration(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },

View file

@ -363,7 +363,7 @@ func (c configBuilder) buildServersLB(namespace string, svc traefikv1alpha1.Load
return &dynamic.Service{LoadBalancer: lb}, nil return &dynamic.Service{LoadBalancer: lb}, nil
} }
func (c *configBuilder) makeServersTransportKey(parentNamespace string, serversTransportName string) (string, error) { func (c configBuilder) makeServersTransportKey(parentNamespace string, serversTransportName string) (string, error) {
if serversTransportName == "" { if serversTransportName == "" {
return "", nil return "", nil
} }

File diff suppressed because it is too large Load diff

View file

@ -126,8 +126,8 @@ func Test_parseServiceConfig(t *testing.T) {
}, },
ServersScheme: "protocol", ServersScheme: "protocol",
ServersTransport: "foobar@file", ServersTransport: "foobar@file",
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
NativeLB: Bool(true), NativeLB: pointer(true),
}, },
}, },
}, },
@ -139,7 +139,7 @@ func Test_parseServiceConfig(t *testing.T) {
expected: &ServiceConfig{ expected: &ServiceConfig{
Service: &ServiceIng{ Service: &ServiceIng{
Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}}, Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}},
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
}, },
}, },
}, },

View file

@ -22,7 +22,7 @@ import (
var _ provider.Provider = (*Provider)(nil) var _ provider.Provider = (*Provider)(nil)
func Bool(v bool) *bool { return &v } func pointer[T any](v T) *T { return &v }
func TestLoadConfigurationFromIngresses(t *testing.T) { func TestLoadConfigurationFromIngresses(t *testing.T) {
testCases := []struct { testCases := []struct {
@ -67,7 +67,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -117,7 +117,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -161,7 +161,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -197,7 +197,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -233,7 +233,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -269,7 +269,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -301,7 +301,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -333,7 +333,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-example-com-80": { "testing-example-com-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -366,7 +366,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -402,7 +402,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -438,7 +438,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -454,7 +454,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
}, },
"testing-service2-8082": { "testing-service2-8082": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -487,7 +487,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -523,7 +523,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"default-backend": { "default-backend": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -555,7 +555,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -587,7 +587,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-tchouk": { "testing-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -619,7 +619,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-tchouk": { "testing-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -655,7 +655,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-tchouk": { "testing-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -671,7 +671,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
}, },
"testing-service1-carotte": { "testing-service1-carotte": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -703,7 +703,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-tchouk": { "testing-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -739,7 +739,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-tchouk": { "testing-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -755,7 +755,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
}, },
"toto-service1-tchouk": { "toto-service1-tchouk": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -807,7 +807,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-8080": { "testing-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -837,7 +837,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-example-com-80": { "testing-example-com-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -876,7 +876,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-443": { "testing-service1-443": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -908,7 +908,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-8443": { "testing-service1-8443": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -941,7 +941,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-8443": { "testing-service1-8443": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -975,7 +975,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"default-backend": { "default-backend": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1007,7 +1007,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1079,7 +1079,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1114,7 +1114,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1144,7 +1144,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1173,7 +1173,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1202,7 +1202,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1231,7 +1231,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1260,7 +1260,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1289,7 +1289,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1321,7 +1321,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1353,7 +1353,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1382,7 +1382,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-80": { "testing-service1-80": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1437,7 +1437,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-foobar": { "testing-service1-foobar": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1478,7 +1478,7 @@ func TestLoadConfigurationFromIngresses(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"default-backend": { "default-backend": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1545,7 +1545,7 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) {
Services: map[string]*dynamic.Service{ Services: map[string]*dynamic.Service{
"testing-service1-8080": { "testing-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1579,7 +1579,7 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) {
URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]:8080", URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1609,7 +1609,7 @@ func TestLoadConfigurationFromIngressesWithExternalNameServices(t *testing.T) {
URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:2a3b]:8080", URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:2a3b]:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1657,7 +1657,7 @@ func TestLoadConfigurationFromIngressesWithNativeLB(t *testing.T) {
"testing-service1-8080": { "testing-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval}, ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval},
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://10.0.0.1:8080", URL: "http://10.0.0.1:8080",
@ -1706,7 +1706,7 @@ func TestLoadConfigurationFromIngressesWithNodePortLB(t *testing.T) {
"testing-service1-8080": { "testing-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval}, ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval},
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://172.16.4.4:32456", URL: "http://172.16.4.4:32456",
@ -1943,7 +1943,7 @@ func TestLoadConfigurationFromIngressesWithNativeLBByDefault(t *testing.T) {
"testing-service1-8080": { "testing-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval}, ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval},
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://10.0.0.1:8080", URL: "http://10.0.0.1:8080",
@ -1970,7 +1970,7 @@ func TestLoadConfigurationFromIngressesWithNativeLBByDefault(t *testing.T) {
"default-service1-8080": { "default-service1-8080": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval}, ResponseForwarding: &dynamic.ResponseForwarding{FlushInterval: dynamic.DefaultFlushInterval},
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: "http://10.0.0.1:8080", URL: "http://10.0.0.1:8080",

View file

@ -15,8 +15,7 @@ import (
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
) )
func Bool(v bool) *bool { return &v } func pointer[T any](v T) *T { return &v }
func String(v string) *string { return &v }
func Test_buildConfiguration(t *testing.T) { func Test_buildConfiguration(t *testing.T) {
provider := newProviderMock(mapToPairs(map[string]string{ provider := newProviderMock(mapToPairs(map[string]string{
@ -385,7 +384,7 @@ func Test_buildConfiguration(t *testing.T) {
"foobar", "foobar",
"foobar", "foobar",
}, },
ForceSlash: Bool(true), ForceSlash: pointer(true),
}, },
}, },
"Middleware00": { "Middleware00": {
@ -428,7 +427,7 @@ func Test_buildConfiguration(t *testing.T) {
Cert: "foobar", Cert: "foobar",
Key: "foobar", Key: "foobar",
InsecureSkipVerify: true, InsecureSkipVerify: true,
CAOptional: Bool(true), CAOptional: pointer(true),
}, },
TrustForwardHeader: true, TrustForwardHeader: true,
AuthResponseHeaders: []string{ AuthResponseHeaders: []string{
@ -601,14 +600,14 @@ func Test_buildConfiguration(t *testing.T) {
"foobar", "foobar",
"foobar", "foobar",
}, },
SSLRedirect: Bool(true), SSLRedirect: pointer(true),
SSLTemporaryRedirect: Bool(true), SSLTemporaryRedirect: pointer(true),
SSLHost: String("foobar"), SSLHost: pointer("foobar"),
SSLProxyHeaders: map[string]string{ SSLProxyHeaders: map[string]string{
"name1": "foobar", "name1": "foobar",
"name0": "foobar", "name0": "foobar",
}, },
SSLForceHost: Bool(true), SSLForceHost: pointer(true),
STSSeconds: 42, STSSeconds: 42,
STSIncludeSubdomains: true, STSIncludeSubdomains: true,
STSPreload: true, STSPreload: true,
@ -622,7 +621,7 @@ func Test_buildConfiguration(t *testing.T) {
ContentSecurityPolicyReportOnly: "foobar", ContentSecurityPolicyReportOnly: "foobar",
PublicKey: "foobar", PublicKey: "foobar",
ReferrerPolicy: "foobar", ReferrerPolicy: "foobar",
FeaturePolicy: String("foobar"), FeaturePolicy: pointer("foobar"),
PermissionsPolicy: "foobar", PermissionsPolicy: "foobar",
IsDevelopment: true, IsDevelopment: true,
}, },
@ -662,13 +661,13 @@ func Test_buildConfiguration(t *testing.T) {
Interval: ptypes.Duration(time.Second), Interval: ptypes.Duration(time.Second),
Timeout: ptypes.Duration(time.Second), Timeout: ptypes.Duration(time.Second),
Hostname: "foobar", Hostname: "foobar",
FollowRedirects: func(v bool) *bool { return &v }(true), FollowRedirects: pointer(true),
Headers: map[string]string{ Headers: map[string]string{
"name0": "foobar", "name0": "foobar",
"name1": "foobar", "name1": "foobar",
}, },
}, },
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(time.Second), FlushInterval: ptypes.Duration(time.Second),
}, },
@ -677,8 +676,8 @@ func Test_buildConfiguration(t *testing.T) {
"Service02": { "Service02": {
Mirroring: &dynamic.Mirroring{ Mirroring: &dynamic.Mirroring{
Service: "foobar", Service: "foobar",
MirrorBody: func(v bool) *bool { return &v }(true), MirrorBody: pointer(true),
MaxBodySize: func(v int64) *int64 { return &v }(42), MaxBodySize: pointer[int64](42),
Mirrors: []dynamic.MirrorService{ Mirrors: []dynamic.MirrorService{
{ {
Name: "foobar", Name: "foobar",
@ -696,11 +695,11 @@ func Test_buildConfiguration(t *testing.T) {
Services: []dynamic.WRRService{ Services: []dynamic.WRRService{
{ {
Name: "foobar", Name: "foobar",
Weight: func(v int) *int { return &v }(42), Weight: pointer(42),
}, },
{ {
Name: "foobar", Name: "foobar",
Weight: func(v int) *int { return &v }(42), Weight: pointer(42),
}, },
}, },
Sticky: &dynamic.Sticky{ Sticky: &dynamic.Sticky{
@ -784,7 +783,7 @@ func Test_buildConfiguration(t *testing.T) {
Services: map[string]*dynamic.TCPService{ Services: map[string]*dynamic.TCPService{
"TCPService01": { "TCPService01": {
LoadBalancer: &dynamic.TCPServersLoadBalancer{ LoadBalancer: &dynamic.TCPServersLoadBalancer{
TerminationDelay: func(v int) *int { return &v }(42), TerminationDelay: pointer(42),
Servers: []dynamic.TCPServer{ Servers: []dynamic.TCPServer{
{Address: "foobar"}, {Address: "foobar"},
{Address: "foobar"}, {Address: "foobar"},
@ -796,11 +795,11 @@ func Test_buildConfiguration(t *testing.T) {
Services: []dynamic.TCPWRRService{ Services: []dynamic.TCPWRRService{
{ {
Name: "foobar", Name: "foobar",
Weight: func(v int) *int { return &v }(42), Weight: pointer(42),
}, },
{ {
Name: "foobar", Name: "foobar",
Weight: func(v int) *int { return &v }(43), Weight: pointer(43),
}, },
}, },
}, },

View file

@ -61,7 +61,7 @@ func Test_defaultRule(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -119,7 +119,7 @@ func Test_defaultRule(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -168,7 +168,7 @@ func Test_defaultRule(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -223,7 +223,7 @@ func Test_defaultRule(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -301,7 +301,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -368,7 +368,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://192.168.1.101:9999", URL: "http://192.168.1.101:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -381,7 +381,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://192.168.1.102:9999", URL: "http://192.168.1.102:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -448,7 +448,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -512,7 +512,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -579,7 +579,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -635,7 +635,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -692,7 +692,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -777,7 +777,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -839,7 +839,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -891,7 +891,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -904,7 +904,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1087,7 +1087,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1142,7 +1142,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1224,7 +1224,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1293,7 +1293,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1356,7 +1356,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1424,7 +1424,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1480,7 +1480,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1537,7 +1537,7 @@ func Test_buildConfig(t *testing.T) {
URL: "h2c://127.0.0.1:8080", URL: "h2c://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1588,7 +1588,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1601,7 +1601,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:8080", URL: "http://127.0.0.1:8080",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1800,7 +1800,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -1867,7 +1867,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2279,7 +2279,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2370,7 +2370,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:9999", URL: "http://127.0.0.2:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2587,7 +2587,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:80", URL: "http://127.0.0.1:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2600,7 +2600,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.2:80", URL: "http://127.0.0.2:80",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2819,7 +2819,7 @@ func Test_buildConfig(t *testing.T) {
URL: "http://127.0.0.1:9999", URL: "http://127.0.0.1:9999",
}, },
}, },
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -2906,7 +2906,7 @@ func Test_buildConfigAllowEmptyServicesTrue(t *testing.T) {
"Test": { "Test": {
LoadBalancer: &dynamic.ServersLoadBalancer{ LoadBalancer: &dynamic.ServersLoadBalancer{
Servers: nil, Servers: nil,
PassHostHeader: Bool(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(100 * time.Millisecond), FlushInterval: ptypes.Duration(100 * time.Millisecond),
}, },
@ -3254,5 +3254,4 @@ func extractNamespacesFromProvider(providers []*Provider) []string {
return res return res
} }
func Int(v int) *int { return &v } func pointer[T any](v T) *T { return &v }
func Bool(v bool) *bool { return &v }

View file

@ -32,7 +32,7 @@ func New(staticCfg static.Configuration) *Provider {
} }
// ThrottleDuration returns the throttle duration. // ThrottleDuration returns the throttle duration.
func (i Provider) ThrottleDuration() time.Duration { func (i *Provider) ThrottleDuration() time.Duration {
return 0 return 0
} }

View file

@ -78,12 +78,12 @@ func init() {
Interval: ptypes.Duration(111 * time.Second), Interval: ptypes.Duration(111 * time.Second),
Timeout: ptypes.Duration(111 * time.Second), Timeout: ptypes.Duration(111 * time.Second),
Hostname: "foo", Hostname: "foo",
FollowRedirects: boolPtr(true), FollowRedirects: pointer(true),
Headers: map[string]string{ Headers: map[string]string{
"foo": "bar", "foo": "bar",
}, },
}, },
PassHostHeader: boolPtr(true), PassHostHeader: pointer(true),
ResponseForwarding: &dynamic.ResponseForwarding{ ResponseForwarding: &dynamic.ResponseForwarding{
FlushInterval: ptypes.Duration(111 * time.Second), FlushInterval: ptypes.Duration(111 * time.Second),
}, },
@ -100,7 +100,7 @@ func init() {
Services: []dynamic.WRRService{ Services: []dynamic.WRRService{
{ {
Name: "foo", Name: "foo",
Weight: intPtr(42), Weight: pointer(42),
}, },
}, },
Sticky: &dynamic.Sticky{ Sticky: &dynamic.Sticky{
@ -116,7 +116,7 @@ func init() {
"baz": { "baz": {
Mirroring: &dynamic.Mirroring{ Mirroring: &dynamic.Mirroring{
Service: "foo", Service: "foo",
MaxBodySize: int64Ptr(42), MaxBodySize: pointer[int64](42),
Mirrors: []dynamic.MirrorService{ Mirrors: []dynamic.MirrorService{
{ {
Name: "foo", Name: "foo",
@ -380,7 +380,7 @@ func init() {
Services: []dynamic.TCPWRRService{ Services: []dynamic.TCPWRRService{
{ {
Name: "foo", Name: "foo",
Weight: intPtr(42), Weight: pointer(42),
}, },
}, },
}, },
@ -427,7 +427,7 @@ func init() {
Services: []dynamic.UDPWRRService{ Services: []dynamic.UDPWRRService{
{ {
Name: "foo", Name: "foo",
Weight: intPtr(42), Weight: pointer(42),
}, },
}, },
}, },
@ -484,7 +484,7 @@ func TestAnonymize_dynamicConfiguration(t *testing.T) {
} }
expected := strings.TrimSuffix(string(expectedConfiguration), "\n") expected := strings.TrimSuffix(string(expectedConfiguration), "\n")
assert.Equal(t, expected, cleanJSON) assert.JSONEq(t, expected, cleanJSON)
} }
func TestSecure_dynamicConfiguration(t *testing.T) { func TestSecure_dynamicConfiguration(t *testing.T) {
@ -501,7 +501,7 @@ func TestSecure_dynamicConfiguration(t *testing.T) {
} }
expected := strings.TrimSuffix(string(expectedConfiguration), "\n") expected := strings.TrimSuffix(string(expectedConfiguration), "\n")
assert.Equal(t, expected, cleanJSON) assert.JSONEq(t, expected, cleanJSON)
} }
func TestDo_staticConfiguration(t *testing.T) { func TestDo_staticConfiguration(t *testing.T) {
@ -950,17 +950,7 @@ func TestDo_staticConfiguration(t *testing.T) {
} }
expected := strings.TrimSuffix(string(expectedConfiguration), "\n") expected := strings.TrimSuffix(string(expectedConfiguration), "\n")
assert.Equal(t, expected, cleanJSON) assert.JSONEq(t, expected, cleanJSON)
} }
func boolPtr(value bool) *bool { func pointer[T any](v T) *T { return &v }
return &value
}
func intPtr(value int) *int {
return &value
}
func int64Ptr(value int64) *int64 {
return &value
}

View file

@ -323,7 +323,7 @@ func TestListenProvidersThrottleProviderConfigReload(t *testing.T) {
}) })
} }
providerAggregator := aggregator.ProviderAggregator{} providerAggregator := &aggregator.ProviderAggregator{}
err := providerAggregator.AddProvider(pvd) err := providerAggregator.AddProvider(pvd)
assert.NoError(t, err) assert.NoError(t, err)
@ -507,7 +507,7 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) {
}, },
} }
providerAggregator := aggregator.ProviderAggregator{} providerAggregator := &aggregator.ProviderAggregator{}
err := providerAggregator.AddProvider(pvd) err := providerAggregator.AddProvider(pvd)
assert.NoError(t, err) assert.NoError(t, err)
@ -651,7 +651,7 @@ func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) {
}, },
} }
providerAggregator := aggregator.ProviderAggregator{} providerAggregator := &aggregator.ProviderAggregator{}
err := providerAggregator.AddProvider(pvd) err := providerAggregator.AddProvider(pvd)
assert.NoError(t, err) assert.NoError(t, err)

View file

@ -364,7 +364,7 @@ func clientHelloInfo(br *bufio.Reader) (*clientHello, error) {
if err != nil { if err != nil {
var opErr *net.OpError var opErr *net.OpError
if !errors.Is(err, io.EOF) && (!errors.As(err, &opErr) || !opErr.Timeout()) { if !errors.Is(err, io.EOF) && (!errors.As(err, &opErr) || !opErr.Timeout()) {
log.Error().Err(err).Msg("Error while Peeking first byte") log.Debug().Err(err).Msg("Error while Peeking first byte")
} }
return nil, err return nil, err
} }
@ -390,7 +390,7 @@ func clientHelloInfo(br *bufio.Reader) (*clientHello, error) {
const recordHeaderLen = 5 const recordHeaderLen = 5
hdr, err = br.Peek(recordHeaderLen) hdr, err = br.Peek(recordHeaderLen)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Error while Peeking hello") log.Error().Err(err).Msg("Error while peeking client hello header")
return &clientHello{ return &clientHello{
peeked: getPeeked(br), peeked: getPeeked(br),
}, nil }, nil
@ -404,7 +404,7 @@ func clientHelloInfo(br *bufio.Reader) (*clientHello, error) {
helloBytes, err := br.Peek(recordHeaderLen + recLen) helloBytes, err := br.Peek(recordHeaderLen + recLen)
if err != nil { if err != nil {
log.Error().Err(err).Msg("Error while Hello") log.Error().Err(err).Msg("Error while peeking client hello bytes")
return &clientHello{ return &clientHello{
isTLS: true, isTLS: true,
peeked: getPeeked(br), peeked: getPeeked(br),
@ -433,7 +433,7 @@ func clientHelloInfo(br *bufio.Reader) (*clientHello, error) {
func getPeeked(br *bufio.Reader) string { func getPeeked(br *bufio.Reader) string {
peeked, err := br.Peek(br.Buffered()) peeked, err := br.Peek(br.Buffered())
if err != nil { if err != nil {
log.Error().Err(err).Msg("Could not get anything") log.Error().Err(err).Msg("Error while peeking bytes")
return "" return ""
} }
return string(peeked) return string(peeked)

View file

@ -10,18 +10,20 @@ import (
"github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/config/dynamic"
) )
func pointer[T any](v T) *T { return &v }
func TestBalancer(t *testing.T) { func TestBalancer(t *testing.T) {
balancer := New(nil, false) balancer := New(nil, false)
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(3)) }), pointer(3))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "second") rw.Header().Set("server", "second")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for range 4 { for range 4 {
@ -47,9 +49,9 @@ func TestBalancerOneServerZeroWeight(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), Int(0)) balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), pointer(0))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
for range 3 { for range 3 {
@ -68,11 +70,11 @@ func TestBalancerNoServiceUp(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusInternalServerError) rw.WriteHeader(http.StatusInternalServerError)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusInternalServerError) rw.WriteHeader(http.StatusInternalServerError)
}), Int(1)) }), pointer(1))
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "first", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "first", false)
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false)
@ -89,11 +91,11 @@ func TestBalancerOneServerDown(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(http.StatusInternalServerError) rw.WriteHeader(http.StatusInternalServerError)
}), Int(1)) }), pointer(1))
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false)
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
@ -110,12 +112,12 @@ func TestBalancerDownThenUp(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "second") rw.Header().Set("server", "second")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false) balancer.SetStatus(context.WithValue(context.Background(), serviceName, "parent"), "second", false)
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
@ -139,30 +141,30 @@ func TestBalancerPropagate(t *testing.T) {
balancer1.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer1.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer1.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer1.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "second") rw.Header().Set("server", "second")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer2 := New(nil, true) balancer2 := New(nil, true)
balancer2.Add("third", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer2.Add("third", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "third") rw.Header().Set("server", "third")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer2.Add("fourth", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer2.Add("fourth", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "fourth") rw.Header().Set("server", "fourth")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
topBalancer := New(nil, true) topBalancer := New(nil, true)
topBalancer.Add("balancer1", balancer1, Int(1)) topBalancer.Add("balancer1", balancer1, pointer(1))
_ = balancer1.RegisterStatusUpdater(func(up bool) { _ = balancer1.RegisterStatusUpdater(func(up bool) {
topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer1", up) topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer1", up)
// TODO(mpl): if test gets flaky, add channel or something here to signal that // TODO(mpl): if test gets flaky, add channel or something here to signal that
// propagation is done, and wait on it before sending request. // propagation is done, and wait on it before sending request.
}) })
topBalancer.Add("balancer2", balancer2, Int(1)) topBalancer.Add("balancer2", balancer2, pointer(1))
_ = balancer2.RegisterStatusUpdater(func(up bool) { _ = balancer2.RegisterStatusUpdater(func(up bool) {
topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer2", up) topBalancer.SetStatus(context.WithValue(context.Background(), serviceName, "top"), "balancer2", up)
}) })
@ -209,8 +211,8 @@ func TestBalancerPropagate(t *testing.T) {
func TestBalancerAllServersZeroWeight(t *testing.T) { func TestBalancerAllServersZeroWeight(t *testing.T) {
balancer := New(nil, false) balancer := New(nil, false)
balancer.Add("test", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), Int(0)) balancer.Add("test", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), pointer(0))
balancer.Add("test2", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), Int(0)) balancer.Add("test2", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {}), pointer(0))
recorder := httptest.NewRecorder() recorder := httptest.NewRecorder()
balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) balancer.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil))
@ -232,12 +234,12 @@ func TestSticky(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "second") rw.Header().Set("server", "second")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(2)) }), pointer(2))
recorder := &responseRecorder{ recorder := &responseRecorder{
ResponseRecorder: httptest.NewRecorder(), ResponseRecorder: httptest.NewRecorder(),
@ -273,12 +275,12 @@ func TestSticky_FallBack(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "first") rw.Header().Set("server", "first")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(1)) }), pointer(1))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "second") rw.Header().Set("server", "second")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(2)) }), pointer(2))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
@ -302,12 +304,12 @@ func TestBalancerBias(t *testing.T) {
balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("first", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "A") rw.Header().Set("server", "A")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(11)) }), pointer(11))
balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { balancer.Add("second", http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.Header().Set("server", "B") rw.Header().Set("server", "B")
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
}), Int(3)) }), pointer(3))
recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}} recorder := &responseRecorder{ResponseRecorder: httptest.NewRecorder(), save: map[string]int{}}
@ -320,8 +322,6 @@ func TestBalancerBias(t *testing.T) {
assert.Equal(t, wantSequence, recorder.sequence) assert.Equal(t, wantSequence, recorder.sequence)
} }
func Int(v int) *int { return &v }
type responseRecorder struct { type responseRecorder struct {
*httptest.ResponseRecorder *httptest.ResponseRecorder
save map[string]int save map[string]int

View file

@ -20,6 +20,8 @@ import (
"github.com/traefik/traefik/v3/pkg/testhelpers" "github.com/traefik/traefik/v3/pkg/testhelpers"
) )
func pointer[T any](v T) *T { return &v }
func TestGetLoadBalancer(t *testing.T) { func TestGetLoadBalancer(t *testing.T) {
sm := Manager{ sm := Manager{
transportManager: &transportManagerMock{}, transportManager: &transportManagerMock{},
@ -235,7 +237,7 @@ func TestGetLoadBalancerServiceHandler(t *testing.T) {
serviceName: "test", serviceName: "test",
service: &dynamic.ServersLoadBalancer{ service: &dynamic.ServersLoadBalancer{
Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}}, Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}},
PassHostHeader: func(v bool) *bool { return &v }(true), PassHostHeader: pointer(true),
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {
URL: serverPassHost.URL, URL: serverPassHost.URL,
@ -253,7 +255,7 @@ func TestGetLoadBalancerServiceHandler(t *testing.T) {
desc: "PassHost doesn't pass the host instead of the IP", desc: "PassHost doesn't pass the host instead of the IP",
serviceName: "test", serviceName: "test",
service: &dynamic.ServersLoadBalancer{ service: &dynamic.ServersLoadBalancer{
PassHostHeader: boolPtr(false), PassHostHeader: pointer(false),
Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}}, Sticky: &dynamic.Sticky{Cookie: &dynamic.Cookie{}},
Servers: []dynamic.Server{ Servers: []dynamic.Server{
{ {

View file

@ -27,10 +27,6 @@ import (
"github.com/traefik/traefik/v3/pkg/types" "github.com/traefik/traefik/v3/pkg/types"
) )
func Int32(i int32) *int32 {
return &i
}
// LocalhostCert is a PEM-encoded TLS cert // LocalhostCert is a PEM-encoded TLS cert
// for host example.com, www.example.com // for host example.com, www.example.com
// expiring at Jan 29 16:00:00 2084 GMT. // expiring at Jan 29 16:00:00 2084 GMT.
@ -128,7 +124,7 @@ func TestKeepConnectionWhenSameConfiguration(t *testing.T) {
rw.WriteHeader(http.StatusOK) rw.WriteHeader(http.StatusOK)
})) }))
connCount := Int32(0) connCount := pointer[int32](0)
srv.Config.ConnState = func(conn net.Conn, state http.ConnState) { srv.Config.ConnState = func(conn net.Conn, state http.ConnState) {
if state == http.StateNew { if state == http.StateNew {
atomic.AddInt32(connCount, 1) atomic.AddInt32(connCount, 1)

View file

@ -79,7 +79,7 @@ func (p *Proxy) ServeTCP(conn WriteCloser) {
<-errChan <-errChan
} }
func (p Proxy) dialBackend() (WriteCloser, error) { func (p *Proxy) dialBackend() (WriteCloser, error) {
conn, err := p.dialer.Dial("tcp", p.address) conn, err := p.dialer.Dial("tcp", p.address)
if err != nil { if err != nil {
return nil, err return nil, err
@ -88,7 +88,7 @@ func (p Proxy) dialBackend() (WriteCloser, error) {
return conn.(WriteCloser), nil return conn.(WriteCloser), nil
} }
func (p Proxy) connCopy(dst, src WriteCloser, errCh chan error) { func (p *Proxy) connCopy(dst, src WriteCloser, errCh chan error) {
_, err := io.Copy(dst, src) _, err := io.Copy(dst, src)
errCh <- err errCh <- err

View file

@ -6,6 +6,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"net/url" "net/url"
"os"
"sort" "sort"
"strings" "strings"
@ -45,13 +46,6 @@ var (
} }
) )
// Certificate holds a SSL cert/key pair
// Certs and Key could be either a file path, or the file content itself.
type Certificate struct {
CertFile types.FileOrContent `json:"certFile,omitempty" toml:"certFile,omitempty" yaml:"certFile,omitempty"`
KeyFile types.FileOrContent `json:"keyFile,omitempty" toml:"keyFile,omitempty" yaml:"keyFile,omitempty" loggable:"false"`
}
// Certificates defines traefik certificates type // Certificates defines traefik certificates type
// Certs and Keys could be either a file path, or the file content itself. // Certs and Keys could be either a file path, or the file content itself.
type Certificates []Certificate type Certificates []Certificate
@ -73,6 +67,13 @@ func (c Certificates) GetCertificates() []tls.Certificate {
return certs return certs
} }
// Certificate holds a SSL cert/key pair
// Certs and Key could be either a file path, or the file content itself.
type Certificate struct {
CertFile types.FileOrContent `json:"certFile,omitempty" toml:"certFile,omitempty" yaml:"certFile,omitempty"`
KeyFile types.FileOrContent `json:"keyFile,omitempty" toml:"keyFile,omitempty" yaml:"keyFile,omitempty" loggable:"false"`
}
// AppendCertificate appends a Certificate to a certificates map keyed by store name. // AppendCertificate appends a Certificate to a certificates map keyed by store name.
func (c *Certificate) AppendCertificate(certs map[string]map[string]*tls.Certificate, storeName string) error { func (c *Certificate) AppendCertificate(certs map[string]map[string]*tls.Certificate, storeName string) error {
certContent, err := c.CertFile.Read() certContent, err := c.CertFile.Read()
@ -166,31 +167,6 @@ func (c *Certificate) GetCertificateFromBytes() (tls.Certificate, error) {
return cert, nil return cert, nil
} }
// GetTruncatedCertificateName truncates the certificate name.
func (c *Certificate) GetTruncatedCertificateName() string {
certName := c.CertFile.String()
// Truncate certificate information only if it's a well formed certificate content with more than 50 characters
if !c.CertFile.IsPath() && strings.HasPrefix(certName, certificateHeader) && len(certName) > len(certificateHeader)+50 {
certName = strings.TrimPrefix(c.CertFile.String(), certificateHeader)[:50]
}
return certName
}
// String is the method to format the flag's value, part of the flag.Value interface.
// The String method's output will be used in diagnostics.
func (c *Certificates) String() string {
if len(*c) == 0 {
return ""
}
var result []string
for _, certificate := range *c {
result = append(result, certificate.CertFile.String()+","+certificate.KeyFile.String())
}
return strings.Join(result, ";")
}
// Set is the method to set the flag value, part of the flag.Value interface. // Set is the method to set the flag value, part of the flag.Value interface.
// Set's argument is a string to be parsed to set the flag. // Set's argument is a string to be parsed to set the flag.
// It's a comma-separated list, so we split it. // It's a comma-separated list, so we split it.
@ -209,9 +185,43 @@ func (c *Certificates) Set(value string) error {
return nil return nil
} }
// Type is type of the struct. // GetTruncatedCertificateName truncates the certificate name.
func (c *Certificates) Type() string { func (c *Certificate) GetTruncatedCertificateName() string {
return "certificates" certName := c.CertFile.String()
// Truncate certificate information only if it's a well formed certificate content with more than 50 characters
if !c.CertFile.IsPath() && strings.HasPrefix(certName, certificateHeader) && len(certName) > len(certificateHeader)+50 {
certName = strings.TrimPrefix(c.CertFile.String(), certificateHeader)[:50]
}
return certName
}
// FileOrContent hold a file path or content.
type FileOrContent string
func (f FileOrContent) String() string {
return string(f)
}
// IsPath returns true if the FileOrContent is a file path, otherwise returns false.
func (f FileOrContent) IsPath() bool {
_, err := os.Stat(f.String())
return err == nil
}
func (f FileOrContent) Read() ([]byte, error) {
var content []byte
if f.IsPath() {
var err error
content, err = os.ReadFile(f.String())
if err != nil {
return nil, err
}
} else {
content = []byte(f)
}
return content, nil
} }
// VerifyPeerCertificate verifies the chain certificates and their URI. // VerifyPeerCertificate verifies the chain certificates and their URI.

View file

@ -31,7 +31,7 @@ func NewCertificateStore() *CertificateStore {
} }
} }
func (c CertificateStore) getDefaultCertificateDomains() []string { func (c *CertificateStore) getDefaultCertificateDomains() []string {
var allCerts []string var allCerts []string
if c.DefaultCertificate == nil { if c.DefaultCertificate == nil {
@ -58,7 +58,7 @@ func (c CertificateStore) getDefaultCertificateDomains() []string {
} }
// GetAllDomains return a slice with all the certificate domain. // GetAllDomains return a slice with all the certificate domain.
func (c CertificateStore) GetAllDomains() []string { func (c *CertificateStore) GetAllDomains() []string {
allDomains := c.getDefaultCertificateDomains() allDomains := c.getDefaultCertificateDomains()
// Get dynamic certificates // Get dynamic certificates
@ -157,7 +157,7 @@ func (c *CertificateStore) GetCertificate(domains []string) *tls.Certificate {
} }
// ResetCache clears the cache in the store. // ResetCache clears the cache in the store.
func (c CertificateStore) ResetCache() { func (c *CertificateStore) ResetCache() {
if c.CertCache != nil { if c.CertCache != nil {
c.CertCache.Flush() c.CertCache.Flush()
} }