Merge pull request #136 from ultrasonic/error-parser-stability-improvments
Error parser stability improvments
This commit is contained in:
commit
d2f292852d
|
@ -113,6 +113,42 @@ class SubsonicApiErrorsTest : SubsonicAPIClientTest() {
|
||||||
response.assertError(RequestedDataWasNotFound)
|
response.assertError(RequestedDataWasNotFound)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should parse error with reversed tokens order`() {
|
||||||
|
mockWebServerRule.enqueueResponse("reversed_tokens_generic_error.json")
|
||||||
|
|
||||||
|
val response = client.api.ping().execute()
|
||||||
|
|
||||||
|
response.assertError(Generic("Video streaming not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should parse error if json contains error first before other fields`() {
|
||||||
|
mockWebServerRule.enqueueResponse("error_first_generic_error.json")
|
||||||
|
|
||||||
|
val response = client.api.ping().execute()
|
||||||
|
|
||||||
|
response.assertError(Generic("Video streaming not supported"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should parse error if json doesn't contain message field`() {
|
||||||
|
mockWebServerRule.enqueueResponse("without_message_generic_error.json")
|
||||||
|
|
||||||
|
val response = client.api.ping().execute()
|
||||||
|
|
||||||
|
response.assertError(Generic(""))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should parse error if error json contains additional object`() {
|
||||||
|
mockWebServerRule.enqueueResponse("with_additional_json_object_generic_error.json")
|
||||||
|
|
||||||
|
val response = client.api.ping().execute()
|
||||||
|
|
||||||
|
response.assertError(Generic(""))
|
||||||
|
}
|
||||||
|
|
||||||
private fun Response<SubsonicResponse>.assertError(expectedError: SubsonicError) =
|
private fun Response<SubsonicResponse>.assertError(expectedError: SubsonicError) =
|
||||||
with(body()) {
|
with(body()) {
|
||||||
error `should not be` null
|
error `should not be` null
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"subsonic-response": {
|
||||||
|
"error": {
|
||||||
|
"message": "Video streaming not supported",
|
||||||
|
"code": 0
|
||||||
|
},
|
||||||
|
"version": "1.8.0",
|
||||||
|
"status": "failed"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"subsonic-response": {
|
||||||
|
"status": "failed",
|
||||||
|
"version": "1.8.0",
|
||||||
|
"error": {
|
||||||
|
"message": "Video streaming not supported",
|
||||||
|
"code": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"subsonic-response": {
|
||||||
|
"status": "failed",
|
||||||
|
"version": "1.8.0",
|
||||||
|
"error": {
|
||||||
|
"code": 0,
|
||||||
|
"unicorn" : {
|
||||||
|
"code": 41,
|
||||||
|
"message": "Unicorns doesn't exist!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"subsonic-response": {
|
||||||
|
"status": "failed",
|
||||||
|
"version": "1.8.0",
|
||||||
|
"error": {
|
||||||
|
"code": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
package org.moire.ultrasonic.api.subsonic
|
package org.moire.ultrasonic.api.subsonic
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonParser
|
import com.fasterxml.jackson.core.JsonParser
|
||||||
|
import com.fasterxml.jackson.core.JsonToken.END_OBJECT
|
||||||
|
import com.fasterxml.jackson.core.JsonToken.START_OBJECT
|
||||||
import com.fasterxml.jackson.databind.DeserializationContext
|
import com.fasterxml.jackson.databind.DeserializationContext
|
||||||
import com.fasterxml.jackson.databind.JsonDeserializer
|
import com.fasterxml.jackson.databind.JsonDeserializer
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||||
|
@ -36,13 +38,17 @@ sealed class SubsonicError(val code: Int) {
|
||||||
|
|
||||||
class SubsonicErrorDeserializer : JsonDeserializer<SubsonicError>() {
|
class SubsonicErrorDeserializer : JsonDeserializer<SubsonicError>() {
|
||||||
override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): SubsonicError {
|
override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): SubsonicError {
|
||||||
p.nextToken() // { -> "code"
|
var code = -1
|
||||||
p.nextToken() // "code" -> codeValue
|
var message = ""
|
||||||
val code = p.valueAsInt
|
while (p.nextToken() != END_OBJECT) {
|
||||||
p.nextToken() // codeValue -> "message"
|
when {
|
||||||
p.nextToken() // "message" -> messageValue
|
p.currentToken == START_OBJECT -> p.skipChildren()
|
||||||
val message = p.text
|
"code".equals(p.currentName, ignoreCase = true) ->
|
||||||
p.nextToken() // value -> }
|
code = p.nextIntValue(-1)
|
||||||
|
"message".equals(p.currentName, ignoreCase = true) ->
|
||||||
|
message = p.nextTextValue()
|
||||||
|
}
|
||||||
|
}
|
||||||
return getError(code, message)
|
return getError(code, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,15 @@ import org.moire.ultrasonic.service.SubsonicRESTException
|
||||||
*/
|
*/
|
||||||
fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String =
|
fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String =
|
||||||
when (error) {
|
when (error) {
|
||||||
is Generic -> context
|
is Generic -> {
|
||||||
.getString(R.string.api_subsonic_generic, (error as Generic).message)
|
val message = (error as Generic).message
|
||||||
|
val errorMessage = if (message == "") {
|
||||||
|
context.getString(R.string.api_subsonic_generic_no_message)
|
||||||
|
} else {
|
||||||
|
message
|
||||||
|
}
|
||||||
|
context.getString(R.string.api_subsonic_generic, errorMessage)
|
||||||
|
}
|
||||||
RequiredParamMissing -> context.getString(R.string.api_subsonic_param_missing)
|
RequiredParamMissing -> context.getString(R.string.api_subsonic_param_missing)
|
||||||
IncompatibleClientProtocolVersion -> context
|
IncompatibleClientProtocolVersion -> context
|
||||||
.getString(R.string.api_subsonic_upgrade_client)
|
.getString(R.string.api_subsonic_upgrade_client)
|
||||||
|
|
|
@ -424,6 +424,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Error genérico de api: %1$s</string>
|
<string name="api.subsonic.generic">Error genérico de api: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">ningún mensaje dado desde el servidor</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">La autenticación por token no es compatible con usuarios LDAP.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">La autenticación por token no es compatible con usuarios LDAP.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Nombre de usuario o contraseña incorrectos.</string>
|
<string name="api.subsonic.not_authenticated">Nombre de usuario o contraseña incorrectos.</string>
|
||||||
<string name="api.subsonic.not_authorized">No autorizado. Comprueba los permisos de usuario en el servidor de Subsonic.</string>
|
<string name="api.subsonic.not_authorized">No autorizado. Comprueba los permisos de usuario en el servidor de Subsonic.</string>
|
||||||
|
|
|
@ -424,6 +424,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Erreur api générique: %1$s</string>
|
<string name="api.subsonic.generic">Erreur api générique: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">aucun message donné par le serveur</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">L\'authentification par jeton n\'est pas prise en charge pour les utilisateurs LDAP.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">L\'authentification par jeton n\'est pas prise en charge pour les utilisateurs LDAP.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
|
<string name="api.subsonic.not_authenticated">Mauvais nom d\'usager ou mot de passe.</string>
|
||||||
<string name="api.subsonic.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
|
<string name="api.subsonic.not_authorized">Non autorisé. Vérifiez les permissions de l\'utilisateur dans le serveur Subsonic.</string>
|
||||||
|
|
|
@ -424,6 +424,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Általános api hiba: %1$s</string>
|
<string name="api.subsonic.generic">Általános api hiba: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">nincs üzenet a szerverről</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">Az LDAP-felhasználók számára nem támogatott a token-hitelesítés.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">Az LDAP-felhasználók számára nem támogatott a token-hitelesítés.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
|
<string name="api.subsonic.not_authenticated">Hibás felhasználónév vagy jelszó!</string>
|
||||||
<string name="api.subsonic.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
|
<string name="api.subsonic.not_authorized">Nem engedélyezett! Ellenőrizze a felhasználó jogosultságait a Subsonic kiszolgálón!</string>
|
||||||
|
|
|
@ -424,6 +424,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Erro de api genérico: %1$s</string>
|
<string name="api.subsonic.generic">Erro de api genérico: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">nenhuma mensagem fornecida pelo servidor</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
|
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
|
||||||
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
|
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
|
||||||
|
|
|
@ -424,6 +424,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Erro de api genérico: %1$s</string>
|
<string name="api.subsonic.generic">Erro de api genérico: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">nenhuma mensagem fornecida pelo servidor</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">A autenticação por token não é suportada para usuários LDAP.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
|
<string name="api.subsonic.not_authenticated">Login ou senha errada.</string>
|
||||||
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
|
<string name="api.subsonic.not_authorized">Não autorizado. Verifique as permissões do usuário no servidor Subsonic.</string>
|
||||||
|
|
|
@ -426,6 +426,7 @@
|
||||||
|
|
||||||
<!-- Subsonic api errors -->
|
<!-- Subsonic api errors -->
|
||||||
<string name="api.subsonic.generic">Generic api error: %1$s</string>
|
<string name="api.subsonic.generic">Generic api error: %1$s</string>
|
||||||
|
<string name="api.subsonic.generic.no.message">no message given from server</string>
|
||||||
<string name="api.subsonic.token_auth_not_supported_for_ldap">Authentication by token is not supported for LDAP users.</string>
|
<string name="api.subsonic.token_auth_not_supported_for_ldap">Authentication by token is not supported for LDAP users.</string>
|
||||||
<string name="api.subsonic.not_authenticated">Wrong username or password.</string>
|
<string name="api.subsonic.not_authenticated">Wrong username or password.</string>
|
||||||
<string name="api.subsonic.not_authorized">Not authorized. Check user permissions in Subsonic server.</string>
|
<string name="api.subsonic.not_authorized">Not authorized. Check user permissions in Subsonic server.</string>
|
||||||
|
|
Loading…
Reference in New Issue