diff --git a/CHANGELOG.md b/CHANGELOG.md index ea8901d..b5825cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Features 1. [#87](https://github.com/InfluxCommunity/influxdb3-go/pull/87): Add Cloud Dedicated database creation support +1. [#89](https://github.com/InfluxCommunity/influxdb3-go/pull/89): InfluxDB Edge (OSS) error handling 1. [#91](https://github.com/InfluxCommunity/influxdb3-go/pull/91): Add Edge (OSS) authentication support. ## 0.8.0 [2024-06-24] diff --git a/influxdb3/client.go b/influxdb3/client.go index f7a05d3..c950ef5 100644 --- a/influxdb3/client.go +++ b/influxdb3/client.go @@ -200,8 +200,11 @@ func (c *Client) resolveHTTPError(r *http.Response) error { var httpError struct { ServerError - // Error message of InfluxDB 1 error + // InfluxDB Edge/OSS error message fields Error string `json:"error"` + Data struct { + ErrorMessage string `json:"error_message"` + } `json:"data"` } httpError.StatusCode = r.StatusCode @@ -217,13 +220,17 @@ func (c *Client) resolveHTTPError(r *http.Response) error { httpError.Message = fmt.Sprintf("cannot read error response:: %v", err) } ctype, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) - if ctype == "application/json" { + if ctype == "application/json" || ctype == "" { err := json.Unmarshal(body, &httpError) - if err != nil { + if err != nil && ctype != "" { httpError.Message = fmt.Sprintf("cannot decode error response: %v", err) } if httpError.Message == "" && httpError.Code == "" { - httpError.Message = httpError.Error + if len(httpError.Data.ErrorMessage) > 0 { + httpError.Message = httpError.Data.ErrorMessage + } else { + httpError.Message = httpError.Error + } } } if httpError.Message == "" { diff --git a/influxdb3/client_test.go b/influxdb3/client_test.go index 8853413..0b9d787 100644 --- a/influxdb3/client_test.go +++ b/influxdb3/client_test.go @@ -489,7 +489,7 @@ func TestResolveErrorWrongJsonResponse(t *testing.T) { assert.Equal(t, "cannot decode error response: unexpected end of JSON input", err.Error()) } -func TestResolveErrorV1(t *testing.T) { +func TestResolveErrorEdge(t *testing.T) { errMsg := "compilation failed: error at @1:170-1:171: invalid expression @1:167-1:168: |" ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") @@ -513,6 +513,31 @@ func TestResolveErrorV1(t *testing.T) { assert.Equal(t, errMsg, err.Error()) } +func TestResolveErrorEdgeWithData(t *testing.T) { + errMsg := "compilation failed" + dataErrMsg := "compilation failed: error at @1:170-1:171: invalid expression @1:167-1:168: |" + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(400) + _, _ = w.Write([]byte(`{"error": "` + errMsg + `", "data": {"error_message": "` + dataErrMsg + `"}}`)) + })) + defer ts.Close() + client, err := New(ClientConfig{Host: ts.URL, Token: "my-token"}) + require.NoError(t, err) + turl, err := url.Parse(ts.URL) + require.NoError(t, err) + res, err := client.makeAPICall(context.Background(), httpParams{ + endpointURL: turl, + queryParams: nil, + httpMethod: "GET", + headers: nil, + body: nil, + }) + assert.Nil(t, res) + require.Error(t, err) + assert.Equal(t, dataErrMsg, err.Error()) +} + func TestResolveErrorNoError(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(500)