summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-05-08 11:21:53 +0200
committerMartin Polden <mpolden@mpolden.no>2023-05-08 11:33:10 +0200
commit8515d43086a8ed624941773176dacf893ab797ba (patch)
tree642c108bee6a5dcad6108b9aea05b50219370c4a /client
parent3b4d93a502d855558ccf1225de34f6b1a2832aff (diff)
Count sent bytes correctly for compressed requests
Diffstat (limited to 'client')
-rw-r--r--client/go/internal/vespa/document/http.go9
-rw-r--r--client/go/internal/vespa/document/http_test.go6
2 files changed, 12 insertions, 3 deletions
diff --git a/client/go/internal/vespa/document/http.go b/client/go/internal/vespa/document/http.go
index 6e7c2219e8f..e9e6d36ff11 100644
--- a/client/go/internal/vespa/document/http.go
+++ b/client/go/internal/vespa/document/http.go
@@ -188,6 +188,7 @@ func (c *Client) createRequest(method, url string, body []byte) (*http.Request,
bytes.NewReader(body),
strings.NewReader(fieldsSuffix),
)
+ contentLength := int64(len(fieldsPrefix) + len(body) + len(fieldsSuffix))
useGzip := c.options.Compression == CompressionGzip || (c.options.Compression == CompressionAuto && len(body) > 512)
if useGzip {
var buf bytes.Buffer
@@ -201,6 +202,7 @@ func (c *Client) createRequest(method, url string, body []byte) (*http.Request,
}
c.gzippers.Put(w)
r = &buf
+ contentLength = int64(buf.Len())
}
req, err := http.NewRequest(method, url, r)
if err != nil {
@@ -210,6 +212,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
return req, nil
}
@@ -235,7 +238,7 @@ func (c *Client) Send(document Document) Result {
}
defer resp.Body.Close()
elapsed := c.now().Sub(start)
- return c.resultWithResponse(resp, result, document, elapsed)
+ return c.resultWithResponse(resp, req.ContentLength, result, document, elapsed)
}
func resultWithErr(result Result, err error) Result {
@@ -245,7 +248,7 @@ func resultWithErr(result Result, err error) Result {
return result
}
-func (c *Client) resultWithResponse(resp *http.Response, result Result, document Document, elapsed time.Duration) Result {
+func (c *Client) resultWithResponse(resp *http.Response, sentBytes int64, result Result, document Document, elapsed time.Duration) Result {
result.HTTPStatus = resp.StatusCode
result.Stats.Responses++
result.Stats.ResponsesByCode = map[int]int64{resp.StatusCode: 1}
@@ -277,7 +280,7 @@ func (c *Client) resultWithResponse(resp *http.Response, result Result, document
}
result.Message = body.Message
result.Trace = string(body.Trace)
- result.Stats.BytesSent = int64(len(document.Fields) + len(fieldsPrefix) + len(fieldsSuffix))
+ result.Stats.BytesSent = sentBytes
result.Stats.BytesRecv = int64(written)
if !result.Success() {
result.Stats.Errors++
diff --git a/client/go/internal/vespa/document/http_test.go b/client/go/internal/vespa/document/http_test.go
index da7f264e8d8..928a457568e 100644
--- a/client/go/internal/vespa/document/http_test.go
+++ b/client/go/internal/vespa/document/http_test.go
@@ -123,6 +123,9 @@ func TestClientSend(t *testing.T) {
if !bytes.Equal(body, wantBody.Bytes()) {
t.Errorf("got r.Body = %q, want %q", string(body), wantBody.String())
}
+ if r.ContentLength != int64(len(body)) {
+ t.Errorf("got r.ContentLength=%d, want %d", r.ContentLength, len(body))
+ }
}
want := Stats{
Requests: 3,
@@ -187,6 +190,9 @@ func assertCompressedRequest(t *testing.T, want bool, request *http.Request) {
if err != nil {
t.Fatal(err)
}
+ if request.ContentLength != int64(len(body)) {
+ t.Errorf("got ContentLength=%d, want %d", request.ContentLength, len(body))
+ }
compressed := bytes.HasPrefix(body, []byte{0x1f, 0x8b})
if compressed != want {
t.Errorf("got compressed=%t, want %t", compressed, want)