diff --git a/subscribe/subscribe.go b/subscribe/subscribe.go index fa12446..eee394f 100644 --- a/subscribe/subscribe.go +++ b/subscribe/subscribe.go @@ -127,8 +127,13 @@ func (s *Subscribe) handler(msg *nats.Msg) { func (s *Subscribe) matchServer(servers map[string]*caddyhttp.Server, req *http.Request) (*caddyhttp.Server, error) { repl := caddy.NewReplacer() for _, server := range servers { + if !hasListenerAddress(server, req.URL) { + // listener address (host/port) does not match for server, so we can continue with next server. + continue + } r := caddyhttp.PrepareRequest(req, repl, nil, server) for _, route := range server.Routes { + if route.MatcherSets.AnyMatch(r) { return server, nil } @@ -138,6 +143,33 @@ func (s *Subscribe) matchServer(servers map[string]*caddyhttp.Server, req *http. return nil, fmt.Errorf("no server matched for the current url: %s", req.URL) } +// hasListenerAddress is modelled after the same function in caddyhttp/server, but a bit simplified. +func hasListenerAddress(s *caddyhttp.Server, fullAddr *url.URL) bool { + laddrs, err := caddy.ParseNetworkAddress(fullAddr.Host) + if err != nil { + return false + } + if laddrs.PortRangeSize() != 1 { + return false // TODO: support port ranges + } + + for _, lnAddr := range s.Listen { + thisAddrs, err := caddy.ParseNetworkAddress(lnAddr) + if err != nil { + continue + } + if thisAddrs.Network != laddrs.Network { + continue + } + + if (laddrs.StartPort <= thisAddrs.EndPort) && + (laddrs.StartPort >= thisAddrs.StartPort) { + return true + } + } + return false +} + func (s *Subscribe) prepareRequest(method string, rawURL string, body io.Reader, header nats.Header) (*http.Request, error) { u, err := url.Parse(rawURL) if err != nil {