|  | @ -120,9 +120,10 @@ type Handler struct { | 
			
		
	
		
		
			
				
					|  |  | 	// handler chain will not affect the health status of the
 |  |  | 	// handler chain will not affect the health status of the
 | 
			
		
	
		
		
			
				
					|  |  | 	// backend.
 |  |  | 	// backend.
 | 
			
		
	
		
		
			
				
					|  |  | 	//
 |  |  | 	//
 | 
			
		
	
		
		
			
				
					
					|  |  | 	// Two new placeholders are available in this handler chain:
 |  |  | 	// Three new placeholders are available in this handler chain:
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | 	// - `{http.reverse_proxy.status_code}` The status code
 |  |  | 	// - `{http.reverse_proxy.status_code}` The status code from the response
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | 	// - `{http.reverse_proxy.status_text}` The status text
 |  |  | 	// - `{http.reverse_proxy.status_text}` The status text from the response
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  | 	// - `{http.reverse_proxy.header.*}` The headers from the response
 | 
			
		
	
		
		
			
				
					|  |  | 	HandleResponse []caddyhttp.ResponseHandler `json:"handle_response,omitempty"` |  |  | 	HandleResponse []caddyhttp.ResponseHandler `json:"handle_response,omitempty"` | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 	Transport http.RoundTripper `json:"-"` |  |  | 	Transport http.RoundTripper `json:"-"` | 
			
		
	
	
		
		
			
				
					|  | @ -631,9 +632,17 @@ func (h *Handler) reverseProxy(rw http.ResponseWriter, req *http.Request, repl * | 
			
		
	
		
		
			
				
					|  |  | 		if len(rh.Routes) == 0 { |  |  | 		if len(rh.Routes) == 0 { | 
			
		
	
		
		
			
				
					|  |  | 			continue |  |  | 			continue | 
			
		
	
		
		
			
				
					|  |  | 		} |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 		res.Body.Close() |  |  | 		res.Body.Close() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		// set up the replacer so that parts of the original response can be
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		// used for routing decisions
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		for field, value := range res.Header { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			repl.Set("http.reverse_proxy.header."+field, strings.Join(value, ",")) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  | 		repl.Set("http.reverse_proxy.status_code", res.StatusCode) |  |  | 		repl.Set("http.reverse_proxy.status_code", res.StatusCode) | 
			
		
	
		
		
			
				
					|  |  | 		repl.Set("http.reverse_proxy.status_text", res.Status) |  |  | 		repl.Set("http.reverse_proxy.status_text", res.Status) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 		h.logger.Debug("handling response", zap.Int("handler", i)) |  |  | 		h.logger.Debug("handling response", zap.Int("handler", i)) | 
			
		
	
		
		
			
				
					|  |  | 		if routeErr := rh.Routes.Compile(next).ServeHTTP(rw, req); routeErr != nil { |  |  | 		if routeErr := rh.Routes.Compile(next).ServeHTTP(rw, req); routeErr != nil { | 
			
		
	
		
		
			
				
					|  |  | 			// wrap error in roundtripSucceeded so caller knows that
 |  |  | 			// wrap error in roundtripSucceeded so caller knows that
 | 
			
		
	
	
		
		
			
				
					|  | 
 |