diff options
author | 2017-01-15 08:12:58 +0000 | |
---|---|---|
committer | 2017-01-15 08:12:58 +0000 | |
commit | 52e01264e8a5901209f83335aa96e091c93ced7e (patch) | |
tree | 433625011d8ce8f041147ec4ef171d55678be2be /middleware/proxy/proxy.go | |
parent | a6d232a622a2f83a5d5ea1d9d946da7f910a0f9e (diff) | |
download | coredns-52e01264e8a5901209f83335aa96e091c93ced7e.tar.gz coredns-52e01264e8a5901209f83335aa96e091c93ced7e.tar.zst coredns-52e01264e8a5901209f83335aa96e091c93ced7e.zip |
middleware/proxy: implement Exchanger (#480)
By defining and using an proxy.Exchanger interface we make the proxy
more generic and we can then fold back httproxy into proxy.
This overrides #463 and #473 and should make futures extensions rather
trivial
* Add docs that talk about `protocol` and how to set it.
* middleware/proxy: rename New to NewLookup
It's used as a Lookup mechanism not as a completely new proxy,
reflect that in the name.
* Set maxfails to 3 by default when looking up names.
Most of the changes have been copied
from https://github.com/johnbelamaric/coredns/pull/1/files
Diffstat (limited to 'middleware/proxy/proxy.go')
-rw-r--r-- | middleware/proxy/proxy.go | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/middleware/proxy/proxy.go b/middleware/proxy/proxy.go index 353e82c19..d1fde90e3 100644 --- a/middleware/proxy/proxy.go +++ b/middleware/proxy/proxy.go @@ -7,17 +7,20 @@ import ( "time" "github.com/miekg/coredns/middleware" + "github.com/miekg/coredns/request" "github.com/miekg/dns" "golang.org/x/net/context" ) -var errUnreachable = errors.New("unreachable backend") +var ( + errUnreachable = errors.New("unreachable backend") + errInvalidProtocol = errors.New("invalid protocol") +) -// Proxy represents a middleware instance that can proxy requests to another DNS server. +// Proxy represents a middleware instance that can proxy requests to another (DNS) server. type Proxy struct { Next middleware.Handler - Client *client Upstreams []Upstream } @@ -46,6 +49,7 @@ type UpstreamHost struct { Unhealthy bool CheckDown UpstreamHostDownFunc WithoutPathPrefix string + Exchanger } // Down checks whether the upstream host is down or not. @@ -66,6 +70,7 @@ var tryDuration = 60 * time.Second // ServeDNS satisfies the middleware.Handler interface. func (p Proxy) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { + state := request.Request{W: w, Req: r} for _, upstream := range p.Upstreams { start := time.Now() @@ -82,7 +87,7 @@ func (p Proxy) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) ( atomic.AddInt64(&host.Conns, 1) - reply, backendErr := p.Client.ServeDNS(w, r, host) + reply, backendErr := host.Exchange(state) atomic.AddInt64(&host.Conns, -1) |