Moar parsers
This commit is contained in:
@@ -3,22 +3,25 @@ package parser
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"net"
|
||||
"net/netip"
|
||||
"strings"
|
||||
|
||||
"git.maze.io/maze/styx/internal/sliceutil"
|
||||
)
|
||||
|
||||
func init() {
|
||||
RegisterDomainsParser(hostsParser{})
|
||||
RegisterDomainsParser(hostsDomainsParser{})
|
||||
RegisterNetworksParser(hostsNetworksParser{})
|
||||
}
|
||||
|
||||
type hostsParser struct{}
|
||||
type hostsDomainsParser struct{}
|
||||
|
||||
func (hostsParser) CanHandle(line string) bool {
|
||||
func (hostsDomainsParser) CanHandle(line string) bool {
|
||||
part := strings.Fields(line)
|
||||
return len(part) >= 2 && net.ParseIP(part[0]) != nil
|
||||
return len(part) >= 2 && isIP(part[0])
|
||||
}
|
||||
|
||||
func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
|
||||
func (hostsDomainsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
|
||||
scanner := bufio.NewScanner(r)
|
||||
for scanner.Scan() {
|
||||
line := strings.TrimSpace(scanner.Text())
|
||||
@@ -27,7 +30,7 @@ func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err
|
||||
}
|
||||
|
||||
part := strings.Fields(line)
|
||||
if len(part) >= 2 && net.ParseIP(part[0]) != nil {
|
||||
if len(part) >= 2 && isIP(part[0]) {
|
||||
domains = append(domains, part[1:]...)
|
||||
continue
|
||||
}
|
||||
@@ -37,5 +40,36 @@ func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err
|
||||
if err = scanner.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
return unique(domains), ignored, nil
|
||||
return sliceutil.Unique(domains), ignored, nil
|
||||
}
|
||||
|
||||
type hostsNetworksParser struct{}
|
||||
|
||||
func (hostsNetworksParser) CanHandle(line string) bool {
|
||||
part := strings.Fields(line)
|
||||
return len(part) >= 2 && isIP(part[0])
|
||||
}
|
||||
|
||||
func (hostsNetworksParser) ParseNetworks(r io.Reader) (prefixes []netip.Prefix, 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 && isIP(part[0]) {
|
||||
if addr, err := netip.ParseAddr(part[0]); err == nil && !addr.IsUnspecified() && addr.IsValid() {
|
||||
prefixes = append(prefixes, addrToPrefix(addr))
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
ignored++
|
||||
}
|
||||
if err = scanner.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
return sliceutil.Unique(prefixes), ignored, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user