mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-22 14:11:50 +08:00
caddyhttp: Add RemoteAddr placeholders (#2801)
* Ignore build artifacts * Add RemoteAddr placeholders
This commit is contained in:
parent
b38365ff3b
commit
fe36d26b63
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -6,6 +6,10 @@ Caddyfile
|
|||
*.prof
|
||||
*.test
|
||||
|
||||
# build artifacts
|
||||
cmd/caddy/caddy
|
||||
cmd/caddy/caddy.exe
|
||||
|
||||
# mac specific
|
||||
.DS_Store
|
||||
|
||||
|
|
|
@ -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.hostport":
|
||||
return req.Host, true
|
||||
case "http.request.method":
|
||||
return req.Method, 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.scheme":
|
||||
if req.TLS != nil {
|
||||
return "https", true
|
||||
|
|
71
modules/caddyhttp/replacer_test.go
Normal file
71
modules/caddyhttp/replacer_test.go
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user