mirror of
https://github.com/mihonapp/mihon.git
synced 2024-11-07 03:07:25 +01:00
Retry the MAL request if the token is expired (#8437)
Retry the MAL request if the token expired.
This commit is contained in:
parent
34aa4eb291
commit
6d880c938a
@ -20,6 +20,51 @@ class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var t
|
|||||||
}
|
}
|
||||||
// Refresh access token if expired
|
// Refresh access token if expired
|
||||||
if (oauth != null && oauth!!.isExpired()) {
|
if (oauth != null && oauth!!.isExpired()) {
|
||||||
|
setAuth(refreshToken(chain))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oauth == null) {
|
||||||
|
throw IOException("No authentication token")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the authorization header to the original request
|
||||||
|
val authRequest = originalRequest.newBuilder()
|
||||||
|
.addHeader("Authorization", "Bearer ${oauth!!.access_token}")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val response = chain.proceed(authRequest)
|
||||||
|
val tokenIsExpired = response.headers["www-authenticate"]
|
||||||
|
?.contains("The access token expired") ?: false
|
||||||
|
|
||||||
|
// Retry the request once with a new token in case it was not already refreshed
|
||||||
|
// by the is expired check before.
|
||||||
|
if (response.code == 401 && tokenIsExpired) {
|
||||||
|
response.close()
|
||||||
|
|
||||||
|
val newToken = refreshToken(chain)
|
||||||
|
setAuth(newToken)
|
||||||
|
|
||||||
|
val newRequest = originalRequest.newBuilder()
|
||||||
|
.addHeader("Authorization", "Bearer ${newToken.access_token}")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
return chain.proceed(newRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the user authenticates with MyAnimeList for the first time. Sets the refresh token
|
||||||
|
* and the oauth object.
|
||||||
|
*/
|
||||||
|
fun setAuth(oauth: OAuth?) {
|
||||||
|
token = oauth?.access_token
|
||||||
|
this.oauth = oauth
|
||||||
|
myanimelist.saveOAuth(oauth)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun refreshToken(chain: Interceptor.Chain): OAuth {
|
||||||
val newOauth = runCatching {
|
val newOauth = runCatching {
|
||||||
val oauthResponse = chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!))
|
val oauthResponse = chain.proceed(MyAnimeListApi.refreshTokenRequest(oauth!!))
|
||||||
|
|
||||||
@ -35,27 +80,6 @@ class MyAnimeListInterceptor(private val myanimelist: MyAnimeList, private var t
|
|||||||
throw IOException("Failed to refresh the access token")
|
throw IOException("Failed to refresh the access token")
|
||||||
}
|
}
|
||||||
|
|
||||||
setAuth(newOauth.getOrNull())
|
return newOauth.getOrNull()!!
|
||||||
}
|
|
||||||
if (oauth == null) {
|
|
||||||
throw IOException("No authentication token")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the authorization header to the original request
|
|
||||||
val authRequest = originalRequest.newBuilder()
|
|
||||||
.addHeader("Authorization", "Bearer ${oauth!!.access_token}")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return chain.proceed(authRequest)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the user authenticates with MyAnimeList for the first time. Sets the refresh token
|
|
||||||
* and the oauth object.
|
|
||||||
*/
|
|
||||||
fun setAuth(oauth: OAuth?) {
|
|
||||||
token = oauth?.access_token
|
|
||||||
this.oauth = oauth
|
|
||||||
myanimelist.saveOAuth(oauth)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user