From e8e55955f4937b126700994bd91698bf56f408c3 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Wed, 17 Aug 2016 17:17:26 -0600 Subject: [PATCH] Report error when loading the lexer --- caddyfile/dispenser.go | 3 ++- caddyfile/lexer.go | 5 ++++- caddyfile/parse.go | 15 +++++++++++---- caddyfile/parse_test.go | 5 ++++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/caddyfile/dispenser.go b/caddyfile/dispenser.go index 7beae9f3cb5..91af9b126ec 100644 --- a/caddyfile/dispenser.go +++ b/caddyfile/dispenser.go @@ -19,9 +19,10 @@ type Dispenser struct { // NewDispenser returns a Dispenser, ready to use for parsing the given input. func NewDispenser(filename string, input io.Reader) Dispenser { + tokens, _ := allTokens(input) // ignoring error because nothing to do with it return Dispenser{ filename: filename, - tokens: allTokens(input), + tokens: tokens, cursor: -1, } } diff --git a/caddyfile/lexer.go b/caddyfile/lexer.go index 0a738aef358..ea3bad99931 100644 --- a/caddyfile/lexer.go +++ b/caddyfile/lexer.go @@ -33,7 +33,10 @@ func (l *lexer) load(input io.Reader) error { // discard byte order mark, if present firstCh, _, err := l.reader.ReadRune() - if err == nil && firstCh != 0xFEFF { + if err != nil { + return err + } + if firstCh != 0xFEFF { err := l.reader.UnreadRune() if err != nil { return err diff --git a/caddyfile/parse.go b/caddyfile/parse.go index 92431fc8daf..b136b0c088c 100644 --- a/caddyfile/parse.go +++ b/caddyfile/parse.go @@ -22,13 +22,17 @@ func Parse(filename string, input io.Reader, validDirectives []string) ([]Server // allTokens lexes the entire input, but does not parse it. // It returns all the tokens from the input, unstructured // and in order. -func allTokens(input io.Reader) (tokens []Token) { +func allTokens(input io.Reader) ([]Token, error) { l := new(lexer) - l.load(input) + err := l.load(input) + if err != nil { + return nil, err + } + var tokens []Token for l.next() { tokens = append(tokens, l.token) } - return + return tokens, nil } type parser struct { @@ -294,7 +298,10 @@ func (p *parser) doSingleImport(importFile string) ([]Token, error) { return nil, p.Errf("Could not import %s: is a directory", importFile) } - importedTokens := allTokens(file) + importedTokens, err := allTokens(file) + if err != nil { + return nil, p.Errf("Could not read tokens while importing %s: %v", importFile, err) + } // Tack the filename onto these tokens so errors show the imported file's name filename := filepath.Base(importFile) diff --git a/caddyfile/parse_test.go b/caddyfile/parse_test.go index 8f296c619b9..1e0ca2d2adc 100644 --- a/caddyfile/parse_test.go +++ b/caddyfile/parse_test.go @@ -9,8 +9,11 @@ import ( func TestAllTokens(t *testing.T) { input := strings.NewReader("a b c\nd e") expected := []string{"a", "b", "c", "d", "e"} - tokens := allTokens(input) + tokens, err := allTokens(input) + if err != nil { + t.Fatalf("Expected no error, got %v", err) + } if len(tokens) != len(expected) { t.Fatalf("Expected %d tokens, got %d", len(expected), len(tokens)) }