From 224a9f7ddaf1e1b33a80854d2acd00b5e2b9647a Mon Sep 17 00:00:00 2001 From: Marc Szanto <11840265+Xemdo@users.noreply.github.com> Date: Fri, 21 Apr 2023 10:41:22 -0700 Subject: [PATCH 1/2] Added safety checks to dereferencing pointer --- internal/api/api.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/api/api.go b/internal/api/api.go index 9ca79789..9cff517a 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -111,13 +111,19 @@ func NewRequest(method string, path string, queryParameters []string, body []byt fmt.Printf("Error unmarshalling body: %v", err) return } + + var cursor string = "" + if extensionsBody.Pagination != nil { + cursor = *extensionsBody.Pagination + } + apiResponse = models.APIResponse{ Data: extensionsBody.Data, Status: extensionsBody.Status, Error: extensionsBody.Error, Message: extensionsBody.Message, Pagination: &models.APIPagination{ - Cursor: *extensionsBody.Pagination, + Cursor: cursor, }, } } else { From 29ede46c08824bad63344fa6a9c5077958129e66 Mon Sep 17 00:00:00 2001 From: Marc Szanto <11840265+Xemdo@users.noreply.github.com> Date: Fri, 21 Apr 2023 11:48:20 -0700 Subject: [PATCH 2/2] Changed APIResonse struct to generics to not make assumptions about format used in the Data response field --- internal/api/api.go | 13 +++++++++---- internal/models/api.go | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/internal/api/api.go b/internal/api/api.go index 9cff517a..26db4ff5 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -35,7 +35,7 @@ func NewRequest(method string, path string, queryParameters []string, body []byt var err error var cursor string - isExtensionsEndpoint := false // https://github.com/twitchdev/twitch-cli/issues/157 + isExtensionsLiveEndpoint := false // https://github.com/twitchdev/twitch-cli/issues/157 data.Data = make([]interface{}, 0) client, err := GetClientInformation() @@ -104,7 +104,7 @@ func NewRequest(method string, path string, queryParameters []string, body []byt } if strings.Contains(u.String(), "extensions/live") { // https://github.com/twitchdev/twitch-cli/issues/157 - isExtensionsEndpoint = true + isExtensionsLiveEndpoint = true var extensionsBody models.ExtensionAPIResponse err = json.Unmarshal(resp.Body, &extensionsBody) if err != nil { @@ -181,12 +181,17 @@ func NewRequest(method string, path string, queryParameters []string, body []byt data.Data = make([]interface{}, 0) } // handle json marshalling better; returns empty slice vs. null - if !strings.Contains(path, "schedule") && len(data.Data.([]interface{})) == 0 && data.Error == "" { + _, isInterface := data.Data.([]interface{}) + if isInterface && !strings.Contains(path, "schedule") && len(data.Data.([]interface{})) == 0 && data.Error == "" { data.Data = make([]interface{}, 0) } + _, isStringMap := data.Data.(map[string]any) + if isStringMap && !strings.Contains(path, "schedule") && len(data.Data.(map[string]any)) == 0 && data.Error == "" { + data.Data = make(map[string]any, 0) + } var d []byte - if isExtensionsEndpoint { + if isExtensionsLiveEndpoint { extensionBody := models.ExtensionAPIResponse{ Data: data.Data, Pagination: &data.Pagination.Cursor, diff --git a/internal/models/api.go b/internal/models/api.go index d9d7870f..4502bb07 100644 --- a/internal/models/api.go +++ b/internal/models/api.go @@ -3,7 +3,7 @@ package models type APIResponse struct { - Data interface{} `json:"data,omitempty"` + Data any `json:"data,omitempty"` Pagination *APIPagination `json:"pagination,omitempty"` Error string `json:"error,omitempty"` Status int `json:"status,omitempty"` @@ -22,7 +22,7 @@ type BitsLeaderboardDateRange struct { EndedAt string `json:"ended_at"` } -type ExtensionAPIResponse struct { +type ExtensionAPIResponse struct { // extensions/live Data interface{} `json:"data,omitempty"` Pagination *string `json:"pagination,omitempty"` Error string `json:"error,omitempty"`