mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-30 23:53:48 +03:00
lexer: Fixed backslashes in quoted strings (closes #65)
This commit is contained in:
parent
b2ee6638e4
commit
2501691ea4
2 changed files with 37 additions and 3 deletions
|
@ -36,9 +36,11 @@ func (l *lexer) load(input io.Reader) error {
|
||||||
// the token starts with a quotes character (")
|
// the token starts with a quotes character (")
|
||||||
// in which case the token goes until the closing
|
// in which case the token goes until the closing
|
||||||
// quotes (the enclosing quotes are not included).
|
// quotes (the enclosing quotes are not included).
|
||||||
// The rest of the line is skipped if a "#"
|
// Inside quoted strings, quotes may be escaped
|
||||||
// character is read in. Returns true if a token
|
// with a preceding \ character. No other chars
|
||||||
// was loaded; false otherwise.
|
// may be escaped. The rest of the line is skipped
|
||||||
|
// if a "#" character is read in. Returns true if
|
||||||
|
// a token was loaded; false otherwise.
|
||||||
func (l *lexer) next() bool {
|
func (l *lexer) next() bool {
|
||||||
var val []rune
|
var val []rune
|
||||||
var comment, quoted, escaped bool
|
var comment, quoted, escaped bool
|
||||||
|
@ -74,6 +76,12 @@ func (l *lexer) next() bool {
|
||||||
if ch == '\n' {
|
if ch == '\n' {
|
||||||
l.line++
|
l.line++
|
||||||
}
|
}
|
||||||
|
if escaped {
|
||||||
|
// only escape quotes
|
||||||
|
if ch != '"' {
|
||||||
|
val = append(val, '\\')
|
||||||
|
}
|
||||||
|
}
|
||||||
val = append(val, ch)
|
val = append(val, ch)
|
||||||
escaped = false
|
escaped = false
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -80,6 +80,18 @@ func TestLexer(t *testing.T) {
|
||||||
{line: 1, text: "B"},
|
{line: 1, text: "B"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
input: `"don't\escape"`,
|
||||||
|
expected: []token{
|
||||||
|
{line: 1, text: `don't\escape`},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: `"don't\\escape"`,
|
||||||
|
expected: []token{
|
||||||
|
{line: 1, text: `don't\\escape`},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
input: `A "quoted value with line
|
input: `A "quoted value with line
|
||||||
break inside" {
|
break inside" {
|
||||||
|
@ -93,6 +105,20 @@ func TestLexer(t *testing.T) {
|
||||||
{line: 4, text: "}"},
|
{line: 4, text: "}"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
input: `"C:\php\php-cgi.exe"`,
|
||||||
|
expected: []token{
|
||||||
|
{line: 1, text: `C:\php\php-cgi.exe`},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: `empty "" string`,
|
||||||
|
expected: []token{
|
||||||
|
{line: 1, text: `empty`},
|
||||||
|
{line: 1, text: ``},
|
||||||
|
{line: 1, text: `string`},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
input: "skip those\r\nCR characters",
|
input: "skip those\r\nCR characters",
|
||||||
expected: []token{
|
expected: []token{
|
||||||
|
|
Loading…
Reference in a new issue