Skip to content
This repository was archived by the owner on Sep 1, 2025. It is now read-only.

Commit 027124b

Browse files
author
George Vine
committed
BUG/MEDIUM: add argument support for option originalto
1 parent 8b64fe0 commit 027124b

13 files changed

Lines changed: 399 additions & 9 deletions

parsers/option-originalto.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
Copyright 2022 HAProxy Technologies
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package parsers
18+
19+
import (
20+
"strings"
21+
22+
"github.com/haproxytech/config-parser/v4/common"
23+
"github.com/haproxytech/config-parser/v4/errors"
24+
"github.com/haproxytech/config-parser/v4/types"
25+
)
26+
27+
type OptionOriginalTo struct {
28+
data *types.OptionOriginalTo
29+
preComments []string // comments that appear before the actual line
30+
}
31+
32+
/*
33+
option originalto [ except <network> ] [ header <name> ]
34+
*/
35+
func (s *OptionOriginalTo) Parse(line string, parts []string, comment string) (string, error) {
36+
if len(parts) > 1 && parts[0] == "option" && parts[1] == "originalto" {
37+
data := &types.OptionOriginalTo{
38+
Comment: comment,
39+
}
40+
index := 2
41+
for index < len(parts) {
42+
switch parts[index] {
43+
case "except":
44+
index++
45+
if index == len(parts) {
46+
return "", errors.ErrInvalidData
47+
}
48+
data.Except = parts[index]
49+
case "header":
50+
index++
51+
if index == len(parts) {
52+
return "", errors.ErrInvalidData
53+
}
54+
data.Header = parts[index]
55+
default:
56+
return "", errors.ErrInvalidData
57+
}
58+
index++
59+
}
60+
s.data = data
61+
return "", nil
62+
}
63+
return "", &errors.ParseError{Parser: "option originalto", Line: line}
64+
}
65+
66+
func (s *OptionOriginalTo) Result() ([]common.ReturnResultLine, error) {
67+
if s.data == nil {
68+
return nil, errors.ErrFetch
69+
}
70+
var sb strings.Builder
71+
sb.WriteString("option originalto")
72+
// option originalto [ except <network> ] [ header <name> ]
73+
if s.data.Except != "" {
74+
sb.WriteString(" except ")
75+
sb.WriteString(s.data.Except)
76+
}
77+
if s.data.Header != "" {
78+
sb.WriteString(" header ")
79+
sb.WriteString(s.data.Header)
80+
}
81+
return []common.ReturnResultLine{
82+
{
83+
Data: sb.String(),
84+
Comment: s.data.Comment,
85+
},
86+
}, nil
87+
}

parsers/option-originalto_generated.go

Lines changed: 99 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

section-parsers.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func (p *configParser) getDefaultParser() *Parsers {
135135
addParser(parser, &sequence, &simple.Option{Name: "httpslog"})
136136
addParser(parser, &sequence, &simple.Option{Name: "independent-streams"})
137137
addParser(parser, &sequence, &simple.Option{Name: "nolinger"})
138-
addParser(parser, &sequence, &simple.Option{Name: "originalto"})
138+
addParser(parser, &sequence, &parsers.OptionOriginalTo{})
139139
addParser(parser, &sequence, &simple.Option{Name: "persist"})
140140
addParser(parser, &sequence, &simple.Option{Name: "prefer-last-server"})
141141
addParser(parser, &sequence, &simple.Option{Name: "socket-stats"})
@@ -414,7 +414,7 @@ func (p *configParser) getFrontendParser() *Parsers {
414414
addParser(parser, &sequence, &simple.Option{Name: "httpslog"})
415415
addParser(parser, &sequence, &simple.Option{Name: "independent-streams"})
416416
addParser(parser, &sequence, &simple.Option{Name: "nolinger"})
417-
addParser(parser, &sequence, &simple.Option{Name: "originalto"})
417+
addParser(parser, &sequence, &parsers.OptionOriginalTo{})
418418
addParser(parser, &sequence, &simple.Option{Name: "socket-stats"})
419419
addParser(parser, &sequence, &simple.Option{Name: "tcp-smart-accept"})
420420
addParser(parser, &sequence, &simple.Option{Name: "idle-close-on-response"})
@@ -503,7 +503,7 @@ func (p *configParser) getBackendParser() *Parsers {
503503
addParser(parser, &sequence, &simple.Option{Name: "checkcache"})
504504
addParser(parser, &sequence, &simple.Option{Name: "independent-streams"})
505505
addParser(parser, &sequence, &simple.Option{Name: "nolinger"})
506-
addParser(parser, &sequence, &simple.Option{Name: "originalto"})
506+
addParser(parser, &sequence, &parsers.OptionOriginalTo{})
507507
addParser(parser, &sequence, &simple.Option{Name: "persist"})
508508
addParser(parser, &sequence, &simple.Option{Name: "prefer-last-server"})
509509
addParser(parser, &sequence, &simple.Option{Name: "spop-check"})
@@ -643,7 +643,7 @@ func (p *configParser) getListenParser() *Parsers {
643643
addParser(parser, &sequence, &simple.Option{Name: "httpslog"})
644644
addParser(parser, &sequence, &simple.Option{Name: "independent-streams"})
645645
addParser(parser, &sequence, &simple.Option{Name: "nolinger"})
646-
addParser(parser, &sequence, &simple.Option{Name: "originalto"})
646+
addParser(parser, &sequence, &parsers.OptionOriginalTo{})
647647
addParser(parser, &sequence, &simple.Option{Name: "persist"})
648648
addParser(parser, &sequence, &simple.Option{Name: "prefer-last-server"})
649649
addParser(parser, &sequence, &simple.Option{Name: "socket-stats"})

tests/configs/haproxy.cfg.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ defaults A
6262
no option httpslog
6363
no option independent-streams
6464
no option nolinger
65-
no option originalto
65+
option originalto
6666
option persist
6767
option prefer-last-server
6868
option socket-stats
@@ -214,7 +214,7 @@ frontend xyz4 from A
214214
no option httpslog
215215
no option independent-streams
216216
no option nolinger
217-
no option originalto
217+
option originalto except 127.0.0.1
218218
no option socket-stats
219219
no option tcp-smart-accept
220220
no option idle-close-on-response
@@ -239,7 +239,7 @@ frontend xyz5 from A
239239
option httpslog
240240
option independent-streams
241241
option nolinger
242-
option originalto
242+
option originalto header X-Client-Dst
243243
option socket-stats
244244
option tcp-smart-accept
245245
option idle-close-on-response
@@ -271,7 +271,7 @@ backend default_backend from A
271271
option checkcache
272272
option independent-streams
273273
option nolinger
274-
option originalto
274+
option originalto header X-Client-Dst
275275
option persist
276276
option prefer-last-server
277277
option spop-check
@@ -285,7 +285,7 @@ backend default_backend2 from A
285285
no option checkcache
286286
no option independent-streams
287287
no option nolinger
288-
no option originalto
288+
option originalto except 127.0.0.1 header X-Client-Dst
289289
no option persist
290290
no option prefer-last-server
291291
no option spop-check

tests/configs/haproxy_generated.cfg.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/integration/backend_data_test.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/integration/backend_test.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/integration/defaults_data_test.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/integration/defaults_test.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)