private static void ProcessControlDirective(DnsZoneParseContext context) { var token = context.Tokens.Dequeue(); var directive = token.StringValue; switch (directive.ToUpperInvariant()) { case "ORIGIN": context.Origin = context.ReadAndResolveDomainName(); break; case "INCLUDE": var firstToken = context.Tokens.Dequeue(); var secondToken = context.Tokens.Dequeue(); if (secondToken.Type == TokenType.NewLine) { ProcessIncludeDirective(context, context.Origin, firstToken.StringValue); } else { context.Tokens.Dequeue(); //end of line ProcessIncludeDirective(context, secondToken.StringValue, firstToken.StringValue); } break; case "TTL": context.DefaultTtl = context.ReadTimeSpan(); break; default: throw new NotSupportedException($"Unknown control directive '{directive}'"); } }
private static void Process(DnsZoneParseContext context) { while (!context.IsEof) { var token = context.Tokens.Peek(); switch (token.Type) { case TokenType.NewLine: context.Tokens.Dequeue(); break; case TokenType.Control: ProcessControlDirective(context); break; case TokenType.Whitespace: case TokenType.Literal: ParseResourceRecord(context); break; default: throw new NotSupportedException($"not supported type {token.Type}"); } } }
private static void ProcessIncludeDirective(DnsZoneParseContext context, string origin, string fileName) { var childContext = context.CreateChildContext(fileName); childContext.Origin = context.ResolveDomainName(origin); Process(childContext); context.Zone.Add(childContext.Zone); }
public static DnsZoneFile Parse(IDnsSource source) { var tokenizer = new Tokenizer(); var fileSource = new FileSource { Content = source.LoadContent(null) }; var tokens = tokenizer.Read(fileSource).ToArray(); var context = new DnsZoneParseContext(tokens, source); Process(context); return(context.Zone); }
private static void ParseResourceRecord(DnsZoneParseContext context) { string @class; TimeSpan?ttl; var nameToken = context.Tokens.Dequeue(); var name = nameToken.Type != TokenType.Whitespace ? nameToken.StringValue : ""; if (context.TryParseClass(out @class)) { context.TryParseTtl(out ttl); } else if (context.TryParseTtl(out ttl)) { context.TryParseClass(out @class); } var type = context.ReadResourceRecordType(); //An RRT.NULL return indicates we encountered some kind of //whitespace instead of the ReadResourceRecordType. if (type == ResourceRecordType.NULL) { return; } string domainName; try { domainName = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName); } catch (ArgumentException exc) { throw new TokenException(exc.Message, nameToken); } var record = DnsZoneUtils.CreateRecord(type); record.Name = domainName; record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass; record.Ttl = context.GetTimeSpan(ttl); record.AcceptVistor(_reader, context); context.Zone.Records.Add(record); context.PrevName = name; if (!string.IsNullOrWhiteSpace(@class)) { context.PrevClass = @class; } }
private static void ParseResourceRecord(DnsZoneParseContext context) { string @class; TimeSpan?ttl; var nameToken = context.Tokens.Dequeue(); var name = nameToken.Type != TokenType.Whitespace ? nameToken.StringValue : ""; if (context.TryParseClass(out @class)) { context.TryParseTtl(out ttl); } else if (context.TryParseTtl(out ttl)) { context.TryParseClass(out @class); } var type = context.ReadResourceRecordType(); var record = DnsZoneUtils.CreateRecord(type); record.Name = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName); record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass; record.Ttl = context.GetTimeSpan(ttl); record.AcceptVistor(_reader, context); context.Zone.Records.Add(record); context.PrevName = name; if (!string.IsNullOrWhiteSpace(@class)) { context.PrevClass = @class; } }
private static void ParseResourceRecord(DnsZoneParseContext context) { string @class = null; TimeSpan?ttl = null; if (context.Tokens.Count == 0) { return; } string name = null; var nameToken = context.Tokens.Dequeue(); if (nameToken.Type == TokenType.Literal) { name = nameToken.StringValue; } else if (nameToken.Type == TokenType.Whitespace) { var preview = context.Tokens.Peek(); if (preview.Type == TokenType.NewLine || preview.Type == TokenType.NewLine) { context.Tokens.Dequeue(); return; } name = ""; } else if (nameToken.Type == TokenType.Comments) { return; } else if (nameToken.Type == TokenType.NewLine) { return; } while (@class == null || ttl == null) { if (context.Tokens.Count == 0) { if (string.IsNullOrWhiteSpace(name)) { return; } else { throw new TokenException("missing record type", nameToken); } } var token = context.Tokens.Peek(); if (token.Type == TokenType.Literal) { if (@class == null) { if (context.TryParseClass(out @class)) { continue; } } if (@ttl == null) { if (context.TryParseTtl(out ttl)) { continue; } } break; } else if (token.Type == TokenType.Comments || token.Type == TokenType.NewLine) { throw new TokenException("missing record type", token); } else { throw new TokenException("unexpected token", token); } } var type = context.ReadResourceRecordType(); string domainName; try { domainName = context.ResolveDomainName(!string.IsNullOrWhiteSpace(name) ? name : context.PrevName); } catch (ArgumentException exc) { throw new TokenException(exc.Message, nameToken); } var record = DnsZoneUtils.CreateRecord(type); record.Name = domainName; record.Class = !string.IsNullOrWhiteSpace(@class) ? @class : context.PrevClass; record.Ttl = context.GetTimeSpan(ttl); record.AcceptVistor(_reader, context); context.Zone.Records.Add(record); if (!string.IsNullOrWhiteSpace(name)) { context.PrevName = name; } if (!string.IsNullOrWhiteSpace(@class)) { context.PrevClass = @class; } }