func (r *resolver) handleSRVQuery(svc string, query *dns.Msg) (*dns.Msg, error) { srv, ip := r.backend.ResolveService(svc) if len(srv) == 0 { return nil, nil } if len(srv) != len(ip) { return nil, fmt.Errorf("invalid reply for SRV query %s", svc) } resp := createRespMsg(query) for i, r := range srv { rr := new(dns.SRV) rr.Hdr = dns.RR_Header{Name: svc, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: respTTL} rr.Port = r.Port rr.Target = r.Target resp.Answer = append(resp.Answer, rr) rr1 := new(dns.A) rr1.Hdr = dns.RR_Header{Name: r.Target, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: respTTL} rr1.A = ip[i] resp.Extra = append(resp.Extra, rr1) } return resp, nil }
func (s *DNSXmppSuite) Test_convertAnswersToSRV_convertsAnswers(c *C) { cn := new(dns.CNAME) srv := new(dns.SRV) srv.Target = "foo2.com" in := make([]dns.RR, 2) in[0] = cn in[1] = srv res := convertAnswersToSRV(in) c.Assert(res, HasLen, 1) c.Assert(res[0].Target, Equals, "foo2.com") }
func (s *DNSXmppSuite) Test_convertAnswerToSRV_returnsAValidNetSRV(c *C) { srv := new(dns.SRV) srv.Target = "foo.com" srv.Port = 123 srv.Priority = 5 srv.Weight = 42 res := convertAnswerToSRV(srv) c.Assert(res, Not(IsNil)) c.Assert(res.Target, Equals, "foo.com") c.Assert(res.Port, Equals, uint16(123)) c.Assert(res.Priority, Equals, uint16(5)) c.Assert(res.Weight, Equals, uint16(42)) }
func parseValue(t uint16, value string, h dns.RR_Header) dns.RR { switch t { case dns.TypeA: a := new(dns.A) a.Hdr = h a.A, _ = parseA(value) return a case dns.TypeAAAA: aaaa := new(dns.AAAA) aaaa.Hdr = h aaaa.AAAA, _ = parseAAAA(value) return aaaa case dns.TypeSRV: srv := new(dns.SRV) srv.Hdr = h srv.Priority, srv.Weight, srv.Port, srv.Target, _ = parseSRV(value) return srv } return nil }
func answerSRV(q *dns.Question, v *DNSValue) dns.RR { answer := new(dns.SRV) answer.Header().Name = q.Name answer.Header().Rrtype = dns.TypeSRV answer.Header().Class = dns.ClassINET answer.Priority = 50 // default if not defined priority, err := strconv.Atoi(v.Attr["priority"]) if err == nil { answer.Priority = uint16(priority) } answer.Weight = 50 // default if not defined weight, err := strconv.Atoi(v.Attr["weight"]) if err == nil { answer.Weight = uint16(weight) } answer.Port = 0 // default if not defined port, err := strconv.Atoi(v.Attr["port"]) if err == nil { answer.Port = uint16(port) } if target, ok := v.Attr["target"]; ok { answer.Target = strings.TrimSuffix(target, ".") + "." } else if v.Value != "" { // allows for simplified setting targetParts := strings.Split(v.Value, ":") answer.Target = strings.TrimSuffix(targetParts[0], ".") + "." if len(targetParts) > 1 { port, err := strconv.Atoi(targetParts[1]) if err == nil { answer.Port = uint16(port) } } } return answer }