Skip to content

Commit 14cec82

Browse files
authored
feature: io package inspect stream reader (#2828)
refactor: block* filters to use the new io package refactor: remove custom matcher Signed-off-by: Sandor Szücs <sandor.szuecs@zalando.de>
1 parent 7a440ef commit 14cec82

File tree

7 files changed

+883
-397
lines changed

7 files changed

+883
-397
lines changed

filters/block/block.go

+45-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
package block
22

33
import (
4+
"bytes"
45
"encoding/hex"
5-
"errors"
66

77
"github.com/zalando/skipper/filters"
8-
)
9-
10-
var (
11-
ErrClosed = errors.New("reader closed")
8+
"github.com/zalando/skipper/io"
9+
"github.com/zalando/skipper/metrics"
1210
)
1311

1412
type blockSpec struct {
1513
MaxMatcherBufferSize uint64
1614
hex bool
1715
}
1816

17+
type toBlockKeys struct{ Str []byte }
18+
19+
func (b toBlockKeys) String() string {
20+
return string(b.Str)
21+
}
22+
1923
type block struct {
20-
toblockList []toblockKeys
24+
toblockList []toBlockKeys
2125
maxEditorBuffer uint64
22-
maxBufferHandling maxBufferHandling
26+
maxBufferHandling io.MaxBufferHandling
27+
metrics metrics.Metrics
2328
}
2429

2530
// NewBlockFilter *deprecated* version of NewBlock
@@ -52,7 +57,7 @@ func (bs *blockSpec) CreateFilter(args []interface{}) (filters.Filter, error) {
5257
return nil, filters.ErrInvalidFilterParameters
5358
}
5459

55-
sargs := make([]toblockKeys, 0, len(args))
60+
sargs := make([]toBlockKeys, 0, len(args))
5661
for _, w := range args {
5762
v, ok := w.(string)
5863
if !ok {
@@ -63,33 +68,50 @@ func (bs *blockSpec) CreateFilter(args []interface{}) (filters.Filter, error) {
6368
if err != nil {
6469
return nil, err
6570
}
66-
sargs = append(sargs, toblockKeys{str: a})
71+
sargs = append(sargs, toBlockKeys{Str: a})
6772
} else {
68-
sargs = append(sargs, toblockKeys{str: []byte(v)})
73+
sargs = append(sargs, toBlockKeys{Str: []byte(v)})
6974
}
7075
}
7176

72-
b := &block{
77+
return &block{
7378
toblockList: sargs,
74-
maxBufferHandling: maxBufferBestEffort,
79+
maxBufferHandling: io.MaxBufferBestEffort,
7580
maxEditorBuffer: bs.MaxMatcherBufferSize,
76-
}
81+
metrics: metrics.Default,
82+
}, nil
83+
}
7784

78-
return *b, nil
85+
func blockMatcher(m metrics.Metrics, matches []toBlockKeys) func(b []byte) (int, error) {
86+
return func(b []byte) (int, error) {
87+
for _, s := range matches {
88+
s := s
89+
if bytes.Contains(b, s.Str) {
90+
m.IncCounter("blocked.requests")
91+
return 0, io.ErrBlocked
92+
}
93+
}
94+
return len(b), nil
95+
}
7996
}
8097

81-
func (b block) Request(ctx filters.FilterContext) {
98+
func (b *block) Request(ctx filters.FilterContext) {
8299
req := ctx.Request()
83100
if req.ContentLength == 0 {
84101
return
85102
}
86-
87-
req.Body = newMatcher(
88-
req.Body,
89-
b.toblockList,
90-
b.maxEditorBuffer,
91-
b.maxBufferHandling,
92-
)
103+
// fix filter chaining - https://github.com/zalando/skipper/issues/2605
104+
ctx.Request().Header.Del("Content-Length")
105+
ctx.Request().ContentLength = -1
106+
107+
req.Body = io.InspectReader(
108+
req.Context(),
109+
io.BufferOptions{
110+
MaxBufferHandling: b.maxBufferHandling,
111+
ReadBufferSize: b.maxEditorBuffer,
112+
},
113+
blockMatcher(b.metrics, b.toblockList),
114+
req.Body)
93115
}
94116

95-
func (block) Response(filters.FilterContext) {}
117+
func (*block) Response(filters.FilterContext) {}

0 commit comments

Comments
 (0)