summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal <pascalgn@users.noreply.github.com>2019-10-10 21:37:08 +0200
committerMatt Holt <mholt@users.noreply.github.com>2019-10-10 13:37:08 -0600
commitfe36d26b63b6398592e46604d1795f84ce0477d4 (patch)
tree14dbb7a456b93e4e7c1b58ae30694edf7c15c79a
parentb38365ff3b6ab8b2c474603fa0603831e7eff2a7 (diff)
caddyhttp: Add RemoteAddr placeholders (#2801)
* Ignore build artifacts * Add RemoteAddr placeholders
-rw-r--r--.gitignore4
-rw-r--r--modules/caddyhttp/replacer.go17
-rw-r--r--modules/caddyhttp/replacer_test.go71
3 files changed, 89 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 6193446..1cc86e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,10 @@ Caddyfile
*.prof
*.test
+# build artifacts
+cmd/caddy/caddy
+cmd/caddy/caddy.exe
+
# mac specific
.DS_Store
diff --git a/modules/caddyhttp/replacer.go b/modules/caddyhttp/replacer.go
index e003259..d4baa3f 100644
--- a/modules/caddyhttp/replacer.go
+++ b/modules/caddyhttp/replacer.go
@@ -65,13 +65,24 @@ func addHTTPVarsToReplacer(repl caddy.Replacer, req *http.Request, w http.Respon
return req.Host, true // OK; there probably was no port
}
return host, true
+ case "http.request.port":
+ _, port, _ := net.SplitHostPort(req.Host)
+ return port, true
case "http.request.hostport":
return req.Host, true
+ case "http.request.remote":
+ return req.RemoteAddr, true
+ case "http.request.remote.host":
+ host, _, err := net.SplitHostPort(req.RemoteAddr)
+ if err != nil {
+ return req.RemoteAddr, true
+ }
+ return host, true
+ case "http.request.remote.port":
+ _, port, _ := net.SplitHostPort(req.RemoteAddr)
+ return port, true
case "http.request.method":
return req.Method, true
- case "http.request.port":
- _, port, _ := net.SplitHostPort(req.Host)
- return port, true
case "http.request.scheme":
if req.TLS != nil {
return "https", true
diff --git a/modules/caddyhttp/replacer_test.go b/modules/caddyhttp/replacer_test.go
new file mode 100644
index 0000000..d10c74f
--- /dev/null
+++ b/modules/caddyhttp/replacer_test.go
@@ -0,0 +1,71 @@
+// Copyright 2015 Matthew Holt and The Caddy Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package caddyhttp
+
+import (
+ "context"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/caddyserver/caddy/v2"
+)
+
+func TestHTTPVarReplacement(t *testing.T) {
+ req, _ := http.NewRequest("GET", "/", nil)
+ repl := caddy.NewReplacer()
+ ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl)
+ req = req.WithContext(ctx)
+ req.Host = "example.com:80"
+ req.RemoteAddr = "localhost:1234"
+ res := httptest.NewRecorder()
+ addHTTPVarsToReplacer(repl, req, res)
+
+ for i, tc := range []struct {
+ input string
+ expect string
+ }{
+ {
+ input: "{http.request.scheme}",
+ expect: "http",
+ },
+ {
+ input: "{http.request.host}",
+ expect: "example.com",
+ },
+ {
+ input: "{http.request.port}",
+ expect: "80",
+ },
+ {
+ input: "{http.request.hostport}",
+ expect: "example.com:80",
+ },
+ {
+ input: "{http.request.remote.host}",
+ expect: "localhost",
+ },
+ {
+ input: "{http.request.remote.port}",
+ expect: "1234",
+ },
+ } {
+ actual := repl.ReplaceAll(tc.input, "<empty>")
+ if actual != tc.expect {
+ t.Errorf("Test %d: Expected placeholder %s to be '%s' but got '%s'",
+ i, tc.input, tc.expect, actual)
+ }
+ }
+}