From db4c73dd58b496f2c0c49a38f6c8b5f525456e3e Mon Sep 17 00:00:00 2001
From: Matthew Holt <mholt@users.noreply.github.com>
Date: Sat, 14 Sep 2019 18:10:29 -0600
Subject: [PATCH] reverse_proxy: Close idle connections on module unload

---
 modules/caddyhttp/reverseproxy/httptransport.go | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/modules/caddyhttp/reverseproxy/httptransport.go b/modules/caddyhttp/reverseproxy/httptransport.go
index c135ac833..00b58a4e1 100644
--- a/modules/caddyhttp/reverseproxy/httptransport.go
+++ b/modules/caddyhttp/reverseproxy/httptransport.go
@@ -123,6 +123,14 @@ func (h HTTPTransport) RoundTrip(req *http.Request) (*http.Response, error) {
 	return h.RoundTripper.RoundTrip(req)
 }
 
+// Cleanup implements caddy.CleanerUpper and closes any idle connections.
+func (h HTTPTransport) Cleanup() error {
+	if ht, ok := h.RoundTripper.(*http.Transport); ok {
+		ht.CloseIdleConnections()
+	}
+	return nil
+}
+
 // TLSConfig holds configuration related to the
 // TLS configuration for the transport/client.
 type TLSConfig struct {
@@ -203,6 +211,7 @@ type KeepAlive struct {
 
 // Interface guards
 var (
-	_ caddy.Provisioner = (*HTTPTransport)(nil)
-	_ http.RoundTripper = (*HTTPTransport)(nil)
+	_ caddy.Provisioner  = (*HTTPTransport)(nil)
+	_ http.RoundTripper  = (*HTTPTransport)(nil)
+	_ caddy.CleanerUpper = (*HTTPTransport)(nil)
 )