mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
httpserver: Add {labelN} placeholders for parts of hostnames
For example, {label1} would match "sub" in "sub.example.com" or whatever value is in the wildcard spot of "*.example.com". Useful for rewrite!
This commit is contained in:
parent
6f78cc49d1
commit
aaec7e469c
2 changed files with 18 additions and 3 deletions
|
@ -375,6 +375,20 @@ func (r *replacer) getSubstitution(key string) string {
|
||||||
}
|
}
|
||||||
elapsedDuration := time.Since(r.responseRecorder.start)
|
elapsedDuration := time.Since(r.responseRecorder.start)
|
||||||
return strconv.FormatInt(convertToMilliseconds(elapsedDuration), 10)
|
return strconv.FormatInt(convertToMilliseconds(elapsedDuration), 10)
|
||||||
|
default:
|
||||||
|
// {labelN}
|
||||||
|
if strings.HasPrefix(key, "{label") {
|
||||||
|
nStr := key[6 : len(key)-1] // get the integer N in "{labelN}"
|
||||||
|
n, err := strconv.Atoi(nStr)
|
||||||
|
if err != nil || n < 1 {
|
||||||
|
return r.emptyValue
|
||||||
|
}
|
||||||
|
labels := strings.Split(r.request.Host, ".")
|
||||||
|
if n > len(labels) {
|
||||||
|
return r.emptyValue
|
||||||
|
}
|
||||||
|
return labels[n-1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r.emptyValue
|
return r.emptyValue
|
||||||
|
|
|
@ -53,7 +53,7 @@ func TestReplace(t *testing.T) {
|
||||||
recordRequest := NewResponseRecorder(w)
|
recordRequest := NewResponseRecorder(w)
|
||||||
reader := strings.NewReader(`{"username": "dennis"}`)
|
reader := strings.NewReader(`{"username": "dennis"}`)
|
||||||
|
|
||||||
request, err := http.NewRequest("POST", "http://localhost/?foo=bar", reader)
|
request, err := http.NewRequest("POST", "http://localhost.local/?foo=bar", reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to make request: %v", err)
|
t.Fatalf("Failed to make request: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ func TestReplace(t *testing.T) {
|
||||||
expect string
|
expect string
|
||||||
}{
|
}{
|
||||||
{"This hostname is {hostname}", "This hostname is " + hostname},
|
{"This hostname is {hostname}", "This hostname is " + hostname},
|
||||||
{"This host is {host}.", "This host is localhost."},
|
{"This host is {host}.", "This host is localhost.local."},
|
||||||
{"This request method is {method}.", "This request method is POST."},
|
{"This request method is {method}.", "This request method is POST."},
|
||||||
{"The response status is {status}.", "The response status is 200."},
|
{"The response status is {status}.", "The response status is 200."},
|
||||||
{"{when}", "02/Jan/2006:15:04:05 +0000"},
|
{"{when}", "02/Jan/2006:15:04:05 +0000"},
|
||||||
|
@ -97,7 +97,7 @@ func TestReplace(t *testing.T) {
|
||||||
{"The CustomAdd header is {>CustomAdd}.", "The CustomAdd header is caddy."},
|
{"The CustomAdd header is {>CustomAdd}.", "The CustomAdd header is caddy."},
|
||||||
{"The Custom response header is {<Custom}.", "The Custom response header is CustomResponseHeader."},
|
{"The Custom response header is {<Custom}.", "The Custom response header is CustomResponseHeader."},
|
||||||
{"Bad {>Custom placeholder", "Bad {>Custom placeholder"},
|
{"Bad {>Custom placeholder", "Bad {>Custom placeholder"},
|
||||||
{"The request is {request}.", "The request is POST /?foo=bar HTTP/1.1\\r\\nHost: localhost\\r\\n" +
|
{"The request is {request}.", "The request is POST /?foo=bar HTTP/1.1\\r\\nHost: localhost.local\\r\\n" +
|
||||||
"Cookie: foo=bar; taste=delicious\\r\\nCustom: foobarbaz\\r\\nCustomadd: caddy\\r\\n" +
|
"Cookie: foo=bar; taste=delicious\\r\\nCustom: foobarbaz\\r\\nCustomadd: caddy\\r\\n" +
|
||||||
"Shorterval: 1\\r\\n\\r\\n."},
|
"Shorterval: 1\\r\\n\\r\\n."},
|
||||||
{"The cUsToM header is {>cUsToM}...", "The cUsToM header is foobarbaz..."},
|
{"The cUsToM header is {>cUsToM}...", "The cUsToM header is foobarbaz..."},
|
||||||
|
@ -112,6 +112,7 @@ func TestReplace(t *testing.T) {
|
||||||
{"Query string is {query}", "Query string is foo=bar"},
|
{"Query string is {query}", "Query string is foo=bar"},
|
||||||
{"Query string value for foo is {?foo}", "Query string value for foo is bar"},
|
{"Query string value for foo is {?foo}", "Query string value for foo is bar"},
|
||||||
{"Missing query string argument is {?missing}", "Missing query string argument is "},
|
{"Missing query string argument is {?missing}", "Missing query string argument is "},
|
||||||
|
{"Label1 is {label1} and label2 is {label2} but label 3 is {label3}. {label4}", "Label1 is localhost and label2 is local but label 3 is -. -"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range testCases {
|
for _, c := range testCases {
|
||||||
|
|
Loading…
Reference in a new issue