Skip to content

Commit

Permalink
Merge pull request #138 from diamondburned/master
Browse files Browse the repository at this point in the history
fix: errors from InfluxDB 1.8 being empty
  • Loading branch information
vlastahajek authored Jun 29, 2020
2 parents 787ea0b + 21311f2 commit 64f0d85
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
38 changes: 35 additions & 3 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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())
}
13 changes: 10 additions & 3 deletions internal/http/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

package http

import "fmt"
import (
"fmt"
"strconv"
)

// Error represent error response from InfluxDBServer or http error
type Error struct {
Expand All @@ -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
Expand Down
10 changes: 7 additions & 3 deletions internal/http/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}

0 comments on commit 64f0d85

Please sign in to comment.