I want to change response from server to 423 -> 401, and then call refreshToken by using Authenticator.
The method is called if response code is 401
But why the method Authenticator.authenticate(Route route, Response response)
is not called in my case?
OkHttpClient
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//Adding token to request
Request request = chain.request();
Request.Builder builder = request.newBuilder();
builder.header("Authorization", "access_token");
return chain.proceed(builder.build());
}
})
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//changing response code from server 423 -> 401
Request request = chain.request();
Response response = chain.proceed(request);
if (response.code() == 423)
return response.newBuilder().code(401).build();
return response;
}
})
.authenticator(new Authenticator() {
//THE METHOD IS NOT CALLED, WHY?
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Refresh access_token using a synchronous api request
String newAccessToken = refreshToken();
saveNewToken(newAccessToken)
// Add new header to rejected request and retry it
return response.request().newBuilder()
.header("Authorization", newAccessToken)
.build();
}
})
.build();
Retrofit interface:
ApiService mApiService = new Retrofit.Builder()
.baseUrl(serverHostUrl)
.client(httpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(ApiService.class);