More parsing fixes

This commit is contained in:
Miek Gieben 2011-12-15 22:40:07 +01:00
parent f4329cce16
commit 35a1e137e2
4 changed files with 40 additions and 27 deletions

2
dns.go
View File

@ -17,7 +17,7 @@
//
// Or directly from a string:
//
// mx := NewRRString("miek.nl IN MX 10 mx.miek.nl.")
// mx := NewRR("miek.nl. IN MX 10 mx.miek.nl.")
//
// The package dns supports (async) querying/replying, incoming/outgoing Axfr/Ixfr,
// TSIG, EDNS0, dynamic updates, notifies and DNSSEC validation/signing.

View File

@ -98,26 +98,32 @@ func TestDotInName(t *testing.T) {
// Make this a decend test case. For now, good enough
func TestParse(t *testing.T) {
tests := map[string]string{
// "miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. 3600 IN MX 10 elektron.atoom.net.\n": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
// "miek.nl. IN 3600 A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
// "miek.nl. A 127.0.0.1": "miek.nl.\t0\tCLASS0\tA\t127.0.0.1",
// "miek.nl. IN AAAA ::1": "miek.nl.\t0\tIN\tAAAA\t::1",
// "miek.nl. IN A 127.0.0.1": "miek.nl.\t0\tIN\tA\t127.0.0.1",
// "miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ": "miek.nl.\t0\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ",
"miek.nl. 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. 3600 IN MX 10 elektron.atoom.net.": "miek.nl.\t3600\tIN\tMX\t10 elektron.atoom.net.",
"miek.nl. IN 3600 A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. IN AAAA ::1": "miek.nl.\t3600\tIN\tAAAA\t::1",
"miek.nl. IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
"miek.nl. IN DNSKEY 256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ":
"miek.nl.\t3600\tIN\tDNSKEY\t256 3 5 AwEAAb+8lGNCxJgLS8rYVer6EnHVuIkQDghdjdtewDzU3G5R7PbMbKVRvH2Ma7pQyYceoaqWZQirSj72euPWfPxQnMy9ucCylA+FuH9cSjIcPf4PqJfdupHk9X6EBYjxrCLY4p1/yBwgyBIRJtZtAqM3ceAH2WovEJD6rTtOuHo5AluJ",
// "nlnetlabs.nl. 3175 IN DNSKEY 256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh": "nlnetlabs.nl.\t3175\tIN\tDNSKEY\t256 3 8 AwEAAdR7XR95OaAN9Rz7TbtPalQ9guQk7zfxTHYNKhsiwTZA9z+F16nD0VeBlk7dNik3ETpT2GLAwr9sntG898JwurCDe353wHPvjZtMCdiTVp3cRCrjuCEvoFpmZNN82H0gaH/4v8mkv/QBDAkDSncYjz/FqHKAeYy3cMcjY6RyVweh",
// "dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400": "dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400",
// "dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=": "dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=",
"dnsex.nl. 86400 IN SOA elektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400":
"dnsex.nl.\t86400\tIN\tSOA\telektron.atoom.net. miekg.atoom.net. 1299256910 14400 3600 604800 86400",
"dnsex.nl. 86400 IN RRSIG SOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQ vmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchc m+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW 5Cg=":
"dnsex.nl.\t86400\tIN\tRRSIG\tSOA 8 2 86400 20110403154150 20110304154150 23334 dnsex.nl. QN6hwJQLEBqRVKmO2LgkuRSx9bkKIZxXlTVtHg5SaiN+8RCTckGtUXkQvmZiBt3RdIWAjaabQYpEZHgvyjfy4Wwu/9RPDYnLt/qoyr4QKAdujchcm+fMDSbbcC7AN08i5D/dUWfNOHXjRJLY7t7AYB9DBt32LazIb0EU9QiW5Cg=",
}
for i, o := range tests {
rr, _ := NewRR(i)
if rr != nil && rr.String() != o {
t.Logf("\"%s\" should be equal to\n\"%s\"\n", i, o)
t.Fail()
} else {
if rr == nil {
t.Log("Failed to parse RR")
t.Fail()
}
if rr.String() != o {
t.Logf("`%s' should be equal to\n`%s', but is `%s'\n", i, o, rr.String())
t.Fail()
} else {
t.Logf("RR is %s", rr.String())
}
}
}

View File

@ -15,7 +15,7 @@ import (
// * Handle comments: ;
// * Handle braces.
const (
// Zonefile
// Zonefile
_EOF = iota // Don't let it start with zero
_STRING
_BLANK
@ -24,9 +24,9 @@ const (
_OWNER
_CLASS
// Privatekey file
_VALUE
_KEY
// Privatekey file
_VALUE
_KEY
_EXPECT_OWNER // Ownername
_EXPECT_OWNER_BL // Whitespace after the ownername
@ -41,7 +41,7 @@ const (
)
// Only used when debugging the parser itself.
var DEBUG = true
var DEBUG = false
type ParseError struct {
err string
@ -55,18 +55,24 @@ func (e *ParseError) Error() string {
}
type Lex struct {
token string // text of the token
value int // value: _STRING, _BLANK, etc.
line int // line in the file
column int // column in the fil
token string // text of the token
value int // value: _STRING, _BLANK, etc.
line int // line in the file
column int // column in the fil
}
// NewRR parses the string s and returns the RR contained in there. If the string
// contains more than one RR, only the first is returned. If an error is detected
// an error is returned. [TODO]
// an error is returned.
// If the class is not specified, the IN class is assumed. If the TTL is not
// specified DefaultTtl is assumed.
func NewRR(s string) (RR, error) {
cr := make(chan RR)
go ParseZone(strings.NewReader(s), cr)
if s[len(s)-1] != '\n' { // We need a closing newline
go ParseZone(strings.NewReader(s+"\n"), cr)
} else {
go ParseZone(strings.NewReader(s), cr)
}
r := <-cr // There are no error send as of yet
return r, nil // Todo: errors
}
@ -99,6 +105,9 @@ func ParseZone(r io.Reader, cr chan RR) {
}
switch st {
case _EXPECT_OWNER:
// Set the defaults here
h.Ttl = DefaultTtl
h.Class = ClassINET
switch l.value {
case _NEWLINE: // Empty line
st = _EXPECT_OWNER
@ -118,7 +127,6 @@ func ParseZone(r io.Reader, cr chan RR) {
switch l.value {
case _RRTYPE:
h.Rrtype, _ = Str_rr[strings.ToUpper(l.token)]
h.Ttl = DefaultTtl
st = _EXPECT_RDATA
case _CLASS:
h.Class, ok = Str_class[strings.ToUpper(l.token)]

View File

@ -112,7 +112,6 @@ func setA(h RR_Header, c chan Lex) (RR, error) {
l := <-c
rr.A = net.ParseIP(l.token)
println(l.token)
if rr.A == nil {
return nil, &ParseError{"bad A", l}
}