42 lines
755 B
Go
42 lines
755 B
Go
package parser
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
func init() {
|
|
RegisterDomainsParser(hostsParser{})
|
|
}
|
|
|
|
type hostsParser struct{}
|
|
|
|
func (hostsParser) CanHandle(line string) bool {
|
|
part := strings.Fields(line)
|
|
return len(part) >= 2 && net.ParseIP(part[0]) != nil
|
|
}
|
|
|
|
func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
|
|
scanner := bufio.NewScanner(r)
|
|
for scanner.Scan() {
|
|
line := strings.TrimSpace(scanner.Text())
|
|
if isComment(line) {
|
|
continue
|
|
}
|
|
|
|
part := strings.Fields(line)
|
|
if len(part) >= 2 && net.ParseIP(part[0]) != nil {
|
|
domains = append(domains, part[1:]...)
|
|
continue
|
|
}
|
|
|
|
ignored++
|
|
}
|
|
if err = scanner.Err(); err != nil {
|
|
return
|
|
}
|
|
return unique(domains), ignored, nil
|
|
}
|