diff options
author | Pascal <pascalgn@users.noreply.github.com> | 2019-10-10 21:37:08 +0200 |
---|---|---|
committer | Matt Holt <mholt@users.noreply.github.com> | 2019-10-10 13:37:08 -0600 |
commit | fe36d26b63b6398592e46604d1795f84ce0477d4 (patch) | |
tree | 14dbb7a456b93e4e7c1b58ae30694edf7c15c79a | |
parent | b38365ff3b6ab8b2c474603fa0603831e7eff2a7 (diff) |
caddyhttp: Add RemoteAddr placeholders (#2801)
* Ignore build artifacts
* Add RemoteAddr placeholders
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | modules/caddyhttp/replacer.go | 17 | ||||
-rw-r--r-- | modules/caddyhttp/replacer_test.go | 71 |
3 files changed, 89 insertions, 3 deletions
@@ -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) + } + } +} |