| 
									
										
										
										
											2016-10-17 07:51:44 +01:00
										 |  |  | # Middleware
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Writing Middleware
 | 
					
						
							| 
									
										
										
										
											2016-03-19 19:56:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | From the Caddy docs: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | > Oh yes, those pesky return values on ServeHTTP(). You read the documentation so you already know
 | 
					
						
							|  |  |  | > what they mean. But what does that imply for the behavior of your middleware?
 | 
					
						
							|  |  |  | > | 
					
						
							|  |  |  | > Basically, return a status code only if you did NOT write to the response body. If you DO write to
 | 
					
						
							|  |  |  | > the response body, return a status code of 0. Return an error value if your middleware encountered
 | 
					
						
							|  |  |  | > an error that you want logged. It is common to return an error status and an error value together,
 | 
					
						
							|  |  |  | > so that the error handler up the chain can write the correct error page.
 | 
					
						
							|  |  |  | > | 
					
						
							|  |  |  | > The returned status code is not logged directly; rather, it tells middleware higher up the chain
 | 
					
						
							|  |  |  | > what status code to use if/when the response body is written. Again, return a 0 status if you've
 | 
					
						
							|  |  |  | > already written a body!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the DNS status codes are called rcodes and it's slightly harder to return the correct | 
					
						
							|  |  |  | answer in case of failure. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 07:59:30 +01:00
										 |  |  | So CoreDNS treats: | 
					
						
							| 
									
										
										
										
											2016-03-19 20:53:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | * SERVFAIL (dns.RcodeServerFailure) | 
					
						
							|  |  |  | * REFUSED (dns.RecodeRefused) | 
					
						
							|  |  |  | * FORMERR (dns.RcodeFormatError) | 
					
						
							|  |  |  | * NOTIMP (dns.RcodeNotImplemented) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-28 09:34:29 +01:00
										 |  |  | as special and will then assume nothing has written to the client. In all other cases it is assumes | 
					
						
							|  |  |  | something has been written to the client (by the middleware). | 
					
						
							| 
									
										
										
										
											2016-10-17 07:51:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Hooking it up
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TODO(miek): text here on how to hook up middleware. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 07:47:18 +01:00
										 |  |  | ## Metrics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When exporting metrics the *Namespace* should be `middleware.Namespace` (="coredns"), and the | 
					
						
							|  |  |  | *Subsystem* should be the name of the middleware. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Documentation
 | 
					
						
							| 
									
										
										
										
											2016-10-17 07:51:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Each middleware should have a README.md explaining what the middleware does and how it is | 
					
						
							|  |  |  | configured. The file should have the following layout: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * Title: use the middleware's name | 
					
						
							|  |  |  | * Subsection titled: "Syntax" | 
					
						
							|  |  |  | * Subsection titled: "Examples" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | More sections are of course possible. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-18 07:47:18 +01:00
										 |  |  | ### Style
 | 
					
						
							| 
									
										
										
										
											2016-10-17 07:51:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | We use the Unix manual page style: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * The name of middleware in the running text should be italic: *middleware*. | 
					
						
							|  |  |  | * all CAPITAL: user supplied argument, in the running text references this use strong text: `**`: | 
					
						
							|  |  |  |   **EXAMPLE**. | 
					
						
							|  |  |  | * Optional text: in block quotes: `[optional]`. | 
					
						
							|  |  |  | * Use three dots to indicate multiple options are allowed: `arg...`. | 
					
						
							|  |  |  | * Item used literal: `literal`. |