diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-05-08 21:21:00 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-05-08 21:21:00 +0200 |
commit | 7dba12e923cc60d76d24bf11dda032e871a0a4e2 (patch) | |
tree | 9dadee7f8970839b3654ff699ed0f37ca4fc8c89 | |
parent | 52f0b05f2aeeafa89a6af2595683013705de07d1 (diff) |
Avoid expensive io.Copy
-rw-r--r-- | client/go/internal/vespa/document/http.go | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/client/go/internal/vespa/document/http.go b/client/go/internal/vespa/document/http.go index d65eb4157a9..d5dd3819ae9 100644 --- a/client/go/internal/vespa/document/http.go +++ b/client/go/internal/vespa/document/http.go @@ -184,19 +184,18 @@ func (c *Client) buffer() *bytes.Buffer { } func (c *Client) createRequest(method, url string, body []byte) (*http.Request, error) { - // include the outer object expected by /document/v1/ without copying the body - r := io.MultiReader( - bytes.NewReader(fieldsPrefix), - bytes.NewReader(body), - bytes.NewReader(fieldsSuffix), - ) - contentLength := int64(len(fieldsPrefix) + len(body) + len(fieldsSuffix)) useGzip := c.options.Compression == CompressionGzip || (c.options.Compression == CompressionAuto && len(body) > 512) + var ( + r io.Reader + contentLength int64 + ) if useGzip { buf := bytes.NewBuffer(make([]byte, 0, 1024)) w := c.gzipWriter(buf) - if _, err := io.Copy(w, r); err != nil { - return nil, err + for _, b := range [][]byte{fieldsPrefix, body, fieldsSuffix} { + if _, err := w.Write(b); err != nil { + return nil, err + } } if err := w.Close(); err != nil { return nil, err @@ -204,6 +203,13 @@ func (c *Client) createRequest(method, url string, body []byte) (*http.Request, c.gzippers.Put(w) r = buf contentLength = int64(buf.Len()) + } else { + r = io.MultiReader( + bytes.NewReader(fieldsPrefix), + bytes.NewReader(body), + bytes.NewReader(fieldsSuffix), + ) + contentLength = int64(len(fieldsPrefix) + len(body) + len(fieldsSuffix)) } req, err := http.NewRequest(method, url, r) if err != nil { |