Compare commits

...

2 Commits

Author SHA1 Message Date
Francis Lavoie 5968ebd0f4 reverseproxy: Add support for specifying IDs in Caddyfile 2021-09-13 00:21:54 -04:00
Francis Lavoie a5f4fae145 reverseproxy: Add ID field for upstreams 2021-09-12 23:50:04 -04:00
4 changed files with 68 additions and 5 deletions
@@ -0,0 +1,46 @@
:8884
reverse_proxy one|http://localhost two|http://localhost {
to three|srv+http://localhost four|srv+http://localhost
}
----------
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [
":8884"
],
"routes": [
{
"handle": [
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "localhost:80",
"id": "one"
},
{
"dial": "localhost:80",
"id": "two"
},
{
"id": "three",
"lookup_srv": "localhost"
},
{
"id": "four",
"lookup_srv": "localhost"
}
]
}
]
}
]
}
}
}
}
}
+5 -3
View File
@@ -34,7 +34,8 @@ type adminUpstreams struct{}
// upstreamResults holds the status of a particular upstream
type upstreamStatus struct {
Address string `json:"address"`
ID string `json:"id"`
Address string `json:"address"` // Address is deprecated, should be removed in a future release.
Healthy bool `json:"healthy"`
NumRequests int `json:"num_requests"`
Fails int `json:"fails"`
@@ -78,7 +79,7 @@ func (adminUpstreams) handleUpstreams(w http.ResponseWriter, r *http.Request) er
// Iterate over the upstream pool (needs to be fast)
var rangeErr error
hosts.Range(func(key, val interface{}) bool {
address, ok := key.(string)
id, ok := key.(string)
if !ok {
rangeErr = caddy.APIError{
HTTPStatus: http.StatusInternalServerError,
@@ -97,7 +98,8 @@ func (adminUpstreams) handleUpstreams(w http.ResponseWriter, r *http.Request) er
}
results = append(results, upstreamStatus{
Address: address,
ID: id,
Address: id,
Healthy: !upstream.Unhealthy(),
NumRequests: upstream.NumRequests(),
Fails: upstream.Fails(),
+8 -2
View File
@@ -219,6 +219,12 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
// treated as a SRV-based upstream, and any port will be
// dropped.
appendUpstream := func(address string) error {
var id string
if strings.Contains(address, "|") {
parts := strings.SplitN(address, "|", 2)
id = parts[0]
address = parts[1]
}
isSRV := strings.HasPrefix(address, "srv+")
if isSRV {
address = strings.TrimPrefix(address, "srv+")
@@ -231,9 +237,9 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
if host, _, err := net.SplitHostPort(dialAddr); err == nil {
dialAddr = host
}
h.Upstreams = append(h.Upstreams, &Upstream{LookupSRV: dialAddr})
h.Upstreams = append(h.Upstreams, &Upstream{ID: id, LookupSRV: dialAddr})
} else {
h.Upstreams = append(h.Upstreams, &Upstream{Dial: dialAddr})
h.Upstreams = append(h.Upstreams, &Upstream{ID: id, Dial: dialAddr})
}
return nil
}
+9
View File
@@ -65,6 +65,12 @@ type UpstreamPool []*Upstream
type Upstream struct {
Host `json:"-"`
// The unique ID for this upstream, to disambiguate multiple
// upstreams with the same Dial address. This is optional,
// and only necessary if the upstream states need to be
// separate, such as having different health checking policies.
ID string `json:"id,omitempty"`
// The [network address](/docs/conventions#network-addresses)
// to dial to connect to the upstream. Must represent precisely
// one socket (i.e. no port ranges). A valid network address
@@ -98,6 +104,9 @@ type Upstream struct {
}
func (u Upstream) String() string {
if u.ID != "" {
return u.ID
}
if u.LookupSRV != "" {
return u.LookupSRV
}