aboutsummaryrefslogtreecommitdiffstats
path: root/client/go
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-05-15 14:58:52 +0200
committerMartin Polden <mpolden@mpolden.no>2023-05-15 15:56:32 +0200
commit11b2506e5c9463fa748441f3cbad85e24272796c (patch)
tree453352d3db81c6a9786294f7a26c801ea8c0b253 /client/go
parent7e39f8036dbeb3722fca3a50fdc9c86129011cf0 (diff)
Reuse buffer for URL building
Diffstat (limited to 'client/go')
-rw-r--r--client/go/internal/vespa/document/http.go20
-rw-r--r--client/go/internal/vespa/document/http_test.go2
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)
}