Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
C
Coredns
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Railgun
Coredns
Commits
740178c8
Commit
740178c8
authored
Mar 21, 2016
by
Miek Gieben
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more stuff; insight: use proxy for upstream queries
parent
ecc5f286
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
156 additions
and
97 deletions
+156
-97
middleware/etcd/etcd.go
middleware/etcd/etcd.go
+3
-0
middleware/etcd/etcd.md
middleware/etcd/etcd.md
+0
-3
middleware/etcd/lookup.go
middleware/etcd/lookup.go
+45
-85
middleware/exchange.go
middleware/exchange.go
+0
-6
middleware/proxy/lookup.go
middleware/proxy/lookup.go
+105
-0
middleware/zone.go
middleware/zone.go
+3
-3
No files found.
middleware/etcd/etcd.go
View file @
740178c8
...
@@ -8,6 +8,7 @@ import (
...
@@ -8,6 +8,7 @@ import (
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/etcd/msg"
"github.com/miekg/coredns/middleware/etcd/msg"
"github.com/miekg/coredns/middleware/etcd/singleflight"
"github.com/miekg/coredns/middleware/etcd/singleflight"
"github.com/miekg/coredns/middleware/proxy"
etcdc
"github.com/coreos/etcd/client"
etcdc
"github.com/coreos/etcd/client"
"golang.org/x/net/context"
"golang.org/x/net/context"
...
@@ -17,6 +18,7 @@ type (
...
@@ -17,6 +18,7 @@ type (
Etcd
struct
{
Etcd
struct
{
Next
middleware
.
Handler
Next
middleware
.
Handler
Zones
[]
string
Zones
[]
string
Proxy
proxy
.
Proxy
client
etcdc
.
KeysAPI
client
etcdc
.
KeysAPI
ctx
context
.
Context
ctx
context
.
Context
inflight
*
singleflight
.
Group
inflight
*
singleflight
.
Group
...
@@ -28,6 +30,7 @@ func NewEtcd(client etcdc.KeysAPI, next middleware.Handler, zones []string) Etcd
...
@@ -28,6 +30,7 @@ func NewEtcd(client etcdc.KeysAPI, next middleware.Handler, zones []string) Etcd
return
Etcd
{
return
Etcd
{
Next
:
next
,
Next
:
next
,
Zones
:
zones
,
Zones
:
zones
,
Proxy
:
proxy
.
New
([]
string
{
"8.8.8.8:53"
}),
client
:
client
,
client
:
client
,
ctx
:
context
.
Background
(),
ctx
:
context
.
Background
(),
inflight
:
&
singleflight
.
Group
{},
inflight
:
&
singleflight
.
Group
{},
...
...
middleware/etcd/etcd.md
View file @
740178c8
...
@@ -4,9 +4,6 @@
...
@@ -4,9 +4,6 @@
a
[
message
](
https://github.com/skynetservices/skydns/blob/2fcff74cdc9f9a7dd64189a447ef27ac354b725f/msg/service.go#L26
)
a
[
message
](
https://github.com/skynetservices/skydns/blob/2fcff74cdc9f9a7dd64189a447ef27ac354b725f/msg/service.go#L26
)
like
[
SkyDNS
](
https//github.com/skynetservices/skydns
)
.
like
[
SkyDNS
](
https//github.com/skynetservices/skydns
)
.
If you need replies to SOA and NS queries you should add a little zone after etcd directive that has
these resource records.
## Syntax
## Syntax
~~~
~~~
...
...
middleware/etcd/lookup.go
View file @
740178c8
package
etcd
package
etcd
/*
import
(
func (s *server) AddressRecords(q dns.Question, name string, previousRecords []dns.RR, state middleware.State) (records []dns.RR, err error) {
"math"
services, err := s.backend.Records(name, false)
"net"
"github.com/miekg/coredns/middleware"
"github.com/miekg/coredns/middleware/etcd/msg"
"github.com/miekg/dns"
)
// need current zone argument.
func
(
e
Etcd
)
AddressRecords
(
zone
string
,
state
middleware
.
State
,
previousRecords
[]
dns
.
RR
)
(
records
[]
dns
.
RR
,
err
error
)
{
services
,
err
:=
e
.
Records
(
state
.
Name
(),
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -14,24 +24,25 @@ func (s *server) AddressRecords(q dns.Question, name string, previousRecords []d
...
@@ -14,24 +24,25 @@ func (s *server) AddressRecords(q dns.Question, name string, previousRecords []d
switch
{
switch
{
case
ip
==
nil
:
case
ip
==
nil
:
// Try to resolve as CNAME if it's not an IP, but only if we don't create loops.
// Try to resolve as CNAME if it's not an IP, but only if we don't create loops.
if q.Name == dns.Fqdn(serv.Host) {
// TODO(miek): lowercasing, use Match in middleware/
if
state
.
Name
()
==
dns
.
Fqdn
(
serv
.
Host
)
{
// x CNAME x is a direct loop, don't add those
// x CNAME x is a direct loop, don't add those
continue
continue
}
}
newRecord := serv.NewCNAME(
q.Name
, dns.Fqdn(serv.Host))
newRecord
:=
serv
.
NewCNAME
(
state
.
QName
()
,
dns
.
Fqdn
(
serv
.
Host
))
if
len
(
previousRecords
)
>
7
{
if
len
(
previousRecords
)
>
7
{
logf("CNAME lookup limit of 8 exceeded for %s", newRecord)
// don't add it, and just continue
// don't add it, and just continue
continue
continue
}
}
if s.isDuplicateCNAME(newRecord, previousRecords) {
if
isDuplicateCNAME
(
newRecord
,
previousRecords
)
{
logf("CNAME loop detected for record %s", newRecord)
continue
continue
}
}
nextRecords, err := s.AddressRecords(dns.Question{Name: dns.Fqdn(serv.Host), Qtype: q.Qtype, Qclass: q.Qclass},
// Fucks up recursion, need to define this in the function
strings.ToLower(dns.Fqdn(serv.Host)), append(previousRecords, newRecord), state)
// are use another var
state
.
Req
.
Question
[
0
]
=
dns
.
Question
{
Name
:
dns
.
Fqdn
(
serv
.
Host
),
Qtype
:
state
.
QType
(),
Qclass
:
state
.
QClass
()}
nextRecords
,
err
:=
e
.
AddressRecords
(
zone
,
state
,
append
(
previousRecords
,
newRecord
))
if
err
==
nil
{
if
err
==
nil
{
// Only have we found something we should add the CNAME and the IP addresses.
// Only have we found something we should add the CNAME and the IP addresses.
if
len
(
nextRecords
)
>
0
{
if
len
(
nextRecords
)
>
0
{
...
@@ -42,59 +53,31 @@ func (s *server) AddressRecords(q dns.Question, name string, previousRecords []d
...
@@ -42,59 +53,31 @@ func (s *server) AddressRecords(q dns.Question, name string, previousRecords []d
}
}
// This means we can not complete the CNAME, try to look else where.
// This means we can not complete the CNAME, try to look else where.
target
:=
newRecord
.
Target
target
:=
newRecord
.
Target
if dns.IsSubDomain(
s.config.Domain
, target) {
if
dns
.
IsSubDomain
(
zone
,
target
)
{
// We should already have found it
// We should already have found it
continue
continue
}
}
m1, e1 :=
s.Lookup(target, q.Qtype, bufsize, dnssec
)
m1
,
e1
:=
e
.
Proxy
.
Lookup
(
state
,
target
,
state
.
QType
()
)
if
e1
!=
nil
{
if
e1
!=
nil
{
logf("incomplete CNAME chain: %s", e1)
continue
continue
}
}
// Len(m1.Answer) > 0 here is well?
// Len(m1.Answer) > 0 here is well?
records
=
append
(
records
,
newRecord
)
records
=
append
(
records
,
newRecord
)
records
=
append
(
records
,
m1
.
Answer
...
)
records
=
append
(
records
,
m1
.
Answer
...
)
continue
continue
case ip.To4() != nil && (
q.Qtype == dns.TypeA || both
):
case
ip
.
To4
()
!=
nil
&&
(
state
.
QType
()
==
dns
.
TypeA
)
:
records = append(records, serv.NewA(
q.Name
, ip.To4()))
records
=
append
(
records
,
serv
.
NewA
(
state
.
QName
()
,
ip
.
To4
()))
case ip.To4() == nil && (
q.Qtype == dns.TypeAAAA || both
):
case
ip
.
To4
()
==
nil
&&
(
state
.
QType
()
==
dns
.
TypeAAAA
)
:
records = append(records, serv.NewAAAA(
q.Name
, ip.To16()))
records
=
append
(
records
,
serv
.
NewAAAA
(
state
.
QName
()
,
ip
.
To16
()))
}
}
}
}
return
records
,
nil
return
records
,
nil
}
}
// NSRecords returns NS records from etcd.
func (s *server) NSRecords(q dns.Question, state middleware.State) (records []dns.RR, extra []dns.RR, err error) {
services, err := s.backend.Records(name, false)
if err != nil {
return nil, nil, err
}
services = msg.Group(services)
for _, serv := range services {
ip := net.ParseIP(serv.Host)
switch {
case ip == nil:
return nil, nil, fmt.Errorf("NS record must be an IP address")
case ip.To4() != nil:
serv.Host = msg.Domain(serv.Key)
records = append(records, serv.NewNS(q.Name, serv.Host))
extra = append(extra, serv.NewA(serv.Host, ip.To4()))
case ip.To4() == nil:
serv.Host = msg.Domain(serv.Key)
records = append(records, serv.NewNS(q.Name, serv.Host))
extra = append(extra, serv.NewAAAA(serv.Host, ip.To16()))
}
}
return records, extra, nil
}
// SRVRecords returns SRV records from etcd.
// SRVRecords returns SRV records from etcd.
// If the Target is not a name but an IP address, a name is created.
// If the Target is not a name but an IP address, a name is created
on the fly
.
func (
s *server) SRVRecords(s
middleware.State) (records []dns.RR, extra []dns.RR, err error) {
func
(
e
Etcd
)
SRVRecords
(
zone
string
,
state
middleware
.
State
)
(
records
[]
dns
.
RR
,
extra
[]
dns
.
RR
,
err
error
)
{
services, err :=
s.backend
.Records(name, false)
services
,
err
:=
e
.
Records
(
name
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
...
@@ -126,7 +109,7 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
...
@@ -126,7 +109,7 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
ip
:=
net
.
ParseIP
(
serv
.
Host
)
ip
:=
net
.
ParseIP
(
serv
.
Host
)
switch
{
switch
{
case
ip
==
nil
:
case
ip
==
nil
:
srv := serv.NewSRV(
q.Name
, weight)
srv
:=
serv
.
NewSRV
(
state
.
QName
()
,
weight
)
records
=
append
(
records
,
srv
)
records
=
append
(
records
,
srv
)
if
_
,
ok
:=
lookup
[
srv
.
Target
];
ok
{
if
_
,
ok
:=
lookup
[
srv
.
Target
];
ok
{
...
@@ -135,12 +118,12 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
...
@@ -135,12 +118,12 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
lookup
[
srv
.
Target
]
=
true
lookup
[
srv
.
Target
]
=
true
if !dns.IsSubDomain(
s.config.Domain
, srv.Target) {
if
!
dns
.
IsSubDomain
(
zone
,
srv
.
Target
)
{
m1, e1 :=
s.Lookup(srv.Target, dns.TypeA, bufsize, dnssec
)
m1
,
e1
:=
e
.
Proxy
.
Lookup
(
state
,
srv
.
Target
,
dns
.
TypeA
)
if
e1
==
nil
{
if
e1
==
nil
{
extra
=
append
(
extra
,
m1
.
Answer
...
)
extra
=
append
(
extra
,
m1
.
Answer
...
)
}
}
m1, e1 =
s.Lookup(srv.Target, dns.TypeAAAA, bufsize, dnssec
)
m1
,
e1
=
e
.
Proxy
.
Lookup
(
state
,
srv
.
Target
,
dns
.
TypeAAAA
)
if
e1
==
nil
{
if
e1
==
nil
{
// If we have seen CNAME's we *assume* that they are already added.
// If we have seen CNAME's we *assume* that they are already added.
for
_
,
a
:=
range
m1
.
Answer
{
for
_
,
a
:=
range
m1
.
Answer
{
...
@@ -154,7 +137,7 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
...
@@ -154,7 +137,7 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
// Internal name, we should have some info on them, either v4 or v6
// Internal name, we should have some info on them, either v4 or v6
// Clients expect a complete answer, because we are a recursor in their
// Clients expect a complete answer, because we are a recursor in their
// view.
// view.
addr, e1 :=
s
.AddressRecords(dns.Question{srv.Target, dns.ClassINET, dns.TypeA},
addr
,
e1
:=
e
.
AddressRecords
(
dns
.
Question
{
srv
.
Target
,
dns
.
ClassINET
,
dns
.
TypeA
},
srv
.
Target
,
nil
,
bufsize
,
dnssec
,
true
)
srv
.
Target
,
nil
,
bufsize
,
dnssec
,
true
)
if
e1
==
nil
{
if
e1
==
nil
{
extra
=
append
(
extra
,
addr
...
)
extra
=
append
(
extra
,
addr
...
)
...
@@ -177,9 +160,9 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
...
@@ -177,9 +160,9 @@ func (s *server) SRVRecords(s middleware.State) (records []dns.RR, extra []dns.R
}
}
// MXRecords returns MX records from etcd.
// MXRecords returns MX records from etcd.
// If the Target is not a name but an IP address, a name is created.
// If the Target is not a name but an IP address, a name is created
on the fly
.
func (
s *server) MXRecords(q dns.Question, name string, s
middleware.State) (records []dns.RR, extra []dns.RR, err error) {
func
(
e
Etcd
)
MXRecords
(
zone
string
,
state
middleware
.
State
)
(
records
[]
dns
.
RR
,
extra
[]
dns
.
RR
,
err
error
)
{
services, err :=
s.backend
.Records(name, false)
services
,
err
:=
e
.
Records
(
name
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
...
@@ -201,11 +184,11 @@ func (s *server) MXRecords(q dns.Question, name string, s middleware.State) (rec
...
@@ -201,11 +184,11 @@ func (s *server) MXRecords(q dns.Question, name string, s middleware.State) (rec
lookup
[
mx
.
Mx
]
=
true
lookup
[
mx
.
Mx
]
=
true
if
!
dns
.
IsSubDomain
(
s
.
config
.
Domain
,
mx
.
Mx
)
{
if
!
dns
.
IsSubDomain
(
s
.
config
.
Domain
,
mx
.
Mx
)
{
m1, e1 :=
s.Lookup(mx.Mx, dns.TypeA, bufsize, dnssec
)
m1
,
e1
:=
e
.
Proxy
.
Lookup
(
state
,
mx
.
Mx
,
dns
.
TypeA
)
if
e1
==
nil
{
if
e1
==
nil
{
extra
=
append
(
extra
,
m1
.
Answer
...
)
extra
=
append
(
extra
,
m1
.
Answer
...
)
}
}
m1, e1 =
s.Lookup(mx.Mx, dns.TypeAAAA, bufsize, dnssec
)
m1
,
e1
=
e
.
Proxy
.
Lookup
(
state
,
mx
.
Mx
,
dns
.
TypeAAAA
)
if
e1
==
nil
{
if
e1
==
nil
{
// If we have seen CNAME's we *assume* that they are already added.
// If we have seen CNAME's we *assume* that they are already added.
for
_
,
a
:=
range
m1
.
Answer
{
for
_
,
a
:=
range
m1
.
Answer
{
...
@@ -235,8 +218,8 @@ func (s *server) MXRecords(q dns.Question, name string, s middleware.State) (rec
...
@@ -235,8 +218,8 @@ func (s *server) MXRecords(q dns.Question, name string, s middleware.State) (rec
return
records
,
extra
,
nil
return
records
,
extra
,
nil
}
}
func (
s *server) CNAMERecords(q dns.Question
, state middleware.State) (records []dns.RR, err error) {
func
(
e
Etcd
)
CNAMERecords
(
zone
string
,
state
middleware
.
State
)
(
records
[]
dns
.
RR
,
err
error
)
{
services, err :=
s.backend
.Records(name, true)
services
,
err
:=
e
.
Records
(
name
,
true
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -252,8 +235,8 @@ func (s *server) CNAMERecords(q dns.Question, state middleware.State) (records [
...
@@ -252,8 +235,8 @@ func (s *server) CNAMERecords(q dns.Question, state middleware.State) (records [
return
records
,
nil
return
records
,
nil
}
}
func (
s *server) TXTRecords(q dns.Question
, state middleware.State) (records []dns.RR, err error) {
func
(
e
Etcd
)
TXTRecords
(
zone
string
,
state
middleware
.
State
)
(
records
[]
dns
.
RR
,
err
error
)
{
services, err :=
s.backend.Records(name
, false)
services
,
err
:=
e
.
Records
(
state
.
Name
()
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -280,6 +263,7 @@ func isDuplicateCNAME(r *dns.CNAME, records []dns.RR) bool {
...
@@ -280,6 +263,7 @@ func isDuplicateCNAME(r *dns.CNAME, records []dns.RR) bool {
return
false
return
false
}
}
/*
// Move to state.go somehow?
// Move to state.go somehow?
func (s *server) NameError(req *dns.Msg) *dns.Msg {
func (s *server) NameError(req *dns.Msg) *dns.Msg {
m := new(dns.Msg)
m := new(dns.Msg)
...
@@ -289,30 +273,6 @@ func (s *server) NameError(req *dns.Msg) *dns.Msg {
...
@@ -289,30 +273,6 @@ func (s *server) NameError(req *dns.Msg) *dns.Msg {
return m
return m
}
}
// overflowOrTruncated writes back an error to the client if the message does not fit.
// It updates prometheus metrics. If something has been written to the client, true
// will be returned.
func (s *server) overflowOrTruncated(w dns.ResponseWriter, m *dns.Msg, bufsize int, sy metrics.System) bool {
switch isTCP(w) {
case true:
if _, overflow := Fit(m, dns.MaxMsgSize, true); overflow {
metrics.ReportErrorCount(m, sy)
msgFail := s.ServerFailure(m)
w.WriteMsg(msgFail)
return true
}
case false:
// Overflow with udp always results in TC.
Fit(m, bufsize, false)
metrics.ReportErrorCount(m, sy)
if m.Truncated {
w.WriteMsg(m)
return true
}
}
return false
}
// etcNameError return a NameError to the client if the error
// etcNameError return a NameError to the client if the error
// returned from etcd has ErrorCode == 100.
// returned from etcd has ErrorCode == 100.
func isEtcdNameError(err error, s *server) bool {
func isEtcdNameError(err error, s *server) bool {
...
...
middleware/exchange.go
View file @
740178c8
...
@@ -2,13 +2,7 @@ package middleware
...
@@ -2,13 +2,7 @@ package middleware
import
"github.com/miekg/dns"
import
"github.com/miekg/dns"
// Exchang sends message m to the server.
// TODO(miek): optionally it can do retries of other silly stuff.
func
Exchange
(
c
*
dns
.
Client
,
m
*
dns
.
Msg
,
server
string
)
(
*
dns
.
Msg
,
error
)
{
func
Exchange
(
c
*
dns
.
Client
,
m
*
dns
.
Msg
,
server
string
)
(
*
dns
.
Msg
,
error
)
{
r
,
_
,
err
:=
c
.
Exchange
(
m
,
server
)
r
,
_
,
err
:=
c
.
Exchange
(
m
,
server
)
return
r
,
err
return
r
,
err
}
}
// Lookup functions, ala
// LookupHost
// LookupCNAME
middleware/proxy/lookup.go
0 → 100644
View file @
740178c8
package
proxy
// function OTHER middleware might want to use to do lookup in the same
// style as the proxy.
import
(
"net/http"
"sync/atomic"
"time"
"github.com/miekg/coredns/middleware"
"github.com/miekg/dns"
)
func
New
(
hosts
[]
string
)
Proxy
{
p
:=
Proxy
{
Next
:
nil
,
Client
:
Clients
()}
upstream
:=
&
staticUpstream
{
from
:
""
,
proxyHeaders
:
make
(
http
.
Header
),
Hosts
:
make
([]
*
UpstreamHost
,
len
(
hosts
)),
Policy
:
&
Random
{},
FailTimeout
:
10
*
time
.
Second
,
MaxFails
:
1
,
}
for
i
,
host
:=
range
hosts
{
uh
:=
&
UpstreamHost
{
Name
:
host
,
Conns
:
0
,
Fails
:
0
,
FailTimeout
:
upstream
.
FailTimeout
,
Unhealthy
:
false
,
ExtraHeaders
:
upstream
.
proxyHeaders
,
CheckDown
:
func
(
upstream
*
staticUpstream
)
UpstreamHostDownFunc
{
return
func
(
uh
*
UpstreamHost
)
bool
{
if
uh
.
Unhealthy
{
return
true
}
if
uh
.
Fails
>=
upstream
.
MaxFails
&&
upstream
.
MaxFails
!=
0
{
return
true
}
return
false
}
}(
upstream
),
WithoutPathPrefix
:
upstream
.
WithoutPathPrefix
,
}
upstream
.
Hosts
[
i
]
=
uh
}
p
.
Upstreams
=
[]
Upstream
{
upstream
}
return
p
,
nil
}
func
(
p
Proxy
)
Lookup
(
state
middleware
.
State
,
name
string
,
tpe
uint16
)
(
*
dns
.
Msg
,
error
)
{
req
:=
new
(
dns
.
Msg
)
req
.
SetQuestion
(
name
,
tpe
)
// TODO(miek):
// USE STATE FOR DNSSEC ETCD BUFSIZE BLA BLA
return
p
.
lookup
(
state
,
req
)
}
func
(
p
Proxy
)
lookup
(
state
middleware
.
State
,
r
*
dns
.
Msg
)
(
*
dns
.
Msg
,
error
)
{
var
(
reply
*
dns
.
Msg
err
error
)
for
_
,
upstream
:=
range
p
.
Upstreams
{
// allowed bla bla bla TODO(miek): fix full proxy spec from caddy
start
:=
time
.
Now
()
// Since Select() should give us "up" hosts, keep retrying
// hosts until timeout (or until we get a nil host).
for
time
.
Now
()
.
Sub
(
start
)
<
tryDuration
{
host
:=
upstream
.
Select
()
if
host
==
nil
{
return
nil
,
errUnreachable
}
atomic
.
AddInt64
(
&
host
.
Conns
,
1
)
// tls+tcp ?
if
state
.
Proto
()
==
"tcp"
{
reply
,
err
=
middleware
.
Exchange
(
p
.
Client
.
TCP
,
r
,
host
.
Name
)
}
else
{
reply
,
err
=
middleware
.
Exchange
(
p
.
Client
.
UDP
,
r
,
host
.
Name
)
}
atomic
.
AddInt64
(
&
host
.
Conns
,
-
1
)
if
err
==
nil
{
return
reply
,
nil
}
timeout
:=
host
.
FailTimeout
if
timeout
==
0
{
timeout
=
10
*
time
.
Second
}
atomic
.
AddInt32
(
&
host
.
Fails
,
1
)
go
func
(
host
*
UpstreamHost
,
timeout
time
.
Duration
)
{
time
.
Sleep
(
timeout
)
atomic
.
AddInt32
(
&
host
.
Fails
,
-
1
)
}(
host
,
timeout
)
}
return
nil
,
errUnreachable
}
return
nil
,
errUnreachable
}
middleware/zone.go
View file @
740178c8
...
@@ -4,12 +4,12 @@ import "strings"
...
@@ -4,12 +4,12 @@ import "strings"
type
Zones
[]
string
type
Zones
[]
string
// Matches checks to see if other matches p.
// Matches checks to see if other matches p. The match will return the most
// The match will return the most specific zones
// specific zones that matches other. The empty string signals a not found
// that matches other. The empty string signals a not found
// condition.
// condition.
func
(
z
Zones
)
Matches
(
qname
string
)
string
{
func
(
z
Zones
)
Matches
(
qname
string
)
string
{
zone
:=
""
zone
:=
""
// TODO(miek): use IsSubDomain here?
for
_
,
zname
:=
range
z
{
for
_
,
zname
:=
range
z
{
if
strings
.
HasSuffix
(
qname
,
zname
)
{
if
strings
.
HasSuffix
(
qname
,
zname
)
{
if
len
(
zname
)
>
len
(
zone
)
{
if
len
(
zname
)
>
len
(
zone
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment