From fe36d26b63b6398592e46604d1795f84ce0477d4 Mon Sep 17 00:00:00 2001 From: Pascal Date: Thu, 10 Oct 2019 21:37:08 +0200 Subject: caddyhttp: Add RemoteAddr placeholders (#2801) * Ignore build artifacts * Add RemoteAddr placeholders --- .gitignore | 4 +++ modules/caddyhttp/replacer.go | 17 +++++++-- modules/caddyhttp/replacer_test.go | 71 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 modules/caddyhttp/replacer_test.go 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, "") + if actual != tc.expect { + t.Errorf("Test %d: Expected placeholder %s to be '%s' but got '%s'", + i, tc.input, tc.expect, actual) + } + } +} -- cgit v1.2.3