TooManyEduardos
TooManyEduardos

Reputation: 4404

OkHttp token interceptor retries forever

I'm making an OkHttp interceptor so it retry to sign in when any end point returns a 401 error, but the interceptor is looping forever.

I've also tried to add a counter, but the counter resets itself every time.

Here's my code:

object Service {

    private fun getOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
                .addInterceptor(getLoggingInterceptor())
                .addInterceptor(NetworkInterceptor())
                .build()
    }

    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(getOkHttpClient())
                .baseUrl(getBaseUrl())
                .build()
    }
}

class NetworkInterceptor: Interceptor {
    var counter = 0

    override fun intercept(chain: Interceptor.Chain): Response? {
        val originalResponse = chain.proceed(chain.request())

        if (!originalResponse.isSuccessful && originalResponse.code() == 401) {
            Log.e("NetworkInterceptor", "Network error 401. Counter = $counter")
            counter++

            val refreshedToken = refreshToken()
            Log.e("NetworkInterceptor", "refreshedToken = $refreshedToken")
        }


        return originalResponse
    }

    private fun refreshToken(): String {
        val context = MyApp.appContext
        val preferencesUtil = SharePreferencesUtils(context)
        val username = preferencesUtil.getUsername()
        val password = preferencesUtil.getPassword()
        val login = AuthService().loginSync(username, password).execute()
        return login.body()?.access_token!!
    }
}

I have tried this with an Auth call being an RxJava Single, and a regular synchronous Call<>

In each case, the call happens forever, the 401 gets returned forever, and the counter always stays at 0.

Any ideas on what I'm missing or doing wrong?

Thank you very much!

Upvotes: 0

Views: 1548

Answers (1)

ibraizQ9
ibraizQ9

Reputation: 53

Add as a NetworkInterceptor using

addNetworkInterceptor(NetworkInterceptor)

refer to this link for further clarification: https://github.com/square/okhttp/wiki/Interceptors

Upvotes: 1

Related Questions