mirror of
https://github.com/coredns/coredns.git
synced 2025-12-08 19:35:10 -05:00
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
This commit is contained in:
@@ -11,9 +11,10 @@ import (
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
// New create a new proxy with the hosts in host and a Random policy.
|
||||
func New(hosts []string) Proxy {
|
||||
p := Proxy{Next: nil, Client: newClient()}
|
||||
// NewLookup create a new proxy with the hosts in host and a Random policy.
|
||||
func NewLookup(hosts []string) Proxy {
|
||||
// TODO(miek): maybe add optional protocol parameter?
|
||||
p := Proxy{Next: nil}
|
||||
|
||||
upstream := &staticUpstream{
|
||||
from: "",
|
||||
@@ -21,7 +22,7 @@ func New(hosts []string) Proxy {
|
||||
Policy: &Random{},
|
||||
Spray: nil,
|
||||
FailTimeout: 10 * time.Second,
|
||||
MaxFails: 1,
|
||||
MaxFails: 3,
|
||||
}
|
||||
|
||||
for i, host := range hosts {
|
||||
@@ -30,6 +31,7 @@ func New(hosts []string) Proxy {
|
||||
Conns: 0,
|
||||
Fails: 0,
|
||||
FailTimeout: upstream.FailTimeout,
|
||||
Exchanger: newDNSEx(host),
|
||||
|
||||
Unhealthy: false,
|
||||
CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc {
|
||||
@@ -59,15 +61,17 @@ func (p Proxy) Lookup(state request.Request, name string, typ uint16) (*dns.Msg,
|
||||
req.SetQuestion(name, typ)
|
||||
state.SizeAndDo(req)
|
||||
|
||||
return p.lookup(state, req)
|
||||
state2 := request.Request{W: state.W, Req: req}
|
||||
|
||||
return p.lookup(state2)
|
||||
}
|
||||
|
||||
// Forward forward the request in state as-is. Unlike Lookup that adds EDNS0 suffix to the message.
|
||||
func (p Proxy) Forward(state request.Request) (*dns.Msg, error) {
|
||||
return p.lookup(state, state.Req)
|
||||
return p.lookup(state)
|
||||
}
|
||||
|
||||
func (p Proxy) lookup(state request.Request, r *dns.Msg) (*dns.Msg, error) {
|
||||
func (p Proxy) lookup(state request.Request) (*dns.Msg, error) {
|
||||
for _, upstream := range p.Upstreams {
|
||||
start := time.Now()
|
||||
|
||||
@@ -80,11 +84,11 @@ func (p Proxy) lookup(state request.Request, r *dns.Msg) (*dns.Msg, error) {
|
||||
}
|
||||
|
||||
// duplicated from proxy.go, but with a twist, we don't write the
|
||||
// reply back to the client, we return it.
|
||||
// reply back to the client, we return it and there is no monitoring.
|
||||
|
||||
atomic.AddInt64(&host.Conns, 1)
|
||||
|
||||
reply, backendErr := p.Client.ServeDNS(state.W, r, host)
|
||||
reply, backendErr := host.Exchange(state)
|
||||
|
||||
atomic.AddInt64(&host.Conns, -1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user