Skip to content

Commit

Permalink
Optimize Decompose
Browse files Browse the repository at this point in the history
  • Loading branch information
Emil Guliyev committed Aug 14, 2018
1 parent ceaaabb commit 22d5185
Showing 1 changed file with 46 additions and 33 deletions.
79 changes: 46 additions & 33 deletions publicsuffix/publicsuffix.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"io"
"net/http/cookiejar"
"os"
"regexp"
"strings"

"golang.org/x/net/idna"
Expand Down Expand Up @@ -208,12 +207,12 @@ func (l *List) Find(name string, options *FindOptions) *Rule {
}
i := strings.IndexRune(name, '.')
if i < 0 {
break
return options.DefaultRule
}
name = name[i+1:]
}

return options.DefaultRule
return nil
}

// NewRule parses the rule content, creates and returns a Rule.
Expand Down Expand Up @@ -291,36 +290,51 @@ func (r *Rule) Match(name string) bool {

// Decompose takes a name as input and decomposes it into a tuple of <TRD+SLD, TLD>,
// according to the rule definition and type.
func (r *Rule) Decompose(name string) [2]string {
var parts []string

func (r *Rule) Decompose(name string) (result [2]string) {
result = [2]string{"", ""}
switch r.Type {
case NormalType:
name = strings.TrimSuffix(name, r.Value)
if len(name) == 0 {
return
}
result[0] = name[:len(name)-1]
result[1] = r.Value
case WildcardType:
parts = append([]string{`.*?`}, r.parts()...)
default:
parts = r.parts()
}

suffix := strings.Join(parts, `\.`)
re := regexp.MustCompile(fmt.Sprintf(`^(.+)\.(%s)$`, suffix))

matches := re.FindStringSubmatch(name)
if len(matches) < 3 {
return [2]string{"", ""}
}

return [2]string{matches[1], matches[2]}
}

func (r *Rule) parts() []string {
labels := Labels(r.Value)
if r.Type == ExceptionType {
return labels[1:]
}
if r.Type == WildcardType && r.Value == "" {
return []string{}
if r == DefaultRule {
i := strings.LastIndexByte(name, byte('.'))
if i < 0 {
return
}
result[0] = name[:i]
result[1] = name[i+1:]
return
}
name := strings.TrimSuffix(name, r.Value)
if len(name) == 0 {
return
}
name = name[:len(name)-1]
i := strings.LastIndexByte(name, byte('.'))
if i < 0 {
return
}
result[0] = name[:i]
result[1] = name[i+1:] + "." + r.Value
case ExceptionType:
i := strings.IndexRune(r.Value, '.')
if i < 0 {
return
}
suffix := r.Value[i+1:]
name = strings.TrimSuffix(name, suffix)
if len(name) == 0 {
return
}
result[0] = name[:len(name)-1]
result[1] = suffix
}
return labels
return
}

// Labels decomposes given domain name into labels,
Expand Down Expand Up @@ -414,7 +428,6 @@ func DomainFromListWithOptions(l *List, name string, options *FindOptions) (stri
if err != nil {
return "", err
}

return dn.SLD + "." + dn.TLD, nil
}

Expand Down Expand Up @@ -453,10 +466,10 @@ func normalize(name string) (string, error) {
ret := strings.ToLower(name)

if ret == "" {
return "", fmt.Errorf("Name is blank")
return "", fmt.Errorf("name is blank")
}
if ret[0] == '.' {
return "", fmt.Errorf("Name %s starts with a dot", ret)
return "", fmt.Errorf("name %s starts with a dot", ret)
}

return ret, nil
Expand Down

0 comments on commit 22d5185

Please sign in to comment.