@@ -58,7 +58,7 @@ func (c *Client) doGet(endpoint string, params map[string]string) ([]byte, error
5858 }
5959 defer resp .Body .Close ()
6060
61- body , err := io .ReadAll (resp .Body )
61+ body , err := io .ReadAll (io . LimitReader ( resp .Body , 100 << 20 )) // 100 MB limit
6262 if err != nil {
6363 return nil , & clierrors.NetworkError {Message : "Failed to read response: " + err .Error ()}
6464 }
@@ -81,24 +81,19 @@ func (c *Client) doGet(endpoint string, params map[string]string) ([]byte, error
8181 return body , nil
8282}
8383
84- func checkAPIError (data []byte , target any ) error {
85- if err := json .Unmarshal (data , target ); err != nil {
86- return & clierrors.ApiError {Message : "Failed to parse JSON response: " + err .Error ()}
84+ // checkAPIError returns an ApiError if the JSON body contains a top-level "error" key.
85+ func checkAPIError (body []byte ) error {
86+ var envelope struct {
87+ Error string `json:"error"`
8788 }
88- // Check for top-level "error" key in map results
89- if m , ok := target .(* map [string ]any ); ok {
90- if errVal , exists := (* m )["error" ]; exists {
91- if msg , ok := errVal .(string ); ok {
92- return & clierrors.ApiError {Message : msg }
93- }
94- return & clierrors.ApiError {Message : "Unknown API error" }
95- }
89+ if json .Unmarshal (body , & envelope ) == nil && envelope .Error != "" {
90+ return & clierrors.ApiError {Message : envelope .Error }
9691 }
9792 return nil
9893}
9994
10095// Search performs a search request. If the client has an API key it is added to params.
101- func (c * Client ) Search (params map [string ]string ) (map [ string ] any , error ) {
96+ func (c * Client ) Search (params map [string ]string ) (json. RawMessage , error ) {
10297 p := make (map [string ]string , len (params )+ 1 )
10398 for k , v := range params {
10499 p [k ] = v
@@ -111,65 +106,52 @@ func (c *Client) Search(params map[string]string) (map[string]any, error) {
111106 if err != nil {
112107 return nil , err
113108 }
114-
115- var result map [string ]any
116- if err := checkAPIError (body , & result ); err != nil {
109+ if err := checkAPIError (body ); err != nil {
117110 return nil , err
118111 }
119- return result , nil
112+ return json . RawMessage ( body ) , nil
120113}
121114
122115// Account retrieves account information.
123- func (c * Client ) Account () (map [ string ] any , error ) {
116+ func (c * Client ) Account () (json. RawMessage , error ) {
124117 params := map [string ]string {"api_key" : c .apiKey }
125118
126119 body , err := c .doGet ("/account.json" , params )
127120 if err != nil {
128121 return nil , err
129122 }
130-
131- var result map [string ]any
132- if err := checkAPIError (body , & result ); err != nil {
123+ if err := checkAPIError (body ); err != nil {
133124 return nil , err
134125 }
135- return result , nil
126+ return json . RawMessage ( body ) , nil
136127}
137128
138129// Locations queries the locations endpoint. No API key is added.
139- func (c * Client ) Locations (params map [string ]string ) ([] any , error ) {
130+ func (c * Client ) Locations (params map [string ]string ) (json. RawMessage , error ) {
140131 body , err := c .doGet ("/locations.json" , params )
141132 if err != nil {
142133 return nil , err
143134 }
144-
145- var result []any
146- if err := json .Unmarshal (body , & result ); err != nil {
147- // Maybe it's an object with an error key
148- var obj map [string ]any
149- if json .Unmarshal (body , & obj ) == nil {
150- if errVal , ok := obj ["error" ]; ok {
151- if msg , ok := errVal .(string ); ok {
152- return nil , & clierrors.ApiError {Message : msg }
153- }
154- }
135+ // Locations returns a JSON array; check for an error object.
136+ if len (body ) > 0 && body [0 ] == '{' {
137+ if err := checkAPIError (body ); err != nil {
138+ return nil , err
155139 }
156- return nil , & clierrors.ApiError {Message : "Failed to parse JSON response: " + err . Error () }
140+ return nil , & clierrors.ApiError {Message : "Unexpected response from locations endpoint" }
157141 }
158- return result , nil
142+ return json . RawMessage ( body ) , nil
159143}
160144
161145// Archive retrieves a previously cached search result by ID.
162- func (c * Client ) Archive (id string ) (map [ string ] any , error ) {
146+ func (c * Client ) Archive (id string ) (json. RawMessage , error ) {
163147 params := map [string ]string {"api_key" : c .apiKey }
164148
165149 body , err := c .doGet ("/archive/" + id + ".json" , params )
166150 if err != nil {
167151 return nil , err
168152 }
169-
170- var result map [string ]any
171- if err := checkAPIError (body , & result ); err != nil {
153+ if err := checkAPIError (body ); err != nil {
172154 return nil , err
173155 }
174- return result , nil
156+ return json . RawMessage ( body ) , nil
175157}
0 commit comments