0
Fork 0
mirror of https://github.com/caddyserver/caddy.git synced 2024-12-23 22:27:38 -05:00

parser: fix broken absolute path imports

fix issue #1026

Signed-off-by: Tw <tw19881113@gmail.com>
This commit is contained in:
Tw 2016-09-17 22:39:08 +00:00
parent bedad34b25
commit 64fd281f5b
2 changed files with 100 additions and 1 deletions

View file

@ -260,7 +260,9 @@ func (p *parser) doImport() error {
} }
if token.Line == importLine { if token.Line == importLine {
var abs string var abs string
if !filepath.IsAbs(importFile) { if filepath.IsAbs(token.Text) {
abs = token.Text
} else if !filepath.IsAbs(importFile) {
abs = filepath.Join(filepath.Dir(absFile), token.Text) abs = filepath.Join(filepath.Dir(absFile), token.Text)
} else { } else {
abs = filepath.Join(importDir, token.Text) abs = filepath.Join(importDir, token.Text)

View file

@ -1,7 +1,9 @@
package caddyfile package caddyfile
import ( import (
"io/ioutil"
"os" "os"
"path/filepath"
"strings" "strings"
"testing" "testing"
) )
@ -249,6 +251,101 @@ func TestParseOneAndImport(t *testing.T) {
} }
} }
func TestRecursiveImport(t *testing.T) {
testParseOne := func(input string) (ServerBlock, error) {
p := testParser(input)
p.Next() // parseOne doesn't call Next() to start, so we must
err := p.parseOne()
return p.block, err
}
isExpected := func(got ServerBlock) bool {
if len(got.Keys) != 1 || got.Keys[0] != "localhost" {
t.Errorf("got keys unexpected: expect localhost, got %v", got.Keys)
return false
}
if len(got.Tokens) != 2 {
t.Errorf("got wrong number of tokens: expect 2, got %d", len(got.Tokens))
return false
}
if len(got.Tokens["dir1"]) != 1 || len(got.Tokens["dir2"]) != 2 {
t.Errorf("got unexpect tokens: %v", got.Tokens)
return false
}
return true
}
recursive_file1, err := filepath.Abs("testdata/recursive_import_test1")
if err != nil {
t.Fatal(err)
}
recursive_file2, err := filepath.Abs("testdata/recursive_import_test2")
if err != nil {
t.Fatal(err)
}
// test relative recursive import
err = ioutil.WriteFile(recursive_file1, []byte(
`localhost
dir1
import recursive_import_test2`), 0644)
if err != nil {
t.Fatal(err)
}
defer os.Remove(recursive_file1)
err = ioutil.WriteFile(recursive_file2, []byte("dir2 1"), 0644)
if err != nil {
t.Fatal(err)
}
defer os.Remove(recursive_file2)
// import absolute path
result, err := testParseOne("import " + recursive_file1)
if err != nil {
t.Fatal(err)
}
if !isExpected(result) {
t.Error("absolute+relative import failed")
}
// import relative path
result, err = testParseOne("import testdata/recursive_import_test1")
if err != nil {
t.Fatal(err)
}
if !isExpected(result) {
t.Error("relative+relative import failed")
}
// test absolute recursive import
err = ioutil.WriteFile(recursive_file1, []byte(
`localhost
dir1
import `+recursive_file2), 0644)
if err != nil {
t.Fatal(err)
}
// import absolute path
result, err = testParseOne("import " + recursive_file1)
if err != nil {
t.Fatal(err)
}
if !isExpected(result) {
t.Error("absolute+absolute import failed")
}
// import relative path
result, err = testParseOne("import testdata/recursive_import_test1")
if err != nil {
t.Fatal(err)
}
if !isExpected(result) {
t.Error("relative+absolute import failed")
}
}
func TestParseAll(t *testing.T) { func TestParseAll(t *testing.T) {
for i, test := range []struct { for i, test := range []struct {
input string input string