diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-05-15 14:58:52 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-05-15 15:56:32 +0200 |
commit | 11b2506e5c9463fa748441f3cbad85e24272796c (patch) | |
tree | 453352d3db81c6a9786294f7a26c801ea8c0b253 /client/go/internal | |
parent | 7e39f8036dbeb3722fca3a50fdc9c86129011cf0 (diff) |
Reuse buffer for URL building
Diffstat (limited to 'client/go/internal')
-rw-r--r-- | client/go/internal/vespa/document/http.go | 20 | ||||
-rw-r--r-- | client/go/internal/vespa/document/http_test.go | 2 |
2 files changed, 11 insertions, 11 deletions
diff --git a/client/go/internal/vespa/document/http.go b/client/go/internal/vespa/document/http.go index 3655bd020f4..c1ecf38940a 100644 --- a/client/go/internal/vespa/document/http.go +++ b/client/go/internal/vespa/document/http.go @@ -106,7 +106,7 @@ func NewClient(options ClientOptions, httpClients []util.HTTPClient) (*Client, e return c, nil } -func writeQueryParam(sb *strings.Builder, start int, escape bool, k, v string) { +func writeQueryParam(sb *bytes.Buffer, start int, escape bool, k, v string) { if sb.Len() == start { sb.WriteString("?") } else { @@ -130,7 +130,7 @@ func writeRequestBody(w io.Writer, body []byte) error { return nil } -func (c *Client) methodAndURL(d Document) (string, string) { +func (c *Client) methodAndURL(d Document, sb *bytes.Buffer) (string, string) { httpMethod := "" switch d.Operation { case OperationPut: @@ -140,7 +140,6 @@ func (c *Client) methodAndURL(d Document) (string, string) { case OperationRemove: httpMethod = "DELETE" } - var sb strings.Builder // Base URL and path sb.WriteString(c.options.BaseURL) if !strings.HasSuffix(c.options.BaseURL, "/") { @@ -165,22 +164,22 @@ func (c *Client) methodAndURL(d Document) (string, string) { // Query part queryStart := sb.Len() if c.options.Timeout > 0 { - writeQueryParam(&sb, queryStart, false, "timeout", strconv.FormatInt(c.options.Timeout.Milliseconds(), 10)+"ms") + writeQueryParam(sb, queryStart, false, "timeout", strconv.FormatInt(c.options.Timeout.Milliseconds(), 10)+"ms") } if c.options.Route != "" { - writeQueryParam(&sb, queryStart, true, "route", c.options.Route) + writeQueryParam(sb, queryStart, true, "route", c.options.Route) } if c.options.TraceLevel > 0 { - writeQueryParam(&sb, queryStart, false, "tracelevel", strconv.Itoa(c.options.TraceLevel)) + writeQueryParam(sb, queryStart, false, "tracelevel", strconv.Itoa(c.options.TraceLevel)) } if c.options.Speedtest { - writeQueryParam(&sb, queryStart, false, "dryRun", "true") + writeQueryParam(sb, queryStart, false, "dryRun", "true") } if d.Condition != "" { - writeQueryParam(&sb, queryStart, true, "condition", d.Condition) + writeQueryParam(sb, queryStart, true, "condition", d.Condition) } if d.Create { - writeQueryParam(&sb, queryStart, false, "create", "true") + writeQueryParam(sb, queryStart, false, "create", "true") } return httpMethod, sb.String() } @@ -217,8 +216,8 @@ func (c *Client) buffer() *bytes.Buffer { func (c *Client) preparePending() { for pd := range c.pending { - method, url := c.methodAndURL(pd.document) pd.buf = c.buffer() + method, url := c.methodAndURL(pd.document, pd.buf) pd.request, pd.err = c.createRequest(method, url, pd.document.Fields, pd.buf) pd.prepared <- true } @@ -238,6 +237,7 @@ func (c *Client) createRequest(method, url string, body []byte, buf *bytes.Buffe } bodySize := len(fieldsPrefix) + len(body) + len(fieldsSuffix) useGzip := c.options.Compression == CompressionGzip || (c.options.Compression == CompressionAuto && bodySize > 512) + buf.Reset() buf.Grow(min(1024, bodySize)) if useGzip { zw := c.gzipWriter(buf) diff --git a/client/go/internal/vespa/document/http_test.go b/client/go/internal/vespa/document/http_test.go index 95af5f997f4..fae43ce24e5 100644 --- a/client/go/internal/vespa/document/http_test.go +++ b/client/go/internal/vespa/document/http_test.go @@ -267,7 +267,7 @@ func TestClientMethodAndURL(t *testing.T) { client.options.Route = tt.options.Route client.options.TraceLevel = tt.options.TraceLevel client.options.Speedtest = tt.options.Speedtest - method, url := client.methodAndURL(tt.in) + method, url := client.methodAndURL(tt.in, &bytes.Buffer{}) if url != tt.url || method != tt.method { t.Errorf("#%d: methodAndURL(doc) = (%s, %s), want (%s, %s)", i, method, url, tt.method, tt.url) } |