Do not log not implemented commands as errors, fixes #11

This commit is contained in:
emeric
2020-01-24 14:05:58 +01:00
parent c69ce99bd1
commit cb59b09157
2 changed files with 116 additions and 26 deletions
+111 -26
View File
@@ -1656,6 +1656,13 @@ handleUpdatePlaylistRequest(RequestContext& context)
return Response::createOkResponse(); return Response::createOkResponse();
} }
static
Response
handleNotImplemented(RequestContext&)
{
throw NotImplementedGenericError {};
}
static static
Av::Encoding Av::Encoding
userTranscodeFormatToAvEncoding(AudioFormat format) userTranscodeFormatToAvEncoding(AudioFormat format)
@@ -1796,49 +1803,118 @@ struct RequestEntryPointInfo
bool mustBeAdmin; bool mustBeAdmin;
}; };
static std::map<std::string, RequestEntryPointInfo> requestEntryPoints static std::unordered_map<std::string, RequestEntryPointInfo> requestEntryPoints
{ {
{"changePassword", {handleChangePassword, false}}, // System
{"createPlaylist", {handleCreatePlaylistRequest, false}}, {"ping", {handlePingRequest, false}},
{"createUser", {handleCreateUserRequest, true}}, {"getLicense", {handleGetLicenseRequest, false}},
{"deletePlaylist", {handleDeletePlaylistRequest, false}},
{"deleteUser", {handleDeleteUserRequest, true}}, // Browsing
{"getAlbumList", {handleGetAlbumListRequest, false}}, {"getMusicFolders", {handleGetMusicFoldersRequest, false}},
{"getAlbumList2", {handleGetAlbumList2Request, false}}, {"getIndexes", {handleGetIndexesRequest, false}},
{"getAlbum", {handleGetAlbumRequest, false}}, {"getMusicDirectory", {handleGetMusicDirectoryRequest, false}},
{"getGenres", {handleGetGenresRequest, false}},
{"getArtists", {handleGetArtistsRequest, false}},
{"getArtist", {handleGetArtistRequest, false}}, {"getArtist", {handleGetArtistRequest, false}},
{"getAlbum", {handleGetAlbumRequest, false}},
{"getSong", {handleNotImplemented, false}},
{"getVideos", {handleNotImplemented, false}},
{"getArtistInfo", {handleGetArtistInfoRequest, false}}, {"getArtistInfo", {handleGetArtistInfoRequest, false}},
{"getArtistInfo2", {handleGetArtistInfo2Request, false}}, {"getArtistInfo2", {handleGetArtistInfo2Request, false}},
{"getArtists", {handleGetArtistsRequest, false}}, {"getAlbumInfo", {handleNotImplemented, false}},
{"getGenres", {handleGetGenresRequest, false}}, {"getAlbumInfo2", {handleNotImplemented, false}},
{"getIndexes", {handleGetIndexesRequest, false}},
{"getLicense", {handleGetLicenseRequest, false}},
{"getMusicDirectory", {handleGetMusicDirectoryRequest, false}},
{"getMusicFolders", {handleGetMusicFoldersRequest, false}},
{"getRandomSongs", {handleGetRandomSongsRequest, false}},
{"getSimilarSongs", {handleGetSimilarSongsRequest, false}}, {"getSimilarSongs", {handleGetSimilarSongsRequest, false}},
{"getSimilarSongs2", {handleGetSimilarSongs2Request, false}}, {"getSimilarSongs2", {handleGetSimilarSongs2Request, false}},
{"getTopSongs", {handleNotImplemented, false}},
// Album/song lists
{"getAlbumList", {handleGetAlbumListRequest, false}},
{"getAlbumList2", {handleGetAlbumList2Request, false}},
{"getRandomSongs", {handleGetRandomSongsRequest, false}},
{"getSongsByGenre", {handleGetSongsByGenreRequest, false}},
{"getNowPlaying", {handleNotImplemented, false}},
{"getStarred", {handleGetStarredRequest, false}}, {"getStarred", {handleGetStarredRequest, false}},
{"getStarred2", {handleGetStarred2Request, false}}, {"getStarred2", {handleGetStarred2Request, false}},
{"getPlaylist", {handleGetPlaylistRequest, false}},
{"getPlaylists", {handleGetPlaylistsRequest, false}}, // Searching
{"getSongsByGenre", {handleGetSongsByGenreRequest, false}}, {"search", {handleNotImplemented, false}},
{"getUser", {handleGetUserRequest, false}},
{"getUsers", {handleGetUsersRequest, true}},
{"ping", {handlePingRequest, false}},
{"search2", {handleSearch2Request, false}}, {"search2", {handleSearch2Request, false}},
{"search3", {handleSearch3Request, false}}, {"search3", {handleSearch3Request, false}},
// Playlists
{"getPlaylists", {handleGetPlaylistsRequest, false}},
{"getPlaylist", {handleGetPlaylistRequest, false}},
{"createPlaylist", {handleCreatePlaylistRequest, false}},
{"updatePlaylist", {handleUpdatePlaylistRequest, false}},
{"deletePlaylist", {handleDeletePlaylistRequest, false}},
// Media retrieval
{"download", {handleNotImplemented, false}},
{"hls", {handleNotImplemented, false}},
{"getCaptions", {handleNotImplemented, false}},
{"getLyrics", {handleNotImplemented, false}},
{"getAvatar", {handleNotImplemented, false}},
// Media annotation
{"star", {handleStarRequest, false}}, {"star", {handleStarRequest, false}},
{"unstar", {handleUnstarRequest, false}}, {"unstar", {handleUnstarRequest, false}},
{"setRating", {handleNotImplemented, false}},
{"scrobble", {handleNotImplemented, false}},
// Sharing
{"getShares", {handleNotImplemented, false}},
{"createShares", {handleNotImplemented, false}},
{"updateShare", {handleNotImplemented, false}},
{"deleteShare", {handleNotImplemented, false}},
// Podcast
{"getPodcasts", {handleNotImplemented, false}},
{"getNewestPodcasts", {handleNotImplemented, false}},
{"refreshPodcasts", {handleNotImplemented, false}},
{"createPodcastChannel", {handleNotImplemented, false}},
{"deletePodcastChannel", {handleNotImplemented, false}},
{"deletePodcastEpisode", {handleNotImplemented, false}},
{"downloadPodcastEpisode", {handleNotImplemented, false}},
// Jukebox
{"jukeboxControl", {handleNotImplemented, false}},
// Internet radio
{"getInternetRadioStations", {handleNotImplemented, false}},
{"createInternetRadioStation", {handleNotImplemented, false}},
{"updateInternetRadioStation", {handleNotImplemented, false}},
{"deleteInternetRadioStation", {handleNotImplemented, false}},
// Chat
{"getChatMessages", {handleNotImplemented, false}},
{"addChatMessages", {handleNotImplemented, false}},
// User management
{"getUser", {handleGetUserRequest, false}},
{"getUsers", {handleGetUsersRequest, true}},
{"createUser", {handleCreateUserRequest, true}},
{"updateUser", {handleUpdateUserRequest, true}}, {"updateUser", {handleUpdateUserRequest, true}},
{"updatePlaylist", {handleUpdatePlaylistRequest, false}}, {"deleteUser", {handleDeleteUserRequest, true}},
{"changePassword", {handleChangePassword, false}},
// Bookmarks
{"getBookmarks", {handleNotImplemented, false}},
{"createBookmarks", {handleNotImplemented, false}},
{"deleteBookmarks", {handleNotImplemented, false}},
{"getPlayQueue", {handleNotImplemented, false}},
{"savePlayQueue", {handleNotImplemented, false}},
// Media library scanning
{"getScanStatus", {handleNotImplemented, true}},
{"startScan", {handleNotImplemented, true}},
}; };
using MediaRetrievalHandlerFunc = std::function<MediaRetrievalResult(RequestContext&, Wt::Http::ResponseContinuation*)>; using MediaRetrievalHandlerFunc = std::function<MediaRetrievalResult(RequestContext&, Wt::Http::ResponseContinuation*)>;
static std::map<std::string, MediaRetrievalHandlerFunc> mediaRetrievalHandlers static std::unordered_map<std::string, MediaRetrievalHandlerFunc> mediaRetrievalHandlers
{ {
{"stream", handleStream}, // Media retrieval
{"getCoverArt", handleGetCoverArt}, {"getCoverArt", handleGetCoverArt},
{"stream", handleStream},
}; };
void void
@@ -1930,7 +2006,16 @@ SubsonicResource::handleRequest(const Wt::Http::Request &request, Wt::Http::Resp
} }
LMS_LOG(API_SUBSONIC, ERROR) << "Unhandled command '" << requestPath << "'"; LMS_LOG(API_SUBSONIC, ERROR) << "Unhandled command '" << requestPath << "'";
throw NotImplementedGenericError {}; throw UnknownEntryPointGenericError {};
}
catch (const NotImplementedGenericError& e)
{
LMS_LOG(API_SUBSONIC, INFO) << "Command '" << requestPath << "'"
<< ", params = [" << parameterMapToDebugString(request.getParameterMap()) << "]"
<< ", code = " << static_cast<int>(e.getCode()) << ", msg = '" << static_cast<const Error&>(e).getMessage() << "'";
Response resp {Response::createFailedResponse(e)};
resp.write(response.out(), format);
response.setMimeType(ResponseFormatToMimeType(format));
} }
catch (const Error& e) catch (const Error& e)
{ {
+5
View File
@@ -135,6 +135,11 @@ class NotImplementedGenericError : public GenericError
std::string getMessage() const override { return "Not implemented"; } std::string getMessage() const override { return "Not implemented"; }
}; };
class UnknownEntryPointGenericError : public GenericError
{
std::string getMessage() const override { return "Unknown API method"; }
};
class PasswordTooWeakGenericError : public GenericError class PasswordTooWeakGenericError : public GenericError
{ {
std::string getMessage() const override { return "Password too weak"; } std::string getMessage() const override { return "Password too weak"; }