|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // Copyright 2016 Google Inc. All rights reserved.
- //
- // 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 martianurl
-
- // MatchHost matches two URL hosts with support for wildcards.
- func MatchHost(host, match string) bool {
- // Short circuit if host is empty.
- if host == "" {
- return false
- }
-
- // Exact match, no need to loop.
- if host == match {
- return true
- }
-
- // Walk backward over the host.
- hi := len(host) - 1
- for mi := len(match) - 1; mi >= 0; mi-- {
- // Found wildcard, skip to next period.
- if match[mi] == '*' {
- for hi > 0 && host[hi] != '.' {
- hi--
- }
-
- // Wildcard was the leftmost part and we have walked the entire host,
- // success.
- if mi == 0 && hi == 0 {
- return true
- }
-
- continue
- }
-
- if host[hi] != match[mi] {
- return false
- }
-
- // We have walked the entire host, if we have not walked the entire matcher
- // (mi != 0) that means the matcher has remaining characters to match and
- // thus the host cannot match.
- if hi == 0 {
- return mi == 0
- }
-
- hi--
- }
-
- // We have walked the entire length of the matcher, but haven't finished
- // walking the host thus they cannot match.
- return false
- }
|