Skip to content

Commit 97e14d3

Browse files
committed
feat: adds HTTP response headers to Error type
1 parent dde1e5e commit 97e14d3

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

api/http/error.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package http
66

77
import (
88
"fmt"
9+
"net/http"
910
"strconv"
1011
)
1112

@@ -16,6 +17,7 @@ type Error struct {
1617
Message string
1718
Err error
1819
RetryAfter uint
20+
Header http.Header
1921
}
2022

2123
// Error fulfils error interface
@@ -45,5 +47,6 @@ func NewError(err error) *Error {
4547
Message: "",
4648
Err: err,
4749
RetryAfter: 0,
50+
Header: http.Header{},
4851
}
4952
}

api/http/service.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package http
1616
import (
1717
"context"
1818
"encoding/json"
19+
"fmt"
1920
"io"
2021
"mime"
2122
"net/http"
@@ -113,7 +114,25 @@ func (s *service) DoHTTPRequest(req *http.Request, requestCallback RequestCallba
113114
}
114115

115116
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
116-
return s.parseHTTPError(resp)
117+
logHeaders := ""
118+
httpErr := s.parseHTTPError(resp)
119+
for _, candidate := range []string{
120+
"date",
121+
"trace-id",
122+
"trace-sampled",
123+
"X-Influxdb-Build",
124+
"X-Influxdb-Request-ID",
125+
"X-Influxdb-Version",
126+
} {
127+
if httpErr.Header.Get(candidate) != "" {
128+
logHeaders += fmt.Sprintf("%s: %s\n", candidate, httpErr.Header.Get(candidate))
129+
}
130+
}
131+
log.Errorf("http status code: %d, %s\nSelect Response Headers:\n%s",
132+
resp.StatusCode,
133+
httpErr.Error(),
134+
logHeaders)
135+
return httpErr
117136
}
118137
if responseCallback != nil {
119138
err := responseCallback(resp)
@@ -151,6 +170,7 @@ func (s *service) parseHTTPError(r *http.Response) *Error {
151170

152171
perror := NewError(nil)
153172
perror.StatusCode = r.StatusCode
173+
perror.Header = r.Header
154174

155175
if v := r.Header.Get("Retry-After"); v != "" {
156176
r, err := strconv.ParseUint(v, 10, 32)

client_e2e_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"time"
1919

2020
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
21+
"github.com/influxdata/influxdb-client-go/v2/api/http"
2122
"github.com/influxdata/influxdb-client-go/v2/domain"
2223
"github.com/influxdata/influxdb-client-go/v2/internal/test"
2324
"github.com/influxdata/influxdb-client-go/v2/log"
@@ -368,3 +369,16 @@ func TestWriteCustomBatch(t *testing.T) {
368369
}
369370
assert.Equal(t, 10, l)
370371
}
372+
373+
func TestHttpHeadersInError(t *testing.T) {
374+
client := influxdb2.NewClientWithOptions(serverURL, authToken, influxdb2.DefaultOptions().SetLogLevel(0))
375+
err := client.WriteAPIBlocking("my-org", "my-bucket").WriteRecord(context.Background(), "asdf")
376+
assert.Error(t, err)
377+
assert.Len(t, err.(*http.Error).Header, 6)
378+
assert.NotEqual(t, err.(*http.Error).Header.Get("Date"), "")
379+
assert.NotEqual(t, err.(*http.Error).Header.Get("Content-Length"), "")
380+
assert.NotEqual(t, err.(*http.Error).Header.Get("Content-Type"), "")
381+
assert.NotEqual(t, err.(*http.Error).Header.Get("X-Platform-Error-Code"), "")
382+
assert.Contains(t, err.(*http.Error).Header.Get("X-Influxdb-Version"), "v")
383+
assert.Equal(t, err.(*http.Error).Header.Get("X-Influxdb-Build"), "OSS")
384+
}

0 commit comments

Comments
 (0)