aboutsummaryrefslogtreecommitdiff
path: root/middleware/proxy/google_rr.go
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2017-02-06 19:32:48 +0000
committerGravatar GitHub <noreply@github.com> 2017-02-06 19:32:48 +0000
commit123a76c91ead7fb57e801f974a16fc3ab8312c0d (patch)
tree0b84ec261ad06e8e747c154264fca84043d07aaa /middleware/proxy/google_rr.go
parent77f957d443f9c287abc1f315cebc0c725e9e4ba0 (diff)
downloadcoredns-123a76c91ead7fb57e801f974a16fc3ab8312c0d.tar.gz
coredns-123a76c91ead7fb57e801f974a16fc3ab8312c0d.tar.zst
coredns-123a76c91ead7fb57e801f974a16fc3ab8312c0d.zip
middleware/proxy: absorb httpproxy (#481)
* middleware/proxy: absorb httpproxy Move the httproxy into proxy. This adds and Exchanger interface which is used to exchange the messages with the upstream. The https_google upstream will re-resolve itself and update the upstream hosts used every 300s. * Remove and add TODO
Diffstat (limited to 'middleware/proxy/google_rr.go')
-rw-r--r--middleware/proxy/google_rr.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/middleware/proxy/google_rr.go b/middleware/proxy/google_rr.go
new file mode 100644
index 000000000..8c7e82bc2
--- /dev/null
+++ b/middleware/proxy/google_rr.go
@@ -0,0 +1,90 @@
+package proxy
+
+import (
+ "fmt"
+
+ "github.com/miekg/dns"
+)
+
+// toMsg converts a googleMsg into the dns message. The returned RR is the comment disquised as a TXT record.
+func toMsg(g *googleMsg) (*dns.Msg, dns.RR, error) {
+ m := new(dns.Msg)
+ m.Response = true
+ m.Rcode = g.Status
+ m.Truncated = g.TC
+ m.RecursionDesired = g.RD
+ m.RecursionAvailable = g.RA
+ m.AuthenticatedData = g.AD
+ m.CheckingDisabled = g.CD
+
+ m.Question = make([]dns.Question, 1)
+ m.Answer = make([]dns.RR, len(g.Answer))
+ m.Ns = make([]dns.RR, len(g.Authority))
+ m.Extra = make([]dns.RR, len(g.Additional))
+
+ m.Question[0] = dns.Question{Name: g.Question[0].Name, Qtype: g.Question[0].Type, Qclass: dns.ClassINET}
+
+ var err error
+ for i := 0; i < len(m.Answer); i++ {
+ m.Answer[i], err = toRR(g.Answer[i])
+ if err != nil {
+ return nil, nil, err
+ }
+ }
+ for i := 0; i < len(m.Ns); i++ {
+ m.Ns[i], err = toRR(g.Authority[i])
+ if err != nil {
+ return nil, nil, err
+ }
+ }
+ for i := 0; i < len(m.Extra); i++ {
+ m.Extra[i], err = toRR(g.Additional[i])
+ if err != nil {
+ return nil, nil, err
+ }
+ }
+
+ txt, _ := dns.NewRR(". 0 CH TXT " + g.Comment)
+ return m, txt, nil
+}
+
+// toRR transforms a "google" RR to a dns.RR.
+func toRR(g googleRR) (dns.RR, error) {
+ typ, ok := dns.TypeToString[g.Type]
+ if !ok {
+ return nil, fmt.Errorf("failed to convert type %q", g.Type)
+ }
+
+ str := fmt.Sprintf("%s %d %s %s", g.Name, g.TTL, typ, g.Data)
+ rr, err := dns.NewRR(str)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse %q: %s", str, err)
+ }
+ return rr, nil
+}
+
+// googleRR represents a dns.RR in another form.
+type googleRR struct {
+ Name string
+ Type uint16
+ TTL uint32
+ Data string
+}
+
+// googleMsg is a JSON representation of the dns.Msg.
+type googleMsg struct {
+ Status int
+ TC bool
+ RD bool
+ RA bool
+ AD bool
+ CD bool
+ Question []struct {
+ Name string
+ Type uint16
+ }
+ Answer []googleRR
+ Authority []googleRR
+ Additional []googleRR
+ Comment string
+}