Home > Net >  Why is my interceptor being retried repeatedly after a 401 response?
Why is my interceptor being retried repeatedly after a 401 response?

Time:02-10

I'm trying to redirect the user to the login activity when a 401 happens inside my interceptor. Everything works as expected, except the interceptor is ran repeatedly even after being redirected to the login activity which is causing activities to be created on top of each other causing bad UI.

Is there any way I can disable any further calls for this interceptor once a 401 happens?

fun authService(
            tokenStore: TokenStore,
            manager: WorkManager,
            context: Context
        ): Service {

            val httpClient = OkHttpClient.Builder().apply {

                addInterceptor {

                    val token = runBlocking {
                        tokenStore.getToken().first()?.token
                    }

                    val response = it.proceed(
                        it.request().newBuilder()
                            .addHeader(HEADER_AUTH, "Bearer $token")
                            .addHeader(HEADER_ACCEPT, "application/json").build()
                    )

                    if (response.code == 401) {
                        GlobalScope.launch {
                            signout(
                                tokenStore,
                                manager,
                                context
                            )
                        }
                        context.startActivity(
                            Intent(context, LoginActivity::class.java).setFlags(
                                Intent.FLAG_ACTIVITY_NEW_TASK
                            )
                        )
                    }
                    response
                }
                addInterceptor(HttpLoggingInterceptor().apply {
                    level = HttpLoggingInterceptor.Level.BODY
                })
            }.build()

            return Retrofit.Builder()
                .baseUrl(BuildConfig.URL_API)
                .addConverterFactory(DataConverterFactory())
                .addConverterFactory(NonStrictJsonSerializer.serializer.asConverterFactory("application/json".toMediaType()))
                .client(httpClient)
                .build()
                .create(Service::class.java)
        }
    }

CodePudding user response:

  •  Tags:  
  • Related