Merge v1.7.0 into master
This commit is contained in:
parent
fdf14cd101
commit
f10516deb7
21 changed files with 403 additions and 63 deletions
164
CHANGELOG.md
164
CHANGELOG.md
|
@ -1,5 +1,169 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## [v1.7.0](https://github.com/containous/traefik/tree/v1.7.0) (2018-09-24)
|
||||||
|
[Commits](https://github.com/containous/traefik/compare/v1.7.0-rc1...v1.7.0)
|
||||||
|
[Commits pre RC](https://github.com/containous/traefik/compare/v1.6.0-rc1...v1.7.0-rc1)
|
||||||
|
|
||||||
|
**Enhancements:**
|
||||||
|
- **[acme]** Simplify get acme client ([#3499](https://github.com/containous/traefik/pull/3499) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Simplify acme e2e tests. ([#3534](https://github.com/containous/traefik/pull/3534) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Add option to select algorithm to generate ACME certificates ([#3319](https://github.com/containous/traefik/pull/3319) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[acme]** Enable to override certificates in key-value store when using storeconfig ([#3202](https://github.com/containous/traefik/pull/3202) by [thomasjpfan](https://github.com/thomasjpfan))
|
||||||
|
- **[acme]** ACME TLS ALPN ([#3553](https://github.com/containous/traefik/pull/3553) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Remove acme provider dependency in server ([#3225](https://github.com/containous/traefik/pull/3225) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[acme]** Use official Pebble Image. ([#3708](https://github.com/containous/traefik/pull/3708) by [ldez](https://github.com/ldez))
|
||||||
|
- **[api,cluster]** Improved cluster api to include the current leader node ([#3100](https://github.com/containous/traefik/pull/3100) by [aantono](https://github.com/aantono))
|
||||||
|
- **[authentication,consul,consulcatalog,docker,ecs,kv,marathon,mesos,rancher]** Auth support in frontends ([#3559](https://github.com/containous/traefik/pull/3559) by [jbdoumenjou](https://github.com/jbdoumenjou))
|
||||||
|
- **[authentication,k8s]** Auth support in frontends for k8s and file ([#3460](https://github.com/containous/traefik/pull/3460) by [Zatte](https://github.com/Zatte))
|
||||||
|
- **[authentication,middleware]** Add xforwarded method ([#3424](https://github.com/containous/traefik/pull/3424) by [erik-sjoestedt](https://github.com/erik-sjoestedt))
|
||||||
|
- **[authentication,middleware]** Forward auth headers ([#3521](https://github.com/containous/traefik/pull/3521) by [hwhelan-CB](https://github.com/hwhelan-CB))
|
||||||
|
- **[consul,etcd,tls]** Improve TLS integration tests ([#3679](https://github.com/containous/traefik/pull/3679) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[consulcatalog,docker,ecs,file,k8s,kv,marathon,mesos,rancher]** Add SSLForceHost support. ([#3246](https://github.com/containous/traefik/pull/3246) by [ldez](https://github.com/ldez))
|
||||||
|
- **[consulcatalog]** Multiple frontends for consulcatalog ([#3796](https://github.com/containous/traefik/pull/3796) by [hsmade](https://github.com/hsmade))
|
||||||
|
- **[consulcatalog]** Add support for stale reads from Consul catalog ([#3523](https://github.com/containous/traefik/pull/3523) by [marenzo](https://github.com/marenzo))
|
||||||
|
- **[docker]** Add a default value for the docker.network configuration ([#3471](https://github.com/containous/traefik/pull/3471) by [jbdoumenjou](https://github.com/jbdoumenjou))
|
||||||
|
- **[ecs]** Support for AWS ECS Fargate ([#3379](https://github.com/containous/traefik/pull/3379) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[ecs]** Add support for ECS constraints ([#3537](https://github.com/containous/traefik/pull/3537) by [andrewstucki](https://github.com/andrewstucki))
|
||||||
|
- **[ecs]** Add segment support for ECS ([#3817](https://github.com/containous/traefik/pull/3817) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[ecs]** Support `traefik.backend` for ECS ([#3510](https://github.com/containous/traefik/pull/3510) by [hwhelan-CB](https://github.com/hwhelan-CB))
|
||||||
|
- **[ecs]** Allow binding ECS container port ([#3533](https://github.com/containous/traefik/pull/3533) by [andrewstucki](https://github.com/andrewstucki))
|
||||||
|
- **[healthcheck,consul,consulcatalog,docker,ecs,kv,marathon,mesos,rancher]** Override health check scheme ([#3315](https://github.com/containous/traefik/pull/3315) by [ldez](https://github.com/ldez))
|
||||||
|
- **[healthcheck]** Support 3xx HTTP status codes for health check ([#3364](https://github.com/containous/traefik/pull/3364) by [SniperCZE](https://github.com/SniperCZE))
|
||||||
|
- **[healthcheck]** Support all 2xx HTTP status code for health check. ([#3362](https://github.com/containous/traefik/pull/3362) by [ldez](https://github.com/ldez))
|
||||||
|
- **[healthcheck]** Add HTTP headers to healthcheck. ([#3047](https://github.com/containous/traefik/pull/3047) by [zetaab](https://github.com/zetaab))
|
||||||
|
- **[k8s]** Add more k8s tests ([#3491](https://github.com/containous/traefik/pull/3491) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Substitude hardcoded "<namespace>/<name>" with k8s ListerGetter ([#3470](https://github.com/containous/traefik/pull/3470) by [yue9944882](https://github.com/yue9944882))
|
||||||
|
- **[k8s]** Custom frontend name for test helper ([#3444](https://github.com/containous/traefik/pull/3444) by [ldez](https://github.com/ldez))
|
||||||
|
- **[k8s]** Add annotation to allow modifiers to be used properly in kubernetes ([#3481](https://github.com/containous/traefik/pull/3481) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Create Global Backend Ingress ([#3404](https://github.com/containous/traefik/pull/3404) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Specify backend servers' weight via annotation for kubernetes ([#3112](https://github.com/containous/traefik/pull/3112) by [yue9944882](https://github.com/yue9944882))
|
||||||
|
- **[k8s]** Support multi-port services. ([#3121](https://github.com/containous/traefik/pull/3121) by [timoreimann](https://github.com/timoreimann))
|
||||||
|
- **[k8s]** Mapping ExternalNames to custom ports ([#3231](https://github.com/containous/traefik/pull/3231) by [gildas](https://github.com/gildas))
|
||||||
|
- **[k8s]** Allow any kubernetes ingressClass value ([#3516](https://github.com/containous/traefik/pull/3516) by [rtreffer](https://github.com/rtreffer))
|
||||||
|
- **[k8s]** Enable Ingress Status updates ([#3324](https://github.com/containous/traefik/pull/3324) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Add possibility to set a protocol ([#3648](https://github.com/containous/traefik/pull/3648) by [SantoDE](https://github.com/SantoDE))
|
||||||
|
- **[k8s]** Remove unnecessary loop ([#3799](https://github.com/containous/traefik/pull/3799) by [ZloyDyadka](https://github.com/ZloyDyadka))
|
||||||
|
- **[kv]** Use index-based syntax in KV tests. ([#3352](https://github.com/containous/traefik/pull/3352) by [ldez](https://github.com/ldez))
|
||||||
|
- **[logs,middleware]** Make accesslogs.logTheRoundTrip async to get lost performance ([#3152](https://github.com/containous/traefik/pull/3152) by [ryarnyah](https://github.com/ryarnyah))
|
||||||
|
- **[logs,middleware]** Added duration filter for logs ([#3463](https://github.com/containous/traefik/pull/3463) by [rodrigodiez](https://github.com/rodrigodiez))
|
||||||
|
- **[marathon]** Sane default and configurable Marathon request timeouts ([#3286](https://github.com/containous/traefik/pull/3286) by [marco-jantke](https://github.com/marco-jantke))
|
||||||
|
- **[marathon]** Adding compatibility for marathon 1.5 ([#3505](https://github.com/containous/traefik/pull/3505) by [TrevinTeacutter](https://github.com/TrevinTeacutter))
|
||||||
|
- **[mesos]** Segments Labels: Mesos ([#3383](https://github.com/containous/traefik/pull/3383) by [drewkerrigan](https://github.com/drewkerrigan))
|
||||||
|
- **[metrics]** Metrics: Add support for InfluxDB Database / RetentionPolicy and HTTP client ([#3391](https://github.com/containous/traefik/pull/3391) by [drewkerrigan](https://github.com/drewkerrigan))
|
||||||
|
- **[middleware,consulcatalog,docker,ecs,kv,marathon,mesos,rancher]** Pass the TLS Cert infos in headers ([#3826](https://github.com/containous/traefik/pull/3826) by [jbdoumenjou](https://github.com/jbdoumenjou))
|
||||||
|
- **[middleware,server]** Extreme Makeover: server refactoring ([#3461](https://github.com/containous/traefik/pull/3461) by [ldez](https://github.com/ldez))
|
||||||
|
- **[middleware,tracing]** Added integration support for DataDog APM Tracing ([#3517](https://github.com/containous/traefik/pull/3517) by [aantono](https://github.com/aantono))
|
||||||
|
- **[middleware,tracing]** Create a custom logger for jaeger ([#3541](https://github.com/containous/traefik/pull/3541) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[middleware]** Performance enhancements for the rules matchers. ([#3563](https://github.com/containous/traefik/pull/3563) by [ShaneSaww](https://github.com/ShaneSaww))
|
||||||
|
- **[middleware]** Extract internal router creation from server ([#3204](https://github.com/containous/traefik/pull/3204) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[rules]** CNAME flattening ([#3403](https://github.com/containous/traefik/pull/3403) by [gamalan](https://github.com/gamalan))
|
||||||
|
- **[servicefabric]** Add HTTP headers to healthcheck. ([#3205](https://github.com/containous/traefik/pull/3205) by [ldez](https://github.com/ldez))
|
||||||
|
- **[tls]** Support TLS MinVersion and CipherSuite as CLI option. ([#3107](https://github.com/containous/traefik/pull/3107) by [ldez](https://github.com/ldez))
|
||||||
|
- **[tls]** Improve TLS Handshake ([#3512](https://github.com/containous/traefik/pull/3512) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[webui]** Add some missing elements in the WebUI ([#3327](https://github.com/containous/traefik/pull/3327) by [ldez](https://github.com/ldez))
|
||||||
|
- Call functions to enable block/mutex pprof profiles. ([#3564](https://github.com/containous/traefik/pull/3564) by [timoreimann](https://github.com/timoreimann))
|
||||||
|
- Minor changes ([#3554](https://github.com/containous/traefik/pull/3554) by [ldez](https://github.com/ldez))
|
||||||
|
- Generated assets file are only mandatory in main ([#3386](https://github.com/containous/traefik/pull/3386) by [Juliens](https://github.com/Juliens))
|
||||||
|
- h2c server ([#3387](https://github.com/containous/traefik/pull/3387) by [Juliens](https://github.com/Juliens))
|
||||||
|
- Fix backend reuse ([#3312](https://github.com/containous/traefik/pull/3312) by [arnested](https://github.com/arnested))
|
||||||
|
- Upgrade GRPC dependencies ([#3342](https://github.com/containous/traefik/pull/3342) by [gottwald](https://github.com/gottwald))
|
||||||
|
- Implement h2c with backend ([#3371](https://github.com/containous/traefik/pull/3371) by [Juliens](https://github.com/Juliens))
|
||||||
|
|
||||||
|
**Bug fixes:**
|
||||||
|
- **[acme,cluster]** StoreConfig always initializes the account if it is missing ([#3844](https://github.com/containous/traefik/pull/3844) by [geraldcroes](https://github.com/geraldcroes))
|
||||||
|
- **[acme,provider]** Create init method on provider interface ([#3580](https://github.com/containous/traefik/pull/3580) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[acme]** Does not generate ACME certificate if domain is checked by dynamic certificate ([#3238](https://github.com/containous/traefik/pull/3238) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[acme]** Ensure only certificates from ACME enabled entrypoint are used ([#3880](https://github.com/containous/traefik/pull/3880) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[acme]** Fix acme account deletion without provider change ([#3664](https://github.com/containous/traefik/pull/3664) by [zyclonite](https://github.com/zyclonite))
|
||||||
|
- **[acme]** Fix some DNS providers issues ([#3915](https://github.com/containous/traefik/pull/3915) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Fix LEGO update ([#3895](https://github.com/containous/traefik/pull/3895) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Set a keyType to ACME if the account is stored with no KeyType ([#3733](https://github.com/containous/traefik/pull/3733) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[acme]** Fix ACME certificate for wildcard and root domains ([#3675](https://github.com/containous/traefik/pull/3675) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[acme]** Update lego ([#3659](https://github.com/containous/traefik/pull/3659) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[acme]** Bump LEGO version ([#3888](https://github.com/containous/traefik/pull/3888) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Serve TLS-Challenge certificate in first ([#3605](https://github.com/containous/traefik/pull/3605) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[api,authentication,webui]** Auth section in web UI. ([#3628](https://github.com/containous/traefik/pull/3628) by [ldez](https://github.com/ldez))
|
||||||
|
- **[api]** Remove TLS in API ([#3665](https://github.com/containous/traefik/pull/3665) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[authentication,consulcatalog,docker,ecs,k8s,kv,marathon,mesos,rancher]** Auth Forward with certificates in templates. ([#3804](https://github.com/containous/traefik/pull/3804) by [ldez](https://github.com/ldez))
|
||||||
|
- **[authentication,middleware,provider]** Don't pass the Authorization header to the backends ([#3606](https://github.com/containous/traefik/pull/3606) by [jbdoumenjou](https://github.com/jbdoumenjou))
|
||||||
|
- **[authentication,middleware]** Do not copy hop-by-hop headers to forward auth request ([#3907](https://github.com/containous/traefik/pull/3907) by [stffabi](https://github.com/stffabi))
|
||||||
|
- **[authentication,middleware]** Remove hop-by-hop headers from forward auth response ([#3900](https://github.com/containous/traefik/pull/3900) by [stffabi](https://github.com/stffabi))
|
||||||
|
- **[docker]** Uses both binded HostIP and HostPort when useBindPortIP=true ([#3638](https://github.com/containous/traefik/pull/3638) by [geraldcroes](https://github.com/geraldcroes))
|
||||||
|
- **[ecs]** Fix 400 bad request on AWS ECS API ([#3629](https://github.com/containous/traefik/pull/3629) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[k8s]** Fix Rewrite-target regex ([#3699](https://github.com/containous/traefik/pull/3699) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Don't merge kubernetes ingresses when priority is set ([#3743](https://github.com/containous/traefik/pull/3743) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Prevent unparsable strings from being rendered in the Kubernetes template ([#3753](https://github.com/containous/traefik/pull/3753) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Correct App-Root kubernetes behavior ([#3592](https://github.com/containous/traefik/pull/3592) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Add more K8s Unit Tests ([#3583](https://github.com/containous/traefik/pull/3583) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Fix rewrite-target Annotation behavior ([#3582](https://github.com/containous/traefik/pull/3582) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Fix panic setting ingress status ([#3492](https://github.com/containous/traefik/pull/3492) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[kv]** KV and authentication ([#3615](https://github.com/containous/traefik/pull/3615) by [ldez](https://github.com/ldez))
|
||||||
|
- **[kv]** Add missing quotes around backendName in kv template ([#3885](https://github.com/containous/traefik/pull/3885) by [NatMarchand](https://github.com/NatMarchand))
|
||||||
|
- **[kv]** Include missing key in error message for KV store ([#3779](https://github.com/containous/traefik/pull/3779) by [camelpunch](https://github.com/camelpunch))
|
||||||
|
- **[logs]** Add logs when error is generated in error handler ([#3571](https://github.com/containous/traefik/pull/3571) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[logs]** Add interface to Træfik logger ([#3889](https://github.com/containous/traefik/pull/3889) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[metrics]** Avoid a panic during Prometheus registering ([#3717](https://github.com/containous/traefik/pull/3717) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[middleware,tracing]** Fix tracing duplicated headers ([#3878](https://github.com/containous/traefik/pull/3878) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[middleware,websocket]** Enable retry on websocket ([#3825](https://github.com/containous/traefik/pull/3825) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[middleware]** Avoid retries when any data was written to the backend ([#3285](https://github.com/containous/traefik/pull/3285) by [marco-jantke](https://github.com/marco-jantke))
|
||||||
|
- **[middleware]** Extend https redirection tests, and fix incorrect behavior ([#3742](https://github.com/containous/traefik/pull/3742) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[middleware]** Send 'Retry-After' to comply with RFC6585. ([#3593](https://github.com/containous/traefik/pull/3593) by [ldez](https://github.com/ldez))
|
||||||
|
- **[middleware]** Correct Entrypoint Redirect with Stripped or Added Path ([#3631](https://github.com/containous/traefik/pull/3631) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[middleware]** Fix error pages ([#3894](https://github.com/containous/traefik/pull/3894) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[oxy]** Handle Te header when http2 ([#3824](https://github.com/containous/traefik/pull/3824) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[server]** Avoid goroutine leak in server ([#3851](https://github.com/containous/traefik/pull/3851) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[server]** Avoid panic during stop ([#3898](https://github.com/containous/traefik/pull/3898) by [nmengin](https://github.com/nmengin))
|
||||||
|
- **[tracing]** Added default configuration for DataDog APM Tracer ([#3655](https://github.com/containous/traefik/pull/3655) by [aantono](https://github.com/aantono))
|
||||||
|
- **[tracing]** Added support for Trace name truncation for traces ([#3689](https://github.com/containous/traefik/pull/3689) by [aantono](https://github.com/aantono))
|
||||||
|
- **[websocket]** Handle shutdown of Hijacked connections ([#3636](https://github.com/containous/traefik/pull/3636) by [Juliens](https://github.com/Juliens))
|
||||||
|
- **[webui]** Added Dashboard table item for Rate Limits ([#3893](https://github.com/containous/traefik/pull/3893) by [codecyclist](https://github.com/codecyclist))
|
||||||
|
- Fix logger in Oxy ([#3913](https://github.com/containous/traefik/pull/3913) by [ldez](https://github.com/ldez))
|
||||||
|
- H2C: Remove buggy line in init to make verbose switch working ([#3701](https://github.com/containous/traefik/pull/3701) by [dduportal](https://github.com/dduportal))
|
||||||
|
- Updating oxy dependency ([#3700](https://github.com/containous/traefik/pull/3700) by [crholm](https://github.com/crholm))
|
||||||
|
|
||||||
|
**Documentation:**
|
||||||
|
- **[acme]** Update ACME documentation about TLS-ALPN challenge ([#3756](https://github.com/containous/traefik/pull/3756) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Fix some DNS provider link ([#3639](https://github.com/containous/traefik/pull/3639) by [ldez](https://github.com/ldez))
|
||||||
|
- **[acme]** Fix documentation for route53 acme provider ([#3811](https://github.com/containous/traefik/pull/3811) by [A-Shleifman](https://github.com/A-Shleifman))
|
||||||
|
- **[acme]** Update Namecheap status ([#3604](https://github.com/containous/traefik/pull/3604) by [stoinov](https://github.com/stoinov))
|
||||||
|
- **[docker]** Fix style in examples/quickstart ([#3705](https://github.com/containous/traefik/pull/3705) by [korigod](https://github.com/korigod))
|
||||||
|
- **[docker]** Change syntax in quick start guide ([#3726](https://github.com/containous/traefik/pull/3726) by [trotro](https://github.com/trotro))
|
||||||
|
- **[docker]** Typo in docker-and-lets-encrypt.md ([#3724](https://github.com/containous/traefik/pull/3724) by [A-Shleifman](https://github.com/A-Shleifman))
|
||||||
|
- **[docker]** Improve the wording in the documentation for Docker and fix title for Docker User Guide ([#3797](https://github.com/containous/traefik/pull/3797) by [dduportal](https://github.com/dduportal))
|
||||||
|
- **[k8s]** Add a k8s guide section on traffic splitting via service weights. ([#3556](https://github.com/containous/traefik/pull/3556) by [timoreimann](https://github.com/timoreimann))
|
||||||
|
- **[k8s]** Change code block of traefik-web-ui to match file ([#3542](https://github.com/containous/traefik/pull/3542) by [drewgwallace](https://github.com/drewgwallace))
|
||||||
|
- **[k8s]** Fix typo which breaks k8s example manifest ([#3441](https://github.com/containous/traefik/pull/3441) by [GeertJohan](https://github.com/GeertJohan))
|
||||||
|
- **[k8s]** Correct Modifier in Kubernetes Documentation ([#3610](https://github.com/containous/traefik/pull/3610) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Improve Connection Limit Kubernetes Documentation ([#3711](https://github.com/containous/traefik/pull/3711) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Add traefik prefix to k8s annotations ([#3682](https://github.com/containous/traefik/pull/3682) by [zifeo](https://github.com/zifeo))
|
||||||
|
- **[k8s]** Update kubernetes docs to reflect https options ([#3807](https://github.com/containous/traefik/pull/3807) by [dtomcej](https://github.com/dtomcej))
|
||||||
|
- **[k8s]** Update kubernetes.md ([#3719](https://github.com/containous/traefik/pull/3719) by [kmaris](https://github.com/kmaris))
|
||||||
|
- **[metrics]** Adding grafana dashboards based on prometheus metrics ([#3393](https://github.com/containous/traefik/pull/3393) by [deimosfr](https://github.com/deimosfr))
|
||||||
|
- **[middleware,tracing]** Fix missing tracing backend in documentation ([#3706](https://github.com/containous/traefik/pull/3706) by [mmatur](https://github.com/mmatur))
|
||||||
|
- **[provider]** Typo in auth labels. ([#3730](https://github.com/containous/traefik/pull/3730) by [ldez](https://github.com/ldez))
|
||||||
|
- **[servicefabric]** Fix Service Fabric docs to use v1.6 labels ([#3209](https://github.com/containous/traefik/pull/3209) by [jjcollinge](https://github.com/jjcollinge))
|
||||||
|
- **[tracing]** Simple documentation grammar update in tracing ([#3720](https://github.com/containous/traefik/pull/3720) by [loadstar81](https://github.com/loadstar81))
|
||||||
|
- Replace unrendered emoji ([#3690](https://github.com/containous/traefik/pull/3690) by [korigod](https://github.com/korigod))
|
||||||
|
- Make the "base domain" on all providers ([#3835](https://github.com/containous/traefik/pull/3835) by [dduportal](https://github.com/dduportal))
|
||||||
|
- Prepare release v1.7.0-rc5 ([#3902](https://github.com/containous/traefik/pull/3902) by [dduportal](https://github.com/dduportal))
|
||||||
|
- Prepare release v1.7.0-rc3 ([#3709](https://github.com/containous/traefik/pull/3709) by [mmatur](https://github.com/mmatur))
|
||||||
|
- Prepare release v1.7.0-rc4 ([#3864](https://github.com/containous/traefik/pull/3864) by [Juliens](https://github.com/Juliens))
|
||||||
|
- Prepare release v1.7.0-rc2 ([#3632](https://github.com/containous/traefik/pull/3632) by [nmengin](https://github.com/nmengin))
|
||||||
|
- Prepare release v1.7.0-rc1 ([#3578](https://github.com/containous/traefik/pull/3578) by [mmatur](https://github.com/mmatur))
|
||||||
|
|
||||||
|
**Misc:**
|
||||||
|
- **[webui]** Removed non-applicable default tests and fixed custom tests ([#3908](https://github.com/containous/traefik/pull/3908) by [codecyclist](https://github.com/codecyclist))
|
||||||
|
- Merge v1.6.6 into v1.7 ([#3802](https://github.com/containous/traefik/pull/3802) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.5 into v1.7 ([#3595](https://github.com/containous/traefik/pull/3595) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.4 into master ([#3502](https://github.com/containous/traefik/pull/3502) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.3 into master ([#3439](https://github.com/containous/traefik/pull/3439) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.2 into master ([#3367](https://github.com/containous/traefik/pull/3367) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.1 into master ([#3326](https://github.com/containous/traefik/pull/3326) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.0 into master ([#3253](https://github.com/containous/traefik/pull/3253) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.0-rc6 into master ([#3203](https://github.com/containous/traefik/pull/3203) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.0-rc5 into master ([#3180](https://github.com/containous/traefik/pull/3180) by [ldez](https://github.com/ldez))
|
||||||
|
- Merge v1.6.0-rc4 into master ([#3129](https://github.com/containous/traefik/pull/3129) by [ldez](https://github.com/ldez))
|
||||||
|
|
||||||
## [v1.7.0-rc5](https://github.com/containous/traefik/tree/v1.7.0-rc5) (2018-09-18)
|
## [v1.7.0-rc5](https://github.com/containous/traefik/tree/v1.7.0-rc5) (2018-09-18)
|
||||||
[All Commits](https://github.com/containous/traefik/compare/v1.7.0-rc4...v1.7.0-rc5)
|
[All Commits](https://github.com/containous/traefik/compare/v1.7.0-rc4...v1.7.0-rc5)
|
||||||
|
|
||||||
|
|
4
Gopkg.lock
generated
4
Gopkg.lock
generated
|
@ -1289,7 +1289,7 @@
|
||||||
"roundrobin",
|
"roundrobin",
|
||||||
"utils"
|
"utils"
|
||||||
]
|
]
|
||||||
revision = "77148e9694210e5f5610328f1cd7cf65583014c2"
|
revision = "fe51048067db50958154cd4040da878b10002a3a"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/vulcand/predicate"
|
name = "github.com/vulcand/predicate"
|
||||||
|
@ -1362,7 +1362,7 @@
|
||||||
"providers/dns/vegadns",
|
"providers/dns/vegadns",
|
||||||
"providers/dns/vultr"
|
"providers/dns/vultr"
|
||||||
]
|
]
|
||||||
revision = "83e2300e01226dcb006946873ca5434291fb16ef"
|
revision = "621237d07213aa6dead90bdf6fd46251220fa669"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
branch = "master"
|
branch = "master"
|
||||||
|
|
|
@ -108,6 +108,7 @@ func Forward(config *types.Forward, w http.ResponseWriter, r *http.Request, next
|
||||||
|
|
||||||
func writeHeader(req *http.Request, forwardReq *http.Request, trustForwardHeader bool) {
|
func writeHeader(req *http.Request, forwardReq *http.Request, trustForwardHeader bool) {
|
||||||
utils.CopyHeaders(forwardReq.Header, req.Header)
|
utils.CopyHeaders(forwardReq.Header, req.Header)
|
||||||
|
utils.RemoveHeaders(forwardReq.Header, forward.HopHeaders...)
|
||||||
|
|
||||||
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
|
if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {
|
||||||
if trustForwardHeader {
|
if trustForwardHeader {
|
||||||
|
|
|
@ -231,11 +231,12 @@ func TestForwardAuthFailResponseHeaders(t *testing.T) {
|
||||||
|
|
||||||
func Test_writeHeader(t *testing.T) {
|
func Test_writeHeader(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
headers map[string]string
|
headers map[string]string
|
||||||
trustForwardHeader bool
|
trustForwardHeader bool
|
||||||
emptyHost bool
|
emptyHost bool
|
||||||
expectedHeaders map[string]string
|
expectedHeaders map[string]string
|
||||||
|
checkForUnexpectedHeaders bool
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "trust Forward Header",
|
name: "trust Forward Header",
|
||||||
|
@ -334,6 +335,29 @@ func Test_writeHeader(t *testing.T) {
|
||||||
"X-Forwarded-Method": "GET",
|
"X-Forwarded-Method": "GET",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "remove hop-by-hop headers",
|
||||||
|
headers: map[string]string{
|
||||||
|
forward.Connection: "Connection",
|
||||||
|
forward.KeepAlive: "KeepAlive",
|
||||||
|
forward.ProxyAuthenticate: "ProxyAuthenticate",
|
||||||
|
forward.ProxyAuthorization: "ProxyAuthorization",
|
||||||
|
forward.Te: "Te",
|
||||||
|
forward.Trailers: "Trailers",
|
||||||
|
forward.TransferEncoding: "TransferEncoding",
|
||||||
|
forward.Upgrade: "Upgrade",
|
||||||
|
"X-CustomHeader": "CustomHeader",
|
||||||
|
},
|
||||||
|
trustForwardHeader: false,
|
||||||
|
expectedHeaders: map[string]string{
|
||||||
|
"X-CustomHeader": "CustomHeader",
|
||||||
|
"X-Forwarded-Proto": "http",
|
||||||
|
"X-Forwarded-Host": "foo.bar",
|
||||||
|
"X-Forwarded-Uri": "/path?q=1",
|
||||||
|
"X-Forwarded-Method": "GET",
|
||||||
|
},
|
||||||
|
checkForUnexpectedHeaders: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
@ -352,8 +376,16 @@ func Test_writeHeader(t *testing.T) {
|
||||||
|
|
||||||
writeHeader(req, forwardReq, test.trustForwardHeader)
|
writeHeader(req, forwardReq, test.trustForwardHeader)
|
||||||
|
|
||||||
for key, value := range test.expectedHeaders {
|
actualHeaders := forwardReq.Header
|
||||||
assert.Equal(t, value, forwardReq.Header.Get(key))
|
expectedHeaders := test.expectedHeaders
|
||||||
|
for key, value := range expectedHeaders {
|
||||||
|
assert.Equal(t, value, actualHeaders.Get(key))
|
||||||
|
actualHeaders.Del(key)
|
||||||
|
}
|
||||||
|
if test.checkForUnexpectedHeaders {
|
||||||
|
for key := range actualHeaders {
|
||||||
|
assert.Fail(t, "Unexpected header found", key)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
6
vendor/github.com/vulcand/oxy/buffer/buffer.go
generated
vendored
6
vendor/github.com/vulcand/oxy/buffer/buffer.go
generated
vendored
|
@ -216,7 +216,7 @@ func (b *Buffer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := b.checkLimit(req); err != nil {
|
if err := b.checkLimit(req); err != nil {
|
||||||
log.Errorf("vulcand/oxy/buffer: request body over limit, err: %v", err)
|
b.log.Errorf("vulcand/oxy/buffer: request body over limit, err: %v", err)
|
||||||
b.errHandler.ServeHTTP(w, req, err)
|
b.errHandler.ServeHTTP(w, req, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ func (b *Buffer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
if body != nil {
|
if body != nil {
|
||||||
errClose := body.Close()
|
errClose := body.Close()
|
||||||
if errClose != nil {
|
if errClose != nil {
|
||||||
log.Errorf("vulcand/oxy/buffer: failed to close body, err: %v", errClose)
|
b.log.Errorf("vulcand/oxy/buffer: failed to close body, err: %v", errClose)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -417,7 +417,7 @@ func (b *bufferWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||||
return conn, rw, err
|
return conn, rw, err
|
||||||
}
|
}
|
||||||
b.log.Warningf("Upstream ResponseWriter of type %v does not implement http.Hijacker. Returning dummy channel.", reflect.TypeOf(b.responseWriter))
|
b.log.Warningf("Upstream ResponseWriter of type %v does not implement http.Hijacker. Returning dummy channel.", reflect.TypeOf(b.responseWriter))
|
||||||
return nil, nil, fmt.Errorf("the response writer wrapped in this proxy does not implement http.Hijacker. Its type is: %v”", reflect.TypeOf(b.responseWriter))
|
return nil, nil, fmt.Errorf("the response writer wrapped in this proxy does not implement http.Hijacker. Its type is: %v", reflect.TypeOf(b.responseWriter))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SizeErrHandler Size error handler
|
// SizeErrHandler Size error handler
|
||||||
|
|
4
vendor/github.com/vulcand/oxy/cbreaker/fallback.go
generated
vendored
4
vendor/github.com/vulcand/oxy/cbreaker/fallback.go
generated
vendored
|
@ -51,7 +51,7 @@ func (f *ResponseFallback) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
w.WriteHeader(f.r.StatusCode)
|
w.WriteHeader(f.r.StatusCode)
|
||||||
_, err := w.Write(f.r.Body)
|
_, err := w.Write(f.r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("vulcand/oxy/fallback/response: failed to write response, err: %v", err)
|
f.log.Errorf("vulcand/oxy/fallback/response: failed to write response, err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,6 +100,6 @@ func (f *RedirectFallback) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
w.WriteHeader(http.StatusFound)
|
w.WriteHeader(http.StatusFound)
|
||||||
_, err := w.Write([]byte(http.StatusText(http.StatusFound)))
|
_, err := w.Write([]byte(http.StatusText(http.StatusFound)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("vulcand/oxy/fallback/redirect: failed to write response, err: %v", err)
|
f.log.Errorf("vulcand/oxy/fallback/redirect: failed to write response, err: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
10
vendor/github.com/vulcand/oxy/forward/fwd.go
generated
vendored
10
vendor/github.com/vulcand/oxy/forward/fwd.go
generated
vendored
|
@ -349,17 +349,17 @@ func (f *httpForwarder) serveWebSocket(w http.ResponseWriter, req *http.Request,
|
||||||
if resp == nil {
|
if resp == nil {
|
||||||
ctx.errHandler.ServeHTTP(w, req, err)
|
ctx.errHandler.ServeHTTP(w, req, err)
|
||||||
} else {
|
} else {
|
||||||
log.Errorf("vulcand/oxy/forward/websocket: Error dialing %q: %v with resp: %d %s", outReq.Host, err, resp.StatusCode, resp.Status)
|
f.log.Errorf("vulcand/oxy/forward/websocket: Error dialing %q: %v with resp: %d %s", outReq.Host, err, resp.StatusCode, resp.Status)
|
||||||
hijacker, ok := w.(http.Hijacker)
|
hijacker, ok := w.(http.Hijacker)
|
||||||
if !ok {
|
if !ok {
|
||||||
log.Errorf("vulcand/oxy/forward/websocket: %s can not be hijack", reflect.TypeOf(w))
|
f.log.Errorf("vulcand/oxy/forward/websocket: %s can not be hijack", reflect.TypeOf(w))
|
||||||
ctx.errHandler.ServeHTTP(w, req, err)
|
ctx.errHandler.ServeHTTP(w, req, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
conn, _, errHijack := hijacker.Hijack()
|
conn, _, errHijack := hijacker.Hijack()
|
||||||
if errHijack != nil {
|
if errHijack != nil {
|
||||||
log.Errorf("vulcand/oxy/forward/websocket: Failed to hijack responseWriter")
|
f.log.Errorf("vulcand/oxy/forward/websocket: Failed to hijack responseWriter")
|
||||||
ctx.errHandler.ServeHTTP(w, req, errHijack)
|
ctx.errHandler.ServeHTTP(w, req, errHijack)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,7 @@ func (f *httpForwarder) serveWebSocket(w http.ResponseWriter, req *http.Request,
|
||||||
|
|
||||||
errWrite := resp.Write(conn)
|
errWrite := resp.Write(conn)
|
||||||
if errWrite != nil {
|
if errWrite != nil {
|
||||||
log.Errorf("vulcand/oxy/forward/websocket: Failed to forward response")
|
f.log.Errorf("vulcand/oxy/forward/websocket: Failed to forward response")
|
||||||
ctx.errHandler.ServeHTTP(w, req, errWrite)
|
ctx.errHandler.ServeHTTP(w, req, errWrite)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -385,7 +385,7 @@ func (f *httpForwarder) serveWebSocket(w http.ResponseWriter, req *http.Request,
|
||||||
|
|
||||||
underlyingConn, err := upgrader.Upgrade(w, req, resp.Header)
|
underlyingConn, err := upgrader.Upgrade(w, req, resp.Header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("vulcand/oxy/forward/websocket: Error while upgrading connection : %v", err)
|
f.log.Errorf("vulcand/oxy/forward/websocket: Error while upgrading connection : %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
2
vendor/github.com/xenolf/lego/acme/client.go
generated
vendored
2
vendor/github.com/xenolf/lego/acme/client.go
generated
vendored
|
@ -593,7 +593,7 @@ func (c *Client) solveChallengeForAuthz(authorizations []authorization) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for all valid presolvers, first submit the challenges so they have max time to propigate
|
// for all valid presolvers, first submit the challenges so they have max time to propagate
|
||||||
for _, item := range authSolvers {
|
for _, item := range authSolvers {
|
||||||
authz := item.authz
|
authz := item.authz
|
||||||
i := item.challengeIndex
|
i := item.challengeIndex
|
||||||
|
|
6
vendor/github.com/xenolf/lego/acme/dns_challenge.go
generated
vendored
6
vendor/github.com/xenolf/lego/acme/dns_challenge.go
generated
vendored
|
@ -30,6 +30,9 @@ const (
|
||||||
|
|
||||||
// DefaultPollingInterval default polling interval
|
// DefaultPollingInterval default polling interval
|
||||||
DefaultPollingInterval = 2 * time.Second
|
DefaultPollingInterval = 2 * time.Second
|
||||||
|
|
||||||
|
// DefaultTTL default TTL
|
||||||
|
DefaultTTL = 120
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultNameservers = []string{
|
var defaultNameservers = []string{
|
||||||
|
@ -67,7 +70,7 @@ func DNS01Record(domain, keyAuth string) (fqdn string, value string, ttl int) {
|
||||||
keyAuthShaBytes := sha256.Sum256([]byte(keyAuth))
|
keyAuthShaBytes := sha256.Sum256([]byte(keyAuth))
|
||||||
// base64URL encoding without padding
|
// base64URL encoding without padding
|
||||||
value = base64.RawURLEncoding.EncodeToString(keyAuthShaBytes[:sha256.Size])
|
value = base64.RawURLEncoding.EncodeToString(keyAuthShaBytes[:sha256.Size])
|
||||||
ttl = 120
|
ttl = DefaultTTL
|
||||||
fqdn = fmt.Sprintf("_acme-challenge.%s.", domain)
|
fqdn = fmt.Sprintf("_acme-challenge.%s.", domain)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -149,6 +152,7 @@ func checkDNSPropagation(fqdn, value string) (bool, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Rcode == dns.RcodeSuccess {
|
if r.Rcode == dns.RcodeSuccess {
|
||||||
// If we see a CNAME here then use the alias
|
// If we see a CNAME here then use the alias
|
||||||
for _, rr := range r.Answer {
|
for _, rr := range r.Answer {
|
||||||
|
|
12
vendor/github.com/xenolf/lego/log/logger.go
generated
vendored
12
vendor/github.com/xenolf/lego/log/logger.go
generated
vendored
|
@ -6,7 +6,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Logger is an optional custom logger.
|
// Logger is an optional custom logger.
|
||||||
var Logger = log.New(os.Stdout, "", log.LstdFlags)
|
var Logger StdLogger = log.New(os.Stdout, "", log.LstdFlags)
|
||||||
|
|
||||||
|
// StdLogger interface for Standard Logger.
|
||||||
|
type StdLogger interface {
|
||||||
|
Fatal(args ...interface{})
|
||||||
|
Fatalln(args ...interface{})
|
||||||
|
Fatalf(format string, args ...interface{})
|
||||||
|
Print(args ...interface{})
|
||||||
|
Println(args ...interface{})
|
||||||
|
Printf(format string, args ...interface{})
|
||||||
|
}
|
||||||
|
|
||||||
// Fatal writes a log entry.
|
// Fatal writes a log entry.
|
||||||
// It uses Logger if not nil, otherwise it uses the default log.Logger.
|
// It uses Logger if not nil, otherwise it uses the default log.Logger.
|
||||||
|
|
10
vendor/github.com/xenolf/lego/providers/dns/azure/azure.go
generated
vendored
10
vendor/github.com/xenolf/lego/providers/dns/azure/azure.go
generated
vendored
|
@ -127,7 +127,10 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = rsc.CreateOrUpdate(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, rec, "", "")
|
_, err = rsc.CreateOrUpdate(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, rec, "", "")
|
||||||
return fmt.Errorf("azure: %v", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("azure: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CleanUp removes the TXT record matching the specified parameters
|
// CleanUp removes the TXT record matching the specified parameters
|
||||||
|
@ -150,7 +153,10 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
rsc.Authorizer = autorest.NewBearerAuthorizer(spt)
|
rsc.Authorizer = autorest.NewBearerAuthorizer(spt)
|
||||||
|
|
||||||
_, err = rsc.Delete(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, "")
|
_, err = rsc.Delete(ctx, d.config.ResourceGroup, zone, relative, dns.TXT, "")
|
||||||
return fmt.Errorf("azure: %v", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("azure: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks that azure has a zone for this domain name.
|
// Checks that azure has a zone for this domain name.
|
||||||
|
|
28
vendor/github.com/xenolf/lego/providers/dns/gcloud/googlecloud.go
generated
vendored
28
vendor/github.com/xenolf/lego/providers/dns/gcloud/googlecloud.go
generated
vendored
|
@ -131,26 +131,33 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Look for existing records.
|
||||||
|
existing, err := d.findTxtRecords(zone, fqdn)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("googlecloud: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
rec := &dns.ResourceRecordSet{
|
rec := &dns.ResourceRecordSet{
|
||||||
Name: fqdn,
|
Name: fqdn,
|
||||||
Rrdatas: []string{value},
|
Rrdatas: []string{value},
|
||||||
Ttl: int64(d.config.TTL),
|
Ttl: int64(d.config.TTL),
|
||||||
Type: "TXT",
|
Type: "TXT",
|
||||||
}
|
}
|
||||||
change := &dns.Change{
|
|
||||||
Additions: []*dns.ResourceRecordSet{rec},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for existing records.
|
change := &dns.Change{}
|
||||||
existing, err := d.findTxtRecords(zone, fqdn)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
|
||||||
}
|
|
||||||
if len(existing) > 0 {
|
if len(existing) > 0 {
|
||||||
// Attempt to delete the existing records when adding our new one.
|
// Attempt to delete the existing records when adding our new one.
|
||||||
change.Deletions = existing
|
change.Deletions = existing
|
||||||
|
|
||||||
|
// Append existing TXT record data to the new TXT record data
|
||||||
|
for _, value := range existing {
|
||||||
|
rec.Rrdatas = append(rec.Rrdatas, value.Rrdatas...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
change.Additions = []*dns.ResourceRecordSet{rec}
|
||||||
|
|
||||||
chg, err := d.client.Changes.Create(d.config.Project, zone, change).Do()
|
chg, err := d.client.Changes.Create(d.config.Project, zone, change).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
return fmt.Errorf("googlecloud: %v", err)
|
||||||
|
@ -188,7 +195,10 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = d.client.Changes.Create(d.config.Project, zone, &dns.Change{Deletions: records}).Do()
|
_, err = d.client.Changes.Create(d.config.Project, zone, &dns.Change{Deletions: records}).Do()
|
||||||
return fmt.Errorf("googlecloud: %v", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("googlecloud: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timeout customizes the timeout values used by the ACME package for checking
|
// Timeout customizes the timeout values used by the ACME package for checking
|
||||||
|
|
10
vendor/github.com/xenolf/lego/providers/dns/iij/iij.go
generated
vendored
10
vendor/github.com/xenolf/lego/providers/dns/iij/iij.go
generated
vendored
|
@ -76,7 +76,10 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
_, value, _ := acme.DNS01Record(domain, keyAuth)
|
_, value, _ := acme.DNS01Record(domain, keyAuth)
|
||||||
|
|
||||||
err := d.addTxtRecord(domain, value)
|
err := d.addTxtRecord(domain, value)
|
||||||
return fmt.Errorf("iij: %v", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("iij: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CleanUp removes the TXT record matching the specified parameters
|
// CleanUp removes the TXT record matching the specified parameters
|
||||||
|
@ -84,7 +87,10 @@ func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
_, value, _ := acme.DNS01Record(domain, keyAuth)
|
_, value, _ := acme.DNS01Record(domain, keyAuth)
|
||||||
|
|
||||||
err := d.deleteTxtRecord(domain, value)
|
err := d.deleteTxtRecord(domain, value)
|
||||||
return fmt.Errorf("iij: %v", err)
|
if err != nil {
|
||||||
|
return fmt.Errorf("iij: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) addTxtRecord(domain, value string) error {
|
func (d *DNSProvider) addTxtRecord(domain, value string) error {
|
||||||
|
|
22
vendor/github.com/xenolf/lego/providers/dns/ns1/ns1.go
generated
vendored
22
vendor/github.com/xenolf/lego/providers/dns/ns1/ns1.go
generated
vendored
|
@ -85,7 +85,7 @@ func NewDNSProviderConfig(config *Config) (*DNSProvider, error) {
|
||||||
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
fqdn, value, _ := acme.DNS01Record(domain, keyAuth)
|
fqdn, value, _ := acme.DNS01Record(domain, keyAuth)
|
||||||
|
|
||||||
zone, err := d.getHostedZone(domain)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
record := d.newTxtRecord(zone, fqdn, value, d.config.TTL)
|
record := d.newTxtRecord(zone, fqdn, value, d.config.TTL)
|
||||||
_, err = d.client.Records.Create(record)
|
_, err = d.client.Records.Create(record)
|
||||||
if err != nil && err != rest.ErrRecordExists {
|
if err != nil && err != rest.ErrRecordExists {
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: failed to create record [zone: %q, fqdn: %q]: %v", zone.Zone, fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -103,14 +103,14 @@ func (d *DNSProvider) Present(domain, token, keyAuth string) error {
|
||||||
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
func (d *DNSProvider) CleanUp(domain, token, keyAuth string) error {
|
||||||
fqdn, _, _ := acme.DNS01Record(domain, keyAuth)
|
fqdn, _, _ := acme.DNS01Record(domain, keyAuth)
|
||||||
|
|
||||||
zone, err := d.getHostedZone(domain)
|
zone, err := d.getHostedZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
name := acme.UnFqdn(fqdn)
|
name := acme.UnFqdn(fqdn)
|
||||||
_, err = d.client.Records.Delete(zone.Zone, name, "TXT")
|
_, err = d.client.Records.Delete(zone.Zone, name, "TXT")
|
||||||
return fmt.Errorf("ns1: %v", err)
|
return fmt.Errorf("ns1: failed to delete record [zone: %q, domain: %q]: %v", zone.Zone, name, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timeout returns the timeout and interval to use when checking for DNS propagation.
|
// Timeout returns the timeout and interval to use when checking for DNS propagation.
|
||||||
|
@ -119,15 +119,15 @@ func (d *DNSProvider) Timeout() (timeout, interval time.Duration) {
|
||||||
return d.config.PropagationTimeout, d.config.PollingInterval
|
return d.config.PropagationTimeout, d.config.PollingInterval
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) getHostedZone(domain string) (*dns.Zone, error) {
|
func (d *DNSProvider) getHostedZone(fqdn string) (*dns.Zone, error) {
|
||||||
authZone, err := getAuthZone(domain)
|
authZone, err := getAuthZone(fqdn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ns1: %v", err)
|
return nil, fmt.Errorf("failed to extract auth zone from fqdn %q: %v", fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
zone, _, err := d.client.Zones.Get(authZone)
|
zone, _, err := d.client.Zones.Get(authZone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("ns1: %v", err)
|
return nil, fmt.Errorf("failed to get zone [authZone: %q, fqdn: %q]: %v", authZone, fqdn, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return zone, nil
|
return zone, nil
|
||||||
|
@ -139,11 +139,7 @@ func getAuthZone(fqdn string) (string, error) {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasSuffix(authZone, ".") {
|
return strings.TrimSuffix(authZone, "."), nil
|
||||||
authZone = authZone[:len(authZone)-len(".")]
|
|
||||||
}
|
|
||||||
|
|
||||||
return authZone, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DNSProvider) newTxtRecord(zone *dns.Zone, fqdn, value string, ttl int) *dns.Record {
|
func (d *DNSProvider) newTxtRecord(zone *dns.Zone, fqdn, value string, ttl int) *dns.Record {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { async, TestBed } from '@angular/core/testing';
|
import { async, TestBed } from '@angular/core/testing';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
|
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||||
|
|
||||||
describe('AppComponent', () => {
|
describe('AppComponent', () => {
|
||||||
|
|
||||||
|
@ -8,6 +9,9 @@ describe('AppComponent', () => {
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent
|
AppComponent
|
||||||
],
|
],
|
||||||
|
schemas: [
|
||||||
|
CUSTOM_ELEMENTS_SCHEMA
|
||||||
|
]
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -16,17 +20,5 @@ describe('AppComponent', () => {
|
||||||
const app = fixture.debugElement.componentInstance;
|
const app = fixture.debugElement.componentInstance;
|
||||||
expect(app).toBeTruthy();
|
expect(app).toBeTruthy();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it(`should have as title 'app'`, async(() => {
|
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
|
||||||
const app = fixture.debugElement.componentInstance;
|
|
||||||
expect(app.title).toEqual('app');
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should render title in a h1 tag', async(() => {
|
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
|
||||||
fixture.detectChanges();
|
|
||||||
const compiled = fixture.debugElement.nativeElement;
|
|
||||||
expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!');
|
|
||||||
}));
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,6 +13,7 @@ import { ProvidersComponent } from './components/providers/providers.component';
|
||||||
import { LetDirective } from './directives/let.directive';
|
import { LetDirective } from './directives/let.directive';
|
||||||
import { BackendFilterPipe } from './pipes/backend.filter.pipe';
|
import { BackendFilterPipe } from './pipes/backend.filter.pipe';
|
||||||
import { FrontendFilterPipe } from './pipes/frontend.filter.pipe';
|
import { FrontendFilterPipe } from './pipes/frontend.filter.pipe';
|
||||||
|
import { HumanReadableFilterPipe } from './pipes/humanreadable.filter.pipe';
|
||||||
import { KeysPipe } from './pipes/keys.pipe';
|
import { KeysPipe } from './pipes/keys.pipe';
|
||||||
import { ApiService } from './services/api.service';
|
import { ApiService } from './services/api.service';
|
||||||
import { WindowService } from './services/window.service';
|
import { WindowService } from './services/window.service';
|
||||||
|
@ -28,6 +29,7 @@ import { WindowService } from './services/window.service';
|
||||||
KeysPipe,
|
KeysPipe,
|
||||||
FrontendFilterPipe,
|
FrontendFilterPipe,
|
||||||
BackendFilterPipe,
|
BackendFilterPipe,
|
||||||
|
HumanReadableFilterPipe,
|
||||||
LetDirective
|
LetDirective
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { BarChartComponent } from './bar-chart.component';
|
import { BarChartComponent } from './bar-chart.component';
|
||||||
|
import { WindowService } from '../../services/window.service';
|
||||||
|
|
||||||
describe('BarChartComponent', () => {
|
describe('BarChartComponent', () => {
|
||||||
let component: BarChartComponent;
|
let component: BarChartComponent;
|
||||||
|
@ -8,7 +9,8 @@ describe('BarChartComponent', () => {
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [ BarChartComponent ]
|
declarations: [ BarChartComponent ],
|
||||||
|
providers: [{provide: WindowService, useInstance: {}}]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
}));
|
}));
|
||||||
|
@ -16,10 +18,14 @@ describe('BarChartComponent', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(BarChartComponent);
|
fixture = TestBed.createComponent(BarChartComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create', () => {
|
it('should create', () => {
|
||||||
expect(component).toBeTruthy();
|
expect(component).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should initially go to loading state', () => {
|
||||||
|
expect(component.loading).toBeTruthy()
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -435,6 +435,41 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- details.ratelimit-->
|
||||||
|
<div *ngIf="p.ratelimit">
|
||||||
|
<hr>
|
||||||
|
<div class="section-line">
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-3">
|
||||||
|
<h2 class="section-line-header">Rate Limiting</h2>
|
||||||
|
</div>
|
||||||
|
<div class="column is-9">
|
||||||
|
<div class="control">
|
||||||
|
<div class="tags has-addons">
|
||||||
|
<span class="tag is-light">Extractor Function</span>
|
||||||
|
<span class="tag is-info">{{ p.ratelimit.extractorFunc }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="table is-fullwidth is-hoverable table-fixed">
|
||||||
|
<thead>
|
||||||
|
<td>Rateset</td>
|
||||||
|
<td>Period</td>
|
||||||
|
<td>Average</td>
|
||||||
|
<td>Burst</td>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr *ngFor="let rateset of p.ratelimit.rateset">
|
||||||
|
<td>{{rateset.id}}</td>
|
||||||
|
<td>{{rateset.period | humanreadable}}</td>
|
||||||
|
<td>{{rateset.average}}</td>
|
||||||
|
<td>{{rateset.burst}}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
46
webui/src/app/pipes/humanreadable.filter.pipe.spec.ts
Normal file
46
webui/src/app/pipes/humanreadable.filter.pipe.spec.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import { HumanReadableFilterPipe } from './humanreadable.filter.pipe';
|
||||||
|
|
||||||
|
describe('HumanReadableFilterPipe', () => {
|
||||||
|
const pipe = new HumanReadableFilterPipe();
|
||||||
|
|
||||||
|
const datatable = [{
|
||||||
|
'given': '180000000000',
|
||||||
|
'expected': '180s'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': '4096.0',
|
||||||
|
'expected': '4096ns'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': '7200000000000',
|
||||||
|
'expected': '120m'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': '1337',
|
||||||
|
'expected': '1337ns'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': 'traefik',
|
||||||
|
'expected': 'traefik',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': '-23',
|
||||||
|
'expected': '-23',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'given': '0',
|
||||||
|
'expected': '0',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
datatable.forEach(item => {
|
||||||
|
it((item.given + ' should be transformed to ' + item.expected ), () => {
|
||||||
|
expect(pipe.transform(item.given)).toEqual(item.expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('create an instance', () => {
|
||||||
|
expect(pipe).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
27
webui/src/app/pipes/humanreadable.filter.pipe.ts
Normal file
27
webui/src/app/pipes/humanreadable.filter.pipe.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import { Pipe, PipeTransform } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HumanReadableFilterPipe converts a time period in nanoseconds to a human-readable
|
||||||
|
* string.
|
||||||
|
*/
|
||||||
|
@Pipe({name: 'humanreadable'})
|
||||||
|
export class HumanReadableFilterPipe implements PipeTransform {
|
||||||
|
transform(value): any {
|
||||||
|
let result = '';
|
||||||
|
const powerOf10 = Math.floor(Math.log10(value));
|
||||||
|
|
||||||
|
if (powerOf10 > 11) {
|
||||||
|
result = value / (60 * Math.pow(10, 9)) + 'm';
|
||||||
|
} else if (powerOf10 > 9) {
|
||||||
|
result = value / Math.pow(10, 9) + 's';
|
||||||
|
} else if (powerOf10 > 6) {
|
||||||
|
result = value / Math.pow(10, 6) + 'ms';
|
||||||
|
} else if (value > 0) {
|
||||||
|
result = Math.floor(value) + 'ns';
|
||||||
|
} else {
|
||||||
|
result = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -67,6 +67,9 @@ export class ApiService {
|
||||||
frontend.headers.customResponseHeaders = this.toHeaderArray(frontend.headers.customResponseHeaders);
|
frontend.headers.customResponseHeaders = this.toHeaderArray(frontend.headers.customResponseHeaders);
|
||||||
frontend.headers.sslProxyHeaders = this.toHeaderArray(frontend.headers.sslProxyHeaders);
|
frontend.headers.sslProxyHeaders = this.toHeaderArray(frontend.headers.sslProxyHeaders);
|
||||||
}
|
}
|
||||||
|
if (frontend.ratelimit && frontend.ratelimit.rateset) {
|
||||||
|
frontend.ratelimit.rateset = this.toArray(frontend.ratelimit.rateset, 'id');
|
||||||
|
}
|
||||||
return frontend;
|
return frontend;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue