From 21311f26e84406fc0c76326e9ea4fb1ee4c6b6ab Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Wed, 24 Jun 2020 16:19:24 -0700 Subject: [PATCH] Added an HTTP error fallbacks for InfluxDB 1.8 Squashed from 4 commits: - Added an HTTP error fallback to X-Influxdb-Error - Added a final default fallback for the HTTP Error - Added tests for Influx 1.8 and fallback errors - Added this PR to changelogs --- CHANGELOG.md | 1 + client_test.go | 38 +++++++++++++++++++++++++++++++++++--- internal/http/error.go | 13 ++++++++++--- internal/http/service.go | 10 +++++++--- 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0ad635a..67d0008f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Features 1. [#131](https://github.com/influxdata/influxdb-client-go/pull/131) Labels API 1. [#136](https://github.com/influxdata/influxdb-client-go/pull/136) Possibility to specify default tags +1. [#138](https://github.com/influxdata/influxdb-client-go/pull/138) Fix errors from InfluxDB 1.8 being empty ### Bug fixes 1. [#132](https://github.com/influxdata/influxdb-client-go/pull/132) Handle unsupported write type as string instead of generating panic diff --git a/client_test.go b/client_test.go index 98887487..f5b9fdf8 100644 --- a/client_test.go +++ b/client_test.go @@ -6,13 +6,14 @@ package influxdb2 import ( "context" - http2 "github.com/influxdata/influxdb-client-go/internal/http" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "net/http" "net/http/httptest" "testing" "time" + + http2 "github.com/influxdata/influxdb-client-go/internal/http" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestUserAgent(t *testing.T) { @@ -72,3 +73,34 @@ func TestServerErrorNonJSON(t *testing.T) { assert.Equal(t, "500 Internal Server Error", perror.Code) assert.Equal(t, "internal server error", perror.Message) } + +func TestServerErrorInflux1_8(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Influxdb-Error", "bruh moment") + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(404) + w.Write([]byte(`{"error": "bruh moment"}`)) + })) + + defer server.Close() + c := NewClient(server.URL, "x") + err := c.WriteApiBlocking("o", "b").WriteRecord(context.Background(), "a,a=a a=1i") + require.NotNil(t, err) + perror, ok := err.(*http2.Error) + require.True(t, ok) + require.NotNil(t, perror) + assert.Equal(t, "404 Not Found", perror.Code) + assert.Equal(t, "bruh moment", perror.Message) +} + +func TestServerErrorEmptyBody(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(404) + })) + + defer server.Close() + c := NewClient(server.URL, "x") + err := c.WriteApiBlocking("o", "b").WriteRecord(context.Background(), "a,a=a a=1i") + require.NotNil(t, err) + assert.Equal(t, "Unexpected status code 404", err.Error()) +} diff --git a/internal/http/error.go b/internal/http/error.go index 925983f0..7907ce83 100644 --- a/internal/http/error.go +++ b/internal/http/error.go @@ -4,7 +4,10 @@ package http -import "fmt" +import ( + "fmt" + "strconv" +) // Error represent error response from InfluxDBServer or http error type Error struct { @@ -17,10 +20,14 @@ type Error struct { // Error fulfils error interface func (e *Error) Error() string { - if e.Err != nil { + switch { + case e.Err != nil: return e.Err.Error() + case e.Code != "" && e.Message != "": + return fmt.Sprintf("%s: %s", e.Code, e.Message) + default: + return "Unexpected status code " + strconv.Itoa(e.StatusCode) } - return fmt.Sprintf("%s: %s", e.Code, e.Message) } // NewError returns newly created Error initialised with nested error and default values diff --git a/internal/http/service.go b/internal/http/service.go index 8756cd85..2f7bede9 100644 --- a/internal/http/service.go +++ b/internal/http/service.go @@ -147,18 +147,18 @@ func (s *serviceImpl) handleHttpError(r *http.Response) *Error { perror := NewError(nil) perror.StatusCode = r.StatusCode + if v := r.Header.Get("Retry-After"); v != "" { r, err := strconv.ParseUint(v, 10, 32) if err == nil { perror.RetryAfter = uint(r) } } + // json encoded error ctype, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) if ctype == "application/json" { - err := json.NewDecoder(r.Body).Decode(perror) - perror.Err = err - return perror + perror.Err = json.NewDecoder(r.Body).Decode(perror) } else { body, err := ioutil.ReadAll(r.Body) if err != nil { @@ -178,7 +178,11 @@ func (s *serviceImpl) handleHttpError(r *http.Response) *Error { case http.StatusServiceUnavailable: perror.Code = "unavailable" perror.Message = "service temporarily unavailable" + default: + perror.Code = r.Status + perror.Message = r.Header.Get("X-Influxdb-Error") } } + return perror }