From acf7dea68fe6ace110221faa26c2503a1ea432ce Mon Sep 17 00:00:00 2001
From: Matthew Holt <mholt@users.noreply.github.com>
Date: Mon, 14 Oct 2019 12:09:43 -0600
Subject: [PATCH] caddyhttp: host labels placeholders endianness from
 right->left

https://caddy.community/t/labeln-placeholder-endian-issue/5366

(I thought we had this before but it must have gotten lost somewhere)
---
 modules/caddyhttp/replacer.go      | 10 +++++++---
 modules/caddyhttp/replacer_test.go | 12 ++++++++++--
 2 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/modules/caddyhttp/replacer.go b/modules/caddyhttp/replacer.go
index 205e4ed5f..db329be52 100644
--- a/modules/caddyhttp/replacer.go
+++ b/modules/caddyhttp/replacer.go
@@ -146,14 +146,18 @@ func addHTTPVarsToReplacer(repl caddy.Replacer, req *http.Request, w http.Respon
 				if err != nil {
 					return "", false
 				}
-				hostLabels := strings.Split(req.Host, ".")
+				reqHost, _, err := net.SplitHostPort(req.Host)
+				if err != nil {
+					reqHost = req.Host // OK; assume there was no port
+				}
+				hostLabels := strings.Split(reqHost, ".")
 				if idx < 0 {
 					return "", false
 				}
-				if idx >= len(hostLabels) {
+				if idx > len(hostLabels) {
 					return "", true
 				}
-				return hostLabels[idx], true
+				return hostLabels[len(hostLabels)-idx-1], true
 			}
 
 			// path parts
diff --git a/modules/caddyhttp/replacer_test.go b/modules/caddyhttp/replacer_test.go
index d10c74f93..b355c7fc3 100644
--- a/modules/caddyhttp/replacer_test.go
+++ b/modules/caddyhttp/replacer_test.go
@@ -34,8 +34,8 @@ func TestHTTPVarReplacement(t *testing.T) {
 	addHTTPVarsToReplacer(repl, req, res)
 
 	for i, tc := range []struct {
-		input      string
-		expect     string
+		input  string
+		expect string
 	}{
 		{
 			input:  "{http.request.scheme}",
@@ -61,6 +61,14 @@ func TestHTTPVarReplacement(t *testing.T) {
 			input:  "{http.request.remote.port}",
 			expect: "1234",
 		},
+		{
+			input:  "{http.request.host.labels.0}",
+			expect: "com",
+		},
+		{
+			input:  "{http.request.host.labels.1}",
+			expect: "example",
+		},
 	} {
 		actual := repl.ReplaceAll(tc.input, "<empty>")
 		if actual != tc.expect {