| 
									
										
										
										
											2018-03-31 15:31:03 +01:00
										 |  |  | package forward
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-11 21:18:41 +01:00
										 |  |  | import (
 | 
					
						
							|  |  |  | 	"github.com/coredns/coredns/request"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/miekg/dns"
 | 
					
						
							|  |  |  | )
 | 
					
						
							| 
									
										
										
										
											2018-03-31 15:31:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-14 17:55:55 +02:00
										 |  |  | // truncated looks at the error and if truncated return a nil error
 | 
					
						
							| 
									
										
										
										
											2018-03-31 15:31:03 +01:00
										 |  |  | // and a possible reconstructed dns message if that was nil.
 | 
					
						
							| 
									
										
										
										
											2018-04-11 21:18:41 +01:00
										 |  |  | func truncated(state request.Request, ret *dns.Msg, err error) (*dns.Msg, error) {
 | 
					
						
							| 
									
										
										
										
											2018-03-31 15:31:03 +01:00
										 |  |  | 	// If you query for instance ANY isc.org; you get a truncated query back which miekg/dns fails to unpack
 | 
					
						
							|  |  |  | 	// because the RRs are not finished. The returned message can be useful or useless. Return the original
 | 
					
						
							|  |  |  | 	// query with some header bits set that they should retry with TCP.
 | 
					
						
							|  |  |  | 	if err != dns.ErrTruncated {
 | 
					
						
							|  |  |  | 		return ret, err
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// We may or may not have something sensible... if not reassemble something to send to the client.
 | 
					
						
							|  |  |  | 	m := ret
 | 
					
						
							|  |  |  | 	if ret == nil {
 | 
					
						
							|  |  |  | 		m = new(dns.Msg)
 | 
					
						
							| 
									
										
										
										
											2018-04-11 21:18:41 +01:00
										 |  |  | 		m.SetReply(state.Req)
 | 
					
						
							| 
									
										
										
										
											2018-03-31 15:31:03 +01:00
										 |  |  | 		m.Truncated = true
 | 
					
						
							|  |  |  | 		m.Authoritative = true
 | 
					
						
							|  |  |  | 		m.Rcode = dns.RcodeSuccess
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 	return m, nil
 | 
					
						
							|  |  |  | }
 |