From d52bb3fdf4d2965d5a3d513ba032e1a9a5cef9ee Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Thu, 4 Jul 2024 11:27:00 +0100 Subject: [PATCH] fix: print error messages from instance If an error occurs when sending a request to an instance, try and decode and print the error message back to the user. --- internal/client/client.go | 23 +++++++++++++++++++---- internal/client/errors.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 internal/client/errors.go diff --git a/internal/client/client.go b/internal/client/client.go index 620b957..f72c394 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -123,10 +123,25 @@ func (g *Client) sendRequest(method string, url string, requestBody io.Reader, o defer response.Body.Close() if response.StatusCode < http.StatusOK || response.StatusCode >= http.StatusBadRequest { - return fmt.Errorf( - "did not receive an OK response from the GoToSocial server: got %d", - response.StatusCode, - ) + message := struct { + Error string `json:"error"` + }{ + Error: "", + } + + if err := json.NewDecoder(response.Body).Decode(&message); err != nil { + return ResponseError{ + StatusCode: response.StatusCode, + Message: "", + MessageDecodeErr: err, + } + } + + return ResponseError{ + StatusCode: response.StatusCode, + Message: message.Error, + MessageDecodeErr: nil, + } } if object == nil { diff --git a/internal/client/errors.go b/internal/client/errors.go new file mode 100644 index 0000000..7e0d393 --- /dev/null +++ b/internal/client/errors.go @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2024 Dan Anglin +// +// SPDX-License-Identifier: GPL-3.0-or-later + +package client + +import "fmt" + +type ResponseError struct { + StatusCode int + Message string + MessageDecodeErr error +} + +func (e ResponseError) Error() string { + if e.MessageDecodeErr != nil { + return fmt.Sprintf( + "received HTTP code %d from the instance but was unable to decode the error message: %v", + e.StatusCode, + e.MessageDecodeErr, + ) + } + + if e.Message == "" { + return fmt.Sprintf( + "received HTTP code %d from the instance but no error message was provided", + e.StatusCode, + ) + } + + return fmt.Sprintf( + "message received from the instance: (%d) %q", + e.StatusCode, + e.Message, + ) +}