httpcaddyfile: Include non-standard ports when mapping logger names

If a site block has a key like "http://localhost:2016", then the log for
that site must be mapped to "localhost:2016" and not just "localhost"
because "localhost:2016" will be the value of the Host header of requests.
But a key like "localhost:80" does not include the port since the Host
header will not include ":80" because it is a standard port.

Fixes https://caddy.community/t/v2-common-log-format-not-working/7352?u=matt
This commit is contained in:
Matthew Holt 2020-03-30 18:39:21 -06:00
parent ac65f690ae
commit 904d9cab39
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 16 additions and 6 deletions

View file

@ -17,8 +17,10 @@ package httpcaddyfile
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net"
"reflect" "reflect"
"sort" "sort"
"strconv"
"strings" "strings"
"github.com/caddyserver/caddy/v2" "github.com/caddyserver/caddy/v2"
@ -324,8 +326,9 @@ func (ServerType) evaluateGlobalOptionsBlock(serverBlocks []serverBlock, options
// an empty string. Otherwise, if allowEmpty is false, and if sb has a key // an empty string. Otherwise, if allowEmpty is false, and if sb has a key
// that omits the hostname (i.e. is a catch-all/empty host), then the returned // that omits the hostname (i.e. is a catch-all/empty host), then the returned
// list is empty, because the server block effectively matches ALL hosts. // list is empty, because the server block effectively matches ALL hosts.
// The list may not be in a consistent order. // The list may not be in a consistent order. If includePorts is true, then
func (st *ServerType) hostsFromServerBlockKeys(sb caddyfile.ServerBlock, allowEmpty bool) ([]string, error) { // any non-empty, non-standard ports will be included.
func (st *ServerType) hostsFromServerBlockKeys(sb caddyfile.ServerBlock, allowEmpty, includePorts bool) ([]string, error) {
// first get each unique hostname // first get each unique hostname
hostMap := make(map[string]struct{}) hostMap := make(map[string]struct{})
for _, sblockKey := range sb.Keys { for _, sblockKey := range sb.Keys {
@ -339,8 +342,15 @@ func (st *ServerType) hostsFromServerBlockKeys(sb caddyfile.ServerBlock, allowEm
// is empty / catch-all, which means to match all hosts // is empty / catch-all, which means to match all hosts
return []string{}, nil return []string{}, nil
} }
if includePorts &&
addr.Port != "" &&
addr.Port != strconv.Itoa(caddyhttp.DefaultHTTPPort) &&
addr.Port != strconv.Itoa(caddyhttp.DefaultHTTPSPort) {
hostMap[net.JoinHostPort(addr.Host, addr.Port)] = struct{}{}
} else {
hostMap[addr.Host] = struct{}{} hostMap[addr.Host] = struct{}{}
} }
}
// convert map to slice // convert map to slice
sblockHosts := make([]string, 0, len(hostMap)) sblockHosts := make([]string, 0, len(hostMap))
@ -410,7 +420,7 @@ func (st *ServerType) serversFromPairings(
return nil, fmt.Errorf("server block %v: compiling matcher sets: %v", sblock.block.Keys, err) return nil, fmt.Errorf("server block %v: compiling matcher sets: %v", sblock.block.Keys, err)
} }
hosts, err := st.hostsFromServerBlockKeys(sblock.block, false) hosts, err := st.hostsFromServerBlockKeys(sblock.block, false, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -490,7 +500,7 @@ func (st *ServerType) serversFromPairings(
LoggerNames: make(map[string]string), LoggerNames: make(map[string]string),
} }
} }
hosts, err := st.hostsFromServerBlockKeys(sblock.block, true) hosts, err := st.hostsFromServerBlockKeys(sblock.block, true, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -82,7 +82,7 @@ func (st ServerType) buildTLSApp(
// get values that populate an automation policy for this block // get values that populate an automation policy for this block
var ap *caddytls.AutomationPolicy var ap *caddytls.AutomationPolicy
sblockHosts, err := st.hostsFromServerBlockKeys(sblock.block, false) sblockHosts, err := st.hostsFromServerBlockKeys(sblock.block, false, false)
if err != nil { if err != nil {
return nil, warnings, err return nil, warnings, err
} }