summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-05-08 21:21:00 +0200
committerMartin Polden <mpolden@mpolden.no>2023-05-08 21:21:00 +0200
commit7dba12e923cc60d76d24bf11dda032e871a0a4e2 (patch)
tree9dadee7f8970839b3654ff699ed0f37ca4fc8c89
parent52f0b05f2aeeafa89a6af2595683013705de07d1 (diff)
Avoid expensive io.Copy
-rw-r--r--client/go/internal/vespa/document/http.go24
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 {