| 
									
										
										
										
											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 | 
					
						
							|  |  |  | } |