Skip to content

Commit 5f3febf

Browse files
authored
fix(client): correctly handle nonstandard json errors (#511)
fix(client): correctly handle nonstandard json errors
1 parent f681575 commit 5f3febf

File tree

3 files changed

+88
-5
lines changed

3 files changed

+88
-5
lines changed

sysdig/data_source_sysdig_secure_notification_channel_team_email_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestAccSecureNotificationChannelTeamEmailDataSource(t *testing.T) {
3939
func secureNotificationChannelTeamEmail(name string) string {
4040
return fmt.Sprintf(`
4141
resource "sysdig_secure_team" "sample_data" {
42-
name = "secure-sample-data"
42+
name = "secure-sample-data-%s"
4343
all_zones = "true"
4444
}
4545
resource "sysdig_secure_notification_channel_team_email" "nc_team_email" {
@@ -50,5 +50,5 @@ resource "sysdig_secure_notification_channel_team_email" "nc_team_email" {
5050
data "sysdig_secure_notification_channel_team_email" "nc_team_email" {
5151
name = sysdig_secure_notification_channel_team_email.nc_team_email.name
5252
}
53-
`, name)
53+
`, name, name)
5454
}

sysdig/internal/client/v2/client.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (client *Client) ErrorFromResponse(response *http.Response) error {
7575
return errors.New(response.Status)
7676
}
7777

78-
search, err := jmespath.Search("[message, errors[].[reason, message]][][] | join(', ', @)", data)
78+
search, err := jmespath.Search("[message, error, errors[].[reason, message]][][] | join(', ', @)", data)
7979
if err != nil {
8080
return errors.New(response.Status)
8181
}
@@ -84,7 +84,12 @@ func (client *Client) ErrorFromResponse(response *http.Response) error {
8484
return errors.New(strings.Join(cast.ToStringSlice(searchArray), ", "))
8585
}
8686

87-
return errors.New(cast.ToString(search))
87+
searchString := cast.ToString(search)
88+
if searchString != "" {
89+
return errors.New(searchString)
90+
}
91+
92+
return errors.New(response.Status)
8893
}
8994

9095
func Unmarshal[T any](data io.ReadCloser) (T, error) {

sysdig/internal/client/v2/client_test.go

+79-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,23 @@ func TestUnmarshal(t *testing.T) {
5656
}
5757
}
5858

59-
func TestClient_ErrorFromResponse(t *testing.T) {
59+
func TestClient_ErrorFromResponse_non_json(t *testing.T) {
60+
61+
givenPayload := "non json body"
62+
expected := "401 Unauthorized"
63+
c := Client{}
64+
65+
resp := &http.Response{
66+
Status: "401 Unauthorized",
67+
Body: io.NopCloser(strings.NewReader(givenPayload)),
68+
}
69+
err := c.ErrorFromResponse(resp)
70+
if err.Error() != expected {
71+
t.Errorf("expected err %v, got %v", expected, err)
72+
}
73+
}
74+
75+
func TestClient_ErrorFromResponse_standard_error_format(t *testing.T) {
6076
type Error struct {
6177
Reason string `json:"reason"`
6278
Message string `json:"message"`
@@ -94,6 +110,68 @@ func TestClient_ErrorFromResponse(t *testing.T) {
94110
}
95111
}
96112

113+
func TestClient_ErrorFromResponse_standard_error_format_2(t *testing.T) {
114+
115+
givenPayload := `
116+
{
117+
"timestamp" : 1715255725613,
118+
"status" : 401,
119+
"error" : "Unauthorized",
120+
"path" : "/api/v2/alerts/46667521"
121+
}
122+
`
123+
expected := "Unauthorized"
124+
c := Client{}
125+
126+
resp := &http.Response{
127+
Status: "401 Unauthorized",
128+
Body: io.NopCloser(strings.NewReader(givenPayload)),
129+
}
130+
err := c.ErrorFromResponse(resp)
131+
if err.Error() != expected {
132+
t.Errorf("expected err %v, got %v", expected, err)
133+
}
134+
}
135+
136+
func TestClient_ErrorFromResponse_json_nonStandard_error_format(t *testing.T) {
137+
type Error struct {
138+
Reason string `json:"nonStandardFieldNameReason"`
139+
Message string `json:"nonStandardFieldNameMessage"`
140+
}
141+
142+
type Errors struct {
143+
Errors []Error `json:"errors"`
144+
}
145+
146+
given := Errors{
147+
Errors: []Error{
148+
{
149+
Reason: "error1",
150+
Message: "message1",
151+
},
152+
{
153+
Reason: "error2",
154+
Message: "message2",
155+
},
156+
},
157+
}
158+
expected := "401 Unauthorized"
159+
c := Client{}
160+
payload, err := json.Marshal(given)
161+
if err != nil {
162+
t.Errorf("failed to marshal errors, %v", err)
163+
}
164+
165+
resp := &http.Response{
166+
Status: "401 Unauthorized",
167+
Body: io.NopCloser(strings.NewReader(string(payload))),
168+
}
169+
err = c.ErrorFromResponse(resp)
170+
if err.Error() != expected {
171+
t.Errorf("expected err %v, got %v", expected, err)
172+
}
173+
}
174+
97175
func TestRequest(t *testing.T) {
98176
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
99177
agent := r.Header.Get(UserAgentHeader)

0 commit comments

Comments
 (0)