Skip to content

Instantly share code, notes, and snippets.

@kkharji
Created December 12, 2023 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kkharji/c5cb9fa4591a088f53d130faa13b586d to your computer and use it in GitHub Desktop.
Save kkharji/c5cb9fa4591a088f53d130faa13b586d to your computer and use it in GitHub Desktop.
func (d *DNSResolver) handlePacket(pc net.PacketConn, addr net.Addr, payload []byte) error {
var parser dnsm.Parser
log := d.log.Named("handlePacket")
header, err := parser.Start(payload)
if err != nil {
return fmt.Errorf("start parsing payload: %w", err)
}
question, err := parser.Question()
if err != nil {
return fmt.Errorf("parse question: %w", err)
}
log.Debugw("handling", "question", fmt.Sprintf("%+v", question), "requester", addr.String())
response, err := d.QueryRootServers(question)
if err != nil {
return fmt.Errorf("query root servers: %w", err)
}
response.ID = header.ID
if len(response.Answers) > 0 {
logResolved := log.With("question", question.Name.String())
for _, a := range response.Answers {
answer := ""
switch m := a.Body.(type) {
case *dnsm.AResource:
answer = net.IP(m.A[:]).String()
case *dnsm.CNAMEResource:
answer = m.CNAME.String()
case *dnsm.MXResource:
answer = m.MX.String()
}
logResolved.Infow("resovled", "answer", answer)
}
}
responsePayload, err := response.Pack()
if err != nil {
return fmt.Errorf("parse root server response: %w", err)
}
_, err = pc.WriteTo(responsePayload, addr)
if err != nil {
return fmt.Errorf("write response payload to address: %w", err)
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment