auto attempt a login refresh once if MAL returns http 400 (#32) (#2403)

This commit is contained in:
MCAxiaz 2019-12-29 14:45:58 -08:00 committed by arkon
parent f0053a2f78
commit 491d476cac
2 changed files with 25 additions and 11 deletions

View file

@ -112,11 +112,7 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
.toCompletable() .toCompletable()
} }
// Attempt to login again if cookies have been cleared but credentials are still filled fun refreshLogin() {
fun ensureLoggedIn() {
if (isAuthorized) return
if (!isLogged) throw Exception("MAL Login Credentials not found")
val username = getUsername() val username = getUsername()
val password = getPassword() val password = getPassword()
logout() logout()
@ -131,6 +127,14 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
} }
} }
// Attempt to login again if cookies have been cleared but credentials are still filled
fun ensureLoggedIn() {
if (isAuthorized) return
if (!isLogged) throw Exception("MAL Login Credentials not found")
refreshLogin()
}
override fun logout() { override fun logout() {
super.logout() super.logout()
preferences.trackToken(this).delete() preferences.trackToken(this).delete()

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.data.track.myanimelist package eu.kanade.tachiyomi.data.track.myanimelist
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.RequestBody import okhttp3.RequestBody
import okhttp3.Response import okhttp3.Response
import okio.Buffer import okio.Buffer
@ -11,18 +12,27 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
myanimelist.ensureLoggedIn() myanimelist.ensureLoggedIn()
var request = chain.request() val request = chain.request()
request.body()?.let { var response = chain.proceed(updateRequest(request))
if (response.code() == 400){
myanimelist.refreshLogin()
response = chain.proceed(updateRequest(request))
}
return response
}
private fun updateRequest(request: Request): Request {
return request.body()?.let {
val contentType = it.contentType().toString() val contentType = it.contentType().toString()
val updatedBody = when { val updatedBody = when {
contentType.contains("x-www-form-urlencoded") -> updateFormBody(it) contentType.contains("x-www-form-urlencoded") -> updateFormBody(it)
contentType.contains("json") -> updateJsonBody(it) contentType.contains("json") -> updateJsonBody(it)
else -> it else -> it
} }
request = request.newBuilder().post(updatedBody).build() request.newBuilder().post(updatedBody).build()
} } ?: request
return chain.proceed(request)
} }
private fun bodyToString(requestBody: RequestBody): String { private fun bodyToString(requestBody: RequestBody): String {