Kaynağa Gözat

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

MCAxiaz 5 yıl önce
ebeveyn
işleme
491d476cac

+ 9 - 5
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt

@@ -112,11 +112,7 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
                 .toCompletable()
     }
 
-    // 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")
-
+    fun refreshLogin() {
         val username = getUsername()
         val password = getPassword()
         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() {
         super.logout()
         preferences.trackToken(this).delete()

+ 16 - 6
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt

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