aboutsummaryrefslogtreecommitdiff
path: root/middleware/kubernetes/autopath/autopath.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/kubernetes/autopath/autopath.go')
-rw-r--r--middleware/kubernetes/autopath/autopath.go36
1 files changed, 13 insertions, 23 deletions
diff --git a/middleware/kubernetes/autopath/autopath.go b/middleware/kubernetes/autopath/autopath.go
index abcb360ae..c1b2179ae 100644
--- a/middleware/kubernetes/autopath/autopath.go
+++ b/middleware/kubernetes/autopath/autopath.go
@@ -1,6 +1,10 @@
package autopath
-import "github.com/miekg/dns"
+import (
+ "strings"
+
+ "github.com/miekg/dns"
+)
// Writer implements a ResponseWriter that also does the following:
// * reverts question section of a packet to its original state.
@@ -18,7 +22,6 @@ type Writer struct {
dns.ResponseWriter
original dns.Question
Rcode int
- Sent bool
}
// AutoPath enables server side search path lookups for pods.
@@ -40,24 +43,10 @@ func NewWriter(w dns.ResponseWriter, r *dns.Msg) *Writer {
// WriteMsg writes to client, unless response will be NXDOMAIN.
func (apw *Writer) WriteMsg(res *dns.Msg) error {
- return apw.overrideMsg(res, false)
-}
-
-// ForceWriteMsg forces the write to client regardless of response code.
-func (apw *Writer) ForceWriteMsg(res *dns.Msg) error {
- return apw.overrideMsg(res, true)
-}
-
-// overrideMsg overrides rcode, reverts question, adds CNAME, and calls the
-// underlying ResponseWriter's WriteMsg method unless the write is deferred,
-// or force = true.
-func (apw *Writer) overrideMsg(res *dns.Msg, force bool) error {
if res.Rcode == dns.RcodeNameError {
res.Rcode = apw.Rcode
}
- if res.Rcode != dns.RcodeSuccess && !force {
- return nil
- }
+
for _, a := range res.Answer {
if apw.original.Name == a.Header().Name {
continue
@@ -67,7 +56,7 @@ func (apw *Writer) overrideMsg(res *dns.Msg, force bool) error {
res.Answer[0] = CNAME(apw.original.Name, a.Header().Name, a.Header().Ttl)
}
res.Question[0] = apw.original
- apw.Sent = true
+
return apw.ResponseWriter.WriteMsg(res)
}
@@ -77,9 +66,10 @@ func (apw *Writer) Write(buf []byte) (int, error) {
return n, err
}
-// Hijack implements dns.Hijacker. It simply wraps the underlying
-// ResponseWriter's Hijack method if there is one, or returns an error.
-func (apw *Writer) Hijack() {
- apw.ResponseWriter.Hijack()
- return
+func SplitSearch(zone, question, namespace string) (name, search string, ok bool) {
+ search = strings.Join([]string{namespace, "svc", zone}, ".")
+ if dns.IsSubDomain(search, question) {
+ return question[:len(question)-len(search)-1], search, true
+ }
+ return "", "", false
}