diff --git a/server/subsonic/album_lists.go b/server/subsonic/album_lists.go index efa6aa224..47de92f4b 100644 --- a/server/subsonic/album_lists.go +++ b/server/subsonic/album_lists.go @@ -28,7 +28,7 @@ func NewAlbumListController(ds model.DataStore, nowPlaying core.NowPlaying) *Alb } func (c *AlbumListController) getAlbumList(r *http.Request) (model.Albums, error) { - typ, err := requiredParamString(r, "type", "Required string parameter 'type' is not present") + typ, err := requiredParamString(r, "type") if err != nil { return nil, err } @@ -100,17 +100,17 @@ func (c *AlbumListController) GetStarred(w http.ResponseWriter, r *http.Request) artists, err := c.ds.Artist(ctx).GetStarred(options) if err != nil { log.Error(r, "Error retrieving starred artists", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } albums, err := c.ds.Album(ctx).GetStarred(options) if err != nil { log.Error(r, "Error retrieving starred albums", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } mediaFiles, err := c.ds.MediaFile(ctx).GetStarred(options) if err != nil { log.Error(r, "Error retrieving starred mediaFiles", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -137,7 +137,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque npInfo, err := c.nowPlaying.GetAll() if err != nil { log.Error(r, "Error retrieving now playing list", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -146,7 +146,7 @@ func (c *AlbumListController) GetNowPlaying(w http.ResponseWriter, r *http.Reque for i, np := range npInfo { mf, err := c.ds.MediaFile(ctx).Get(np.TrackID) if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response.NowPlaying.Entry[i].Child = childFromMediaFile(ctx, *mf) @@ -167,7 +167,7 @@ func (c *AlbumListController) GetRandomSongs(w http.ResponseWriter, r *http.Requ songs, err := c.getSongs(r.Context(), 0, size, filter.SongsByRandom(genre, fromYear, toYear)) if err != nil { log.Error(r, "Error retrieving random songs", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -184,7 +184,7 @@ func (c *AlbumListController) GetSongsByGenre(w http.ResponseWriter, r *http.Req songs, err := c.getSongs(r.Context(), offset, count, filter.SongsByGenre(genre)) if err != nil { log.Error(r, "Error retrieving random songs", "error", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() diff --git a/server/subsonic/album_lists_test.go b/server/subsonic/album_lists_test.go index 6f6fcf578..72c17b01f 100644 --- a/server/subsonic/album_lists_test.go +++ b/server/subsonic/album_lists_test.go @@ -44,7 +44,7 @@ var _ = Describe("AlbumListController", func() { r := newGetRequest() _, err := controller.GetAlbumList(w, r) - Expect(err).To(MatchError("Required string parameter 'type' is not present")) + Expect(err).To(MatchError("required 'type' parameter is missing")) }) It("should return error if call fails", func() { @@ -76,7 +76,7 @@ var _ = Describe("AlbumListController", func() { r := newGetRequest() _, err := controller.GetAlbumList2(w, r) - Expect(err).To(MatchError("Required string parameter 'type' is not present")) + Expect(err).To(MatchError("required 'type' parameter is missing")) }) It("should return error if call fails", func() { diff --git a/server/subsonic/api.go b/server/subsonic/api.go index 1b383e44a..9aceb612b 100644 --- a/server/subsonic/api.go +++ b/server/subsonic/api.go @@ -19,7 +19,7 @@ import ( const Version = "1.13.0" -type Handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error) +type handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error) type Router struct { Artwork core.Artwork @@ -64,107 +64,111 @@ func (api *Router) routes() http.Handler { r.Group(func(r chi.Router) { c := initSystemController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "ping", c.Ping) - H(withPlayer, "getLicense", c.GetLicense) + h(withPlayer, "ping", c.Ping) + h(withPlayer, "getLicense", c.GetLicense) }) r.Group(func(r chi.Router) { c := initBrowsingController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "getMusicFolders", c.GetMusicFolders) - H(withPlayer, "getIndexes", c.GetIndexes) - H(withPlayer, "getArtists", c.GetArtists) - H(withPlayer, "getGenres", c.GetGenres) - H(withPlayer, "getMusicDirectory", c.GetMusicDirectory) - H(withPlayer, "getArtist", c.GetArtist) - H(withPlayer, "getAlbum", c.GetAlbum) - H(withPlayer, "getSong", c.GetSong) - H(withPlayer, "getArtistInfo", c.GetArtistInfo) - H(withPlayer, "getArtistInfo2", c.GetArtistInfo2) - H(withPlayer, "getTopSongs", c.GetTopSongs) - H(withPlayer, "getSimilarSongs", c.GetSimilarSongs) - H(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2) + h(withPlayer, "getMusicFolders", c.GetMusicFolders) + h(withPlayer, "getIndexes", c.GetIndexes) + h(withPlayer, "getArtists", c.GetArtists) + h(withPlayer, "getGenres", c.GetGenres) + h(withPlayer, "getMusicDirectory", c.GetMusicDirectory) + h(withPlayer, "getArtist", c.GetArtist) + h(withPlayer, "getAlbum", c.GetAlbum) + h(withPlayer, "getSong", c.GetSong) + h(withPlayer, "getArtistInfo", c.GetArtistInfo) + h(withPlayer, "getArtistInfo2", c.GetArtistInfo2) + h(withPlayer, "getTopSongs", c.GetTopSongs) + h(withPlayer, "getSimilarSongs", c.GetSimilarSongs) + h(withPlayer, "getSimilarSongs2", c.GetSimilarSongs2) }) r.Group(func(r chi.Router) { c := initAlbumListController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "getAlbumList", c.GetAlbumList) - H(withPlayer, "getAlbumList2", c.GetAlbumList2) - H(withPlayer, "getStarred", c.GetStarred) - H(withPlayer, "getStarred2", c.GetStarred2) - H(withPlayer, "getNowPlaying", c.GetNowPlaying) - H(withPlayer, "getRandomSongs", c.GetRandomSongs) - H(withPlayer, "getSongsByGenre", c.GetSongsByGenre) + h(withPlayer, "getAlbumList", c.GetAlbumList) + h(withPlayer, "getAlbumList2", c.GetAlbumList2) + h(withPlayer, "getStarred", c.GetStarred) + h(withPlayer, "getStarred2", c.GetStarred2) + h(withPlayer, "getNowPlaying", c.GetNowPlaying) + h(withPlayer, "getRandomSongs", c.GetRandomSongs) + h(withPlayer, "getSongsByGenre", c.GetSongsByGenre) }) r.Group(func(r chi.Router) { c := initMediaAnnotationController(api) - H(r, "setRating", c.SetRating) - H(r, "star", c.Star) - H(r, "unstar", c.Unstar) - H(r, "scrobble", c.Scrobble) + h(r, "setRating", c.SetRating) + h(r, "star", c.Star) + h(r, "unstar", c.Unstar) + h(r, "scrobble", c.Scrobble) }) r.Group(func(r chi.Router) { c := initPlaylistsController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "getPlaylists", c.GetPlaylists) - H(withPlayer, "getPlaylist", c.GetPlaylist) - H(withPlayer, "createPlaylist", c.CreatePlaylist) - H(withPlayer, "deletePlaylist", c.DeletePlaylist) - H(withPlayer, "updatePlaylist", c.UpdatePlaylist) + h(withPlayer, "getPlaylists", c.GetPlaylists) + h(withPlayer, "getPlaylist", c.GetPlaylist) + h(withPlayer, "createPlaylist", c.CreatePlaylist) + h(withPlayer, "deletePlaylist", c.DeletePlaylist) + h(withPlayer, "updatePlaylist", c.UpdatePlaylist) }) r.Group(func(r chi.Router) { c := initBookmarksController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "getBookmarks", c.GetBookmarks) - H(withPlayer, "createBookmark", c.CreateBookmark) - H(withPlayer, "deleteBookmark", c.DeleteBookmark) - H(withPlayer, "getPlayQueue", c.GetPlayQueue) - H(withPlayer, "savePlayQueue", c.SavePlayQueue) + h(withPlayer, "getBookmarks", c.GetBookmarks) + h(withPlayer, "createBookmark", c.CreateBookmark) + h(withPlayer, "deleteBookmark", c.DeleteBookmark) + h(withPlayer, "getPlayQueue", c.GetPlayQueue) + h(withPlayer, "savePlayQueue", c.SavePlayQueue) }) r.Group(func(r chi.Router) { c := initSearchingController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "search2", c.Search2) - H(withPlayer, "search3", c.Search3) + h(withPlayer, "search2", c.Search2) + h(withPlayer, "search3", c.Search3) }) r.Group(func(r chi.Router) { c := initUsersController(api) - H(r, "getUser", c.GetUser) + h(r, "getUser", c.GetUser) }) r.Group(func(r chi.Router) { c := initMediaRetrievalController(api) // configure request throttling maxRequests := utils.MaxInt(2, runtime.NumCPU()) withThrottle := r.With(middleware.ThrottleBacklog(maxRequests, consts.RequestThrottleBacklogLimit, consts.RequestThrottleBacklogTimeout)) - H(withThrottle, "getAvatar", c.GetAvatar) - H(withThrottle, "getCoverArt", c.GetCoverArt) + h(withThrottle, "getAvatar", c.GetAvatar) + h(withThrottle, "getCoverArt", c.GetCoverArt) }) r.Group(func(r chi.Router) { c := initStreamController(api) withPlayer := r.With(getPlayer(api.Players)) - H(withPlayer, "stream", c.Stream) - H(withPlayer, "download", c.Download) + h(withPlayer, "stream", c.Stream) + h(withPlayer, "download", c.Download) }) // Deprecated/Out of scope endpoints - HGone(r, "getChatMessages") - HGone(r, "addChatMessage") - HGone(r, "getVideos") - HGone(r, "getVideoInfo") - HGone(r, "getCaptions") + h410(r, "getChatMessages") + h410(r, "addChatMessage") + h410(r, "getVideos") + h410(r, "getVideoInfo") + h410(r, "getCaptions") return r } // Add the Subsonic handler, with and without `.view` extension // Ex: if path = `ping` it will create the routes `/ping` and `/ping.view` -func H(r chi.Router, path string, f Handler) { +func h(r chi.Router, path string, f handler) { handle := func(w http.ResponseWriter, r *http.Request) { res, err := f(w, r) if err != nil { - SendError(w, r, err) + // If it is not a Subsonic error, convert it to an ErrorGeneric + if _, ok := err.(subError); !ok { + err = newError(responses.ErrorGeneric, "Internal Error") + } + sendError(w, r, err) return } if res != nil { - SendResponse(w, r, res) + sendResponse(w, r, res) } } r.HandleFunc("/"+path, handle) @@ -172,7 +176,7 @@ func H(r chi.Router, path string, f Handler) { } // Add a handler that returns 410 - Gone. Used to signal that an endpoint will not be implemented -func HGone(r chi.Router, path string) { +func h410(r chi.Router, path string) { handle := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(410) _, _ = w.Write([]byte("This endpoint will not be implemented")) @@ -181,19 +185,19 @@ func HGone(r chi.Router, path string) { r.HandleFunc("/"+path+".view", handle) } -func SendError(w http.ResponseWriter, r *http.Request, err error) { +func sendError(w http.ResponseWriter, r *http.Request, err error) { response := newResponse() code := responses.ErrorGeneric - if e, ok := err.(Error); ok { + if e, ok := err.(subError); ok { code = e.code } response.Status = "fail" response.Error = &responses.Error{Code: code, Message: err.Error()} - SendResponse(w, r, response) + sendResponse(w, r, response) } -func SendResponse(w http.ResponseWriter, r *http.Request, payload *responses.Subsonic) { +func sendResponse(w http.ResponseWriter, r *http.Request, payload *responses.Subsonic) { f := utils.ParamString(r, "f") var response []byte switch f { diff --git a/server/subsonic/bookmarks.go b/server/subsonic/bookmarks.go index fe8ad4cdd..dd7f5d151 100644 --- a/server/subsonic/bookmarks.go +++ b/server/subsonic/bookmarks.go @@ -24,7 +24,7 @@ func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Reques repo := c.ds.MediaFile(r.Context()) bmks, err := repo.GetBookmarks() if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -44,7 +44,7 @@ func (c *BookmarksController) GetBookmarks(w http.ResponseWriter, r *http.Reques } func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -55,13 +55,13 @@ func (c *BookmarksController) CreateBookmark(w http.ResponseWriter, r *http.Requ repo := c.ds.MediaFile(r.Context()) err = repo.AddBookmark(id, comment, position) if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -69,7 +69,7 @@ func (c *BookmarksController) DeleteBookmark(w http.ResponseWriter, r *http.Requ repo := c.ds.MediaFile(r.Context()) err = repo.DeleteBookmark(id) if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } @@ -80,7 +80,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques repo := c.ds.PlayQueue(r.Context()) pq, err := repo.Retrieve(user.ID) if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -96,7 +96,7 @@ func (c *BookmarksController) GetPlayQueue(w http.ResponseWriter, r *http.Reques } func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - ids, err := requiredParamStrings(r, "id", "id parameter required") + ids, err := requiredParamStrings(r, "id") if err != nil { return nil, err } @@ -125,7 +125,7 @@ func (c *BookmarksController) SavePlayQueue(w http.ResponseWriter, r *http.Reque repo := c.ds.PlayQueue(r.Context()) err = repo.Store(pq) if err != nil { - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } diff --git a/server/subsonic/browsing.go b/server/subsonic/browsing.go index a5c736c59..567435828 100644 --- a/server/subsonic/browsing.go +++ b/server/subsonic/browsing.go @@ -41,13 +41,13 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i folder, err := c.ds.MediaFolder(ctx).Get(int32(mediaFolderId)) if err != nil { log.Error(ctx, "Error retrieving MediaFolder", "id", mediaFolderId, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } l, err := c.ds.Property(ctx).DefaultGet(model.PropLastScan+"-"+folder.Path, "-1") if err != nil { log.Error(ctx, "Error retrieving LastScan property", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } var indexes model.ArtistIndexes @@ -57,7 +57,7 @@ func (c *BrowsingController) getArtistIndex(ctx context.Context, mediaFolderId i indexes, err = c.ds.Artist(ctx).GetIndex() if err != nil { log.Error(ctx, "Error retrieving Indexes", err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } } @@ -116,7 +116,7 @@ func (c *BrowsingController) GetMusicDirectory(w http.ResponseWriter, r *http.Re return nil, newError(responses.ErrorDataNotFound, "Directory not found") case err != nil: log.Error(err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } var dir *responses.Directory @@ -133,7 +133,7 @@ func (c *BrowsingController) GetMusicDirectory(w http.ResponseWriter, r *http.Re if err != nil { log.Error(err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -152,13 +152,13 @@ func (c *BrowsingController) GetArtist(w http.ResponseWriter, r *http.Request) ( return nil, newError(responses.ErrorDataNotFound, "Artist not found") case err != nil: log.Error(ctx, "Error retrieving artist", "id", id, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } albums, err := c.ds.Album(ctx).FindByArtist(id) if err != nil { log.Error(ctx, "Error retrieving albums by artist", "id", id, "name", artist.Name, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -177,13 +177,13 @@ func (c *BrowsingController) GetAlbum(w http.ResponseWriter, r *http.Request) (* return nil, newError(responses.ErrorDataNotFound, "Album not found") case err != nil: log.Error(ctx, "Error retrieving album", "id", id, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } mfs, err := c.ds.MediaFile(ctx).FindByAlbum(id) if err != nil { log.Error(ctx, "Error retrieving tracks from album", "id", id, "name", album.Name, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -202,7 +202,7 @@ func (c *BrowsingController) GetSong(w http.ResponseWriter, r *http.Request) (*r return nil, newError(responses.ErrorDataNotFound, "Song not found") case err != nil: log.Error(r, "Error retrieving MediaFile", "id", id, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -216,7 +216,7 @@ func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) ( genres, err := c.ds.Genre(ctx).GetAll() if err != nil { log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } for i, g := range genres { if strings.TrimSpace(g.Name) == "" { @@ -234,7 +234,7 @@ func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) ( func (c *BrowsingController) GetArtistInfo(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -290,7 +290,7 @@ func (c *BrowsingController) GetArtistInfo2(w http.ResponseWriter, r *http.Reque func (c *BrowsingController) GetSimilarSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -323,7 +323,7 @@ func (c *BrowsingController) GetSimilarSongs2(w http.ResponseWriter, r *http.Req func (c *BrowsingController) GetTopSongs(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - artist, err := requiredParamString(r, "artist", "artist parameter required") + artist, err := requiredParamString(r, "artist") if err != nil { return nil, err } diff --git a/server/subsonic/helpers.go b/server/subsonic/helpers.go index 815f63907..a3525e282 100644 --- a/server/subsonic/helpers.go +++ b/server/subsonic/helpers.go @@ -17,43 +17,43 @@ func newResponse() *responses.Subsonic { return &responses.Subsonic{Status: "ok", Version: Version, Type: consts.AppName, ServerVersion: consts.Version()} } -func requiredParamString(r *http.Request, param string, msg string) (string, error) { +func requiredParamString(r *http.Request, param string) (string, error) { p := utils.ParamString(r, param) if p == "" { - return "", newError(responses.ErrorMissingParameter, msg) + return "", newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param) } return p, nil } -func requiredParamStrings(r *http.Request, param string, msg string) ([]string, error) { +func requiredParamStrings(r *http.Request, param string) ([]string, error) { ps := utils.ParamStrings(r, param) if len(ps) == 0 { - return nil, newError(responses.ErrorMissingParameter, msg) + return nil, newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param) } return ps, nil } -func requiredParamInt(r *http.Request, param string, msg string) (int, error) { +func requiredParamInt(r *http.Request, param string) (int, error) { p := utils.ParamString(r, param) if p == "" { - return 0, newError(responses.ErrorMissingParameter, msg) + return 0, newError(responses.ErrorMissingParameter, "required '%s' parameter is missing", param) } return utils.ParamInt(r, param, 0), nil } -type Error struct { +type subError struct { code int messages []interface{} } func newError(code int, message ...interface{}) error { - return Error{ + return subError{ code: code, messages: message, } } -func (e Error) Error() string { +func (e subError) Error() string { var msg string if len(e.messages) == 0 { msg = responses.ErrorMsg(e.code) diff --git a/server/subsonic/media_annotation.go b/server/subsonic/media_annotation.go index ded173b5a..aabf55581 100644 --- a/server/subsonic/media_annotation.go +++ b/server/subsonic/media_annotation.go @@ -24,11 +24,11 @@ func NewMediaAnnotationController(ds model.DataStore, npr core.NowPlaying) *Medi } func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - id, err := requiredParamString(r, "id", "Required id parameter is missing") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } - rating, err := requiredParamInt(r, "rating", "Required rating parameter is missing") + rating, err := requiredParamInt(r, "rating") if err != nil { return nil, err } @@ -42,7 +42,7 @@ func (c *MediaAnnotationController) SetRating(w http.ResponseWriter, r *http.Req return nil, newError(responses.ErrorDataNotFound, "ID not found") case err != nil: log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil @@ -96,7 +96,7 @@ func (c *MediaAnnotationController) Unstar(w http.ResponseWriter, r *http.Reques } func (c *MediaAnnotationController) Scrobble(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - ids, err := requiredParamStrings(r, "id", "Required id parameter is missing") + ids, err := requiredParamStrings(r, "id") if err != nil { return nil, err } @@ -228,7 +228,7 @@ func (c *MediaAnnotationController) setStar(ctx context.Context, star bool, ids return newError(responses.ErrorDataNotFound, "ID not found") case err != nil: log.Error(ctx, err) - return newError(responses.ErrorGeneric, "Internal Error") + return err } return nil } diff --git a/server/subsonic/media_retrieval.go b/server/subsonic/media_retrieval.go index ca7300cf9..8db8a3b10 100644 --- a/server/subsonic/media_retrieval.go +++ b/server/subsonic/media_retrieval.go @@ -34,7 +34,7 @@ func (c *MediaRetrievalController) GetAvatar(w http.ResponseWriter, r *http.Requ } func (c *MediaRetrievalController) GetCoverArt(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -49,7 +49,7 @@ func (c *MediaRetrievalController) GetCoverArt(w http.ResponseWriter, r *http.Re return nil, newError(responses.ErrorDataNotFound, "Artwork not found") case err != nil: log.Error(r, "Error retrieving coverArt", "id", id, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return nil, nil diff --git a/server/subsonic/media_retrieval_test.go b/server/subsonic/media_retrieval_test.go index 08bf18900..78513ec7c 100644 --- a/server/subsonic/media_retrieval_test.go +++ b/server/subsonic/media_retrieval_test.go @@ -38,7 +38,7 @@ var _ = Describe("MediaRetrievalController", func() { r := newGetRequest() _, err := controller.GetCoverArt(w, r) - Expect(err).To(MatchError("id parameter required")) + Expect(err).To(MatchError("required 'id' parameter is missing")) }) It("should fail when the file is not found", func() { @@ -54,7 +54,7 @@ var _ = Describe("MediaRetrievalController", func() { r := newGetRequest("id=34", "size=128") _, err := controller.GetCoverArt(w, r) - Expect(err).To(MatchError("Internal Error")) + Expect(err).To(MatchError("weird error")) }) }) }) diff --git a/server/subsonic/middlewares.go b/server/subsonic/middlewares.go index 3901c27dd..4c02bcb05 100644 --- a/server/subsonic/middlewares.go +++ b/server/subsonic/middlewares.go @@ -27,7 +27,7 @@ func postFormToQueryParams(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { - SendError(w, r, newError(responses.ErrorGeneric, err.Error())) + sendError(w, r, newError(responses.ErrorGeneric, err.Error())) } var parts []string for key, values := range r.Form { @@ -49,7 +49,7 @@ func checkRequiredParameters(next http.Handler) http.Handler { if utils.ParamString(r, p) == "" { msg := fmt.Sprintf(`Missing required parameter "%s"`, p) log.Warn(r, msg) - SendError(w, r, newError(responses.ErrorMissingParameter, msg)) + sendError(w, r, newError(responses.ErrorMissingParameter, msg)) return } } @@ -87,7 +87,7 @@ func authenticate(ds model.DataStore) func(next http.Handler) http.Handler { } if err != nil { - SendError(w, r, newError(responses.ErrorAuthenticationFail)) + sendError(w, r, newError(responses.ErrorAuthenticationFail)) return } diff --git a/server/subsonic/playlists.go b/server/subsonic/playlists.go index 9edb6dba6..0256c97f8 100644 --- a/server/subsonic/playlists.go +++ b/server/subsonic/playlists.go @@ -25,7 +25,7 @@ func (c *PlaylistsController) GetPlaylists(w http.ResponseWriter, r *http.Reques allPls, err := c.ds.Playlist(ctx).GetAll() if err != nil { log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal error") + return nil, err } playlists := make([]responses.Playlist, len(allPls)) for i, p := range allPls { @@ -38,7 +38,7 @@ func (c *PlaylistsController) GetPlaylists(w http.ResponseWriter, r *http.Reques func (c *PlaylistsController) GetPlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -49,7 +49,7 @@ func (c *PlaylistsController) GetPlaylist(w http.ResponseWriter, r *http.Request return nil, newError(responses.ErrorDataNotFound, "Directory not found") case err != nil: log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } response := newResponse() @@ -97,7 +97,7 @@ func (c *PlaylistsController) CreatePlaylist(w http.ResponseWriter, r *http.Requ err := c.create(r.Context(), playlistId, name, songIds) if err != nil { log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } @@ -118,7 +118,7 @@ func (c *PlaylistsController) delete(ctx context.Context, playlistId string) err } func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - id, err := requiredParamString(r, "id", "Required parameter id is missing") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -128,7 +128,7 @@ func (c *PlaylistsController) DeletePlaylist(w http.ResponseWriter, r *http.Requ } if err != nil { log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } @@ -166,7 +166,7 @@ func (p *PlaylistsController) update(ctx context.Context, playlistId string, nam } func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - playlistId, err := requiredParamString(r, "playlistId", "Required parameter playlistId is missing") + playlistId, err := requiredParamString(r, "playlistId") if err != nil { return nil, err } @@ -192,7 +192,7 @@ func (c *PlaylistsController) UpdatePlaylist(w http.ResponseWriter, r *http.Requ } if err != nil { log.Error(r, err) - return nil, newError(responses.ErrorGeneric, "Internal Error") + return nil, err } return newResponse(), nil } diff --git a/server/subsonic/searching.go b/server/subsonic/searching.go index 9fddb830c..34b57712a 100644 --- a/server/subsonic/searching.go +++ b/server/subsonic/searching.go @@ -33,7 +33,7 @@ func NewSearchingController(ds model.DataStore) *SearchingController { func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) { var err error sp := &searchParams{} - sp.query, err = requiredParamString(r, "query", "Parameter query required") + sp.query, err = requiredParamString(r, "query") if err != nil { return nil, err } diff --git a/server/subsonic/stream.go b/server/subsonic/stream.go index 8f1857767..e13692699 100644 --- a/server/subsonic/stream.go +++ b/server/subsonic/stream.go @@ -26,7 +26,7 @@ func NewStreamController(streamer core.MediaStreamer, archiver core.Archiver, ds func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } @@ -75,7 +75,7 @@ func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*resp func (c *StreamController) Download(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { ctx := r.Context() - id, err := requiredParamString(r, "id", "id parameter required") + id, err := requiredParamString(r, "id") if err != nil { return nil, err } diff --git a/server/subsonic/users.go b/server/subsonic/users.go index 57ad62bed..e70370de1 100644 --- a/server/subsonic/users.go +++ b/server/subsonic/users.go @@ -14,7 +14,7 @@ func NewUsersController() *UsersController { // TODO This is a placeholder. The real one has to read this info from a config file or the database func (c *UsersController) GetUser(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) { - user, err := requiredParamString(r, "username", "Required string parameter 'username' is not present") + user, err := requiredParamString(r, "username") if err != nil { return nil, err }