Skip to content

Commit e4a7c38

Browse files
cpuguy83runcom
authored andcommitted
Limit authz response buffer
When the authz response buffer limit is hit, perform a flush. This prevents excessive buffer sizes, especially on large responses (e.g. `/containers/<id>/archive` or `/containers/<id>/export`). Signed-off-by: Brian Goff <cpuguy83@gmail.com>
1 parent 7e1d789 commit e4a7c38

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

pkg/authorization/response.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ func NewResponseModifier(rw http.ResponseWriter) ResponseModifier {
4747
return &responseModifier{rw: rw, header: make(http.Header)}
4848
}
4949

50+
const maxBufferSize = 64 * 1024
51+
5052
// responseModifier is used as an adapter to http.ResponseWriter in order to manipulate and explore
5153
// the http request/response from docker daemon
5254
type responseModifier struct {
@@ -116,11 +118,13 @@ func (rm *responseModifier) OverrideHeader(b []byte) error {
116118

117119
// Write stores the byte array inside content
118120
func (rm *responseModifier) Write(b []byte) (int, error) {
119-
120121
if rm.hijacked {
121122
return rm.rw.Write(b)
122123
}
123124

125+
if len(rm.body)+len(b) > maxBufferSize {
126+
rm.Flush()
127+
}
124128
rm.body = append(rm.body, b...)
125129
return len(b), nil
126130
}
@@ -192,11 +196,14 @@ func (rm *responseModifier) FlushAll() error {
192196
var err error
193197
if len(rm.body) > 0 {
194198
// Write body
195-
_, err = rm.rw.Write(rm.body)
199+
var n int
200+
n, err = rm.rw.Write(rm.body)
201+
// TODO(@cpuguy83): there is now a relatively small buffer limit, instead of discarding our buffer here and
202+
// allocating again later this should just keep using the same buffer and track the buffer position (like a bytes.Buffer with a fixed size)
203+
rm.body = rm.body[n:]
196204
}
197205

198206
// Clean previous data
199-
rm.body = nil
200207
rm.statusCode = 0
201208
rm.header = http.Header{}
202209
return err

0 commit comments

Comments
 (0)