Okhttp always retrying failed connection

Viewed 6246

If I create a request and that request returns a 4xx error Retrofit/Okhttp keeps retrying the request. I have set retryOnConnectionFailure to false and set a timeout of 15 seconds but that all seems to be ignored. did I miss something?

private static OkHttpClient getClient() {
        return new OkHttpClient.Builder()
                .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE))
                .readTimeout(15, TimeUnit.SECONDS)
                .connectTimeout(15, TimeUnit.SECONDS)
                .retryOnConnectionFailure(false)
                .addInterceptor(chain -> {
                    Request request = chain.request()
                            .newBuilder()
                            .build();

                    return chain.proceed(request);
                }).build();
    }

    public static Retrofit getRetrofitClient(Gson gson){
        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(OkHttpLogger.getClient());
        if(gson != null){
            builder.addConverterFactory(GsonConverterFactory.create(gson));
        }else{
            builder.addConverterFactory(GsonConverterFactory.create());
        }

        return builder.build();
    }

I am using retrofit 2.3.0 and okhttp version 3.8.1

Edit

One thing I do see is that if I set a timeout of 5 seconds it works perfectly keeps retrying for 5 seconds then gives me a failure but if I bump it up to 10 seconds it just keeps going and finally stops around 2 minutes.

3 Answers

you can try creating your own retryOnConnectionFailure interceptor:

here is code in kotlin:

open class MaxRetryCountInterceptor(private val retryLimit: Int) : Interceptor {

    @Throws(IOException::class)
    override fun intercept(chain: Chain): Response {
        val request = chain.request()
        var response = chain.proceed(request)
        var tryCount = 0

        while (!response.isSuccessful && tryCount < retryLimit) {
            tryCount++
            response = chain.proceed(request)
        }

        return response
    }
}

response.isSuccessful is successful only when code is between 200..300

Related