summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-05-08 21:35:44 +0200
committerMartin Polden <mpolden@mpolden.no>2023-05-08 21:38:10 +0200
commit60a1531f892866d33bef204350a18c7738de0700 (patch)
tree788e2c40575b040601dd337742a58e0f5ee70566
parent7dba12e923cc60d76d24bf11dda032e871a0a4e2 (diff)
Replace slow MultiReader with buffer
-rw-r--r--client/go/internal/vespa/document/http.go36
1 files changed, 16 insertions, 20 deletions
diff --git a/client/go/internal/vespa/document/http.go b/client/go/internal/vespa/document/http.go
index d5dd3819ae9..df1e892d5f8 100644
--- a/client/go/internal/vespa/document/http.go
+++ b/client/go/internal/vespa/document/http.go
@@ -101,6 +101,15 @@ func writeQueryParam(sb *strings.Builder, start int, k, v string) {
sb.WriteString(url.QueryEscape(v))
}
+func writeRequestBody(w io.Writer, body []byte) error {
+ for _, b := range [][]byte{fieldsPrefix, body, fieldsSuffix} {
+ if _, err := w.Write(b); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
func (c *Client) methodAndURL(d Document) (string, string) {
httpMethod := ""
switch d.Operation {
@@ -184,34 +193,21 @@ func (c *Client) buffer() *bytes.Buffer {
}
func (c *Client) createRequest(method, url string, body []byte) (*http.Request, error) {
+ var buf *bytes.Buffer
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))
+ buf = bytes.NewBuffer(make([]byte, 0, 1024))
w := c.gzipWriter(buf)
- for _, b := range [][]byte{fieldsPrefix, body, fieldsSuffix} {
- if _, err := w.Write(b); err != nil {
- return nil, err
- }
- }
+ writeRequestBody(w, body)
if err := w.Close(); err != nil {
return nil, err
}
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))
+ buf = bytes.NewBuffer(make([]byte, 0, len(fieldsPrefix)+len(body)+len(fieldsSuffix)))
+ writeRequestBody(buf, body)
}
- req, err := http.NewRequest(method, url, r)
+ req, err := http.NewRequest(method, url, buf)
if err != nil {
return nil, err
}
@@ -219,7 +215,7 @@ func (c *Client) createRequest(method, url string, body []byte) (*http.Request,
req.Header.Set("Content-Encoding", "gzip")
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
- req.ContentLength = contentLength
+ req.ContentLength = int64(buf.Len())
return req, nil
}