Okhttp: Regression in Exchange in 3.14

Created on 22 Mar 2019  ·  9Comments  ·  Source: square/okhttp

Hey, folks - I think I'm running into something that appears to be a regression in 3.14 around the new exchange mechanism. I can reproduce this 100% of the time in my app by creating a specific scenario.

Here's the basic setup. We have an interceptor that does a lot of things for us, including setting headers and handling retries for auth errors. Here's a simplified version of the code, eliding a lot of details around how the retries are triggered:

@Override
public Response intercept(Chain chain) throws IOException {
  Request originalRequest = chain.request();
  Request.Builder builder = originalRequest.newBuilder();
  // Add headers/etc here.
  Request request = builder.build();
  Response response = chain.proceed(request);

  if (isError(response)) {
    // Grab a new auth token, etc.
    response = chain.proceed(retry);
    return response;
  }
}

In 3.13.1, this seems to work just fine. In 3.14.0, this crashes with the following error:

03-22 11:52:21.889 E/AndroidRuntime(10135): java.lang.IllegalStateException: exchange != null
03-22 11:52:21.889 E/AndroidRuntime(10135):     at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:159)
03-22 11:52:21.889 E/AndroidRuntime(10135):     at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41)
...

It doesn't seem to matter if you mutate the request or not. Even just using (as above) a newly built version of the request produces the same behavior.

Any ideas what's happening here? I'm going to revert our library back to 3.13 for now to work around this, but I'm curious what could be causing this.

bug

Most helpful comment

Yup, looks like the same bug - I'd bet that if you add origResponse.close() before the val newResponse line in the auth interceptor, the problem will disappear. :-)

All 9 comments

Good find. My guess is that we're crashing because the first response body is still active. Can you see if closing it fixes things?

Ah, good callout! It looks like closing the previous response before retrying does fix the crash on 3.14. I was able to change my code to the follow and re-run the same scenarios with no crashes:

@Override
public Response intercept(Chain chain) throws IOException {
  Request originalRequest = chain.request();
  Request.Builder builder = originalRequest.newBuilder();
  // Add headers/etc here.
  Request request = builder.build();
  Response response = chain.proceed(request);

  if (isError(response)) {
    // Grab a new auth token, etc.
    response.close();
    Request retry = request.newBuilder().build();
    response = chain.proceed(retry);
    return response;
  }
}

That definitely gets me unblocked, but it's interesting that this changed in the new version. Maybe something to note in the documentation for the future?

Thanks for the rapid response! (And of course, for all the work on maintaining this core library. :-) )

Yeah, my assumption is that previously you would have had two response bodies open concurrently for a single call.

We should fix the exception to be more obvious about what the problem is.

We're also seeing this exception even though we're just using Retrofit + RxJava2CallAdapter. 🤔

@zhuinden share the full stack trace?

2019-03-25 17:55:04.086 32025-32358/.beta D/OkHttp: <-- HTTP FAILED: java.lang.IllegalStateException: exchange != null
2019-03-25 17:55:04.088 32025-32025.beta W/System.err: java.lang.IllegalStateException: exchange != null
2019-03-25 17:55:04.088 32025-32025/.beta W/System.err:     at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:159)
2019-03-25 17:55:04.088 32025-32025/.beta W/System.err:     at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41)
2019-03-25 17:55:04.088 32025-32025/.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-25 17:55:04.088 32025-32025/.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-25 17:55:04.088 32025-32025/.beta W/System.err:     at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)

This is as much as I saved of it if that's sufficient, but I'll reproduce it again if needed

More please! I want to see which interceptors participated.

2019-03-28 23:33:51.682 7414-7414/com.acme.acme4.beta W/System.err: java.lang.IllegalStateException: exchange != null
2019-03-28 23:33:51.682 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:159)
2019-03-28 23:33:51.682 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41)
2019-03-28 23:33:51.682 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.682 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at com.acme.acme4.backend.LocalizationInterceptor.intercept(LocalizationInterceptor.kt:22)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.683 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at com.acme.acme4.backend.AuthenticationInterceptor.intercept(AuthenticationInterceptor.kt:28)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:223)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:221)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.RealCall.execute(RealCall.java:81)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:186)
2019-03-28 23:33:51.684 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12268)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12268)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleToFlowable.subscribeActual(SingleToFlowable.java:37)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14827)
2019-03-28 23:33:51.685 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14774)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableRetryBiPredicate$RetryBiSubscriber.subscribeNext(FlowableRetryBiPredicate.java:113)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableRetryBiPredicate.subscribeActual(FlowableRetryBiPredicate.java:40)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14827)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableSingleSingle.subscribeActual(FlowableSingleSingle.java:39)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-03-28 23:33:51.686 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2019-03-28 23:33:51.687 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2019-03-28 23:33:51.687 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)

Also worth noting the code for our interceptor which may or may not be relevant:

class LocalizationInterceptor : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        return if (chain.request().method() == "GET") {
            val url = chain.request().url()
                .newBuilder()
                .addQueryParameter("locale", App.locale.language ?: "")
                .build()
            val request = chain.request().newBuilder().url(url).build()
            chain.proceed(request)
        } else {
            chain.proceed(chain.request())
        }
    }
}

and

class AuthenticationInterceptor : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        var authIdToken = SessionManager.credentials
        val originalRequest = chain.request()
        val authenticationRequest = originalRequest.newBuilder()
            .header("Authorization", "Bearer $authIdToken")
            .build()

        val origResponse = chain.proceed(authenticationRequest)
        if (origResponse.code() == 401 || origResponse.code() == 403) {
            return if (SessionManager.refreshToken()) {
                authIdToken = SessionManager.credentials

                val newAuthenticationRequest = originalRequest.newBuilder()
                    .header("Authorization", "Bearer $authIdToken")
                    .build()

                val newResponse = chain.proceed(newAuthenticationRequest)

                newResponse
            } else {
                origResponse
            }
        } else {
            return origResponse
        }
    }
}

where SessionManager.refreshToken() is

    fun refreshToken(): Boolean {
        val tokenTask = App.firebaseAuth.currentUser?.getIdToken(true)
        if (tokenTask != null) {
            try {
                val result = Tasks.await(tokenTask)
                credentials = result.token
                return true
            } catch (e: Exception) {
                logExceptionApp(e)
                return false
            }
        }
        return false
    }

My wager goes for the auth interceptor.



Attempt to retry gave me this:

2019-03-28 23:37:52.911 7414-7414/com.acme.acme4.beta W/System.err: java.net.ProtocolException: Unexpected status line: 
2019-03-28 23:37:52.911 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.StatusLine.parse(StatusLine.java:69)
2019-03-28 23:37:52.911 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http1.Http1ExchangeCodec.readResponseHeaders(Http1ExchangeCodec.java:213)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.java:115)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:94)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:43)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.912 7414-7414/com.acme.acme4.beta W/System.err:     at com.acme.acme4.backend.LocalizationInterceptor.intercept(LocalizationInterceptor.kt:22)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at com.acme.acme4.backend.AuthenticationInterceptor.intercept(AuthenticationInterceptor.kt:19)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:223)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
2019-03-28 23:37:52.913 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:221)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at okhttp3.RealCall.execute(RealCall.java:81)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:186)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12268)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:12268)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleToFlowable.subscribeActual(SingleToFlowable.java:37)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14827)
2019-03-28 23:37:52.914 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14774)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableRetryBiPredicate$RetryBiSubscriber.subscribeNext(FlowableRetryBiPredicate.java:113)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableRetryBiPredicate.subscribeActual(FlowableRetryBiPredicate.java:40)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:14827)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.flowable.FlowableSingleSingle.subscribeActual(FlowableSingleSingle.java:39)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Single.subscribe(Single.java:3603)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2019-03-28 23:37:52.915 7414-7414/com.acme.acme4.beta W/System.err:     at java.lang.Thread.run(Thread.java:764)

Yup, looks like the same bug - I'd bet that if you add origResponse.close() before the val newResponse line in the auth interceptor, the problem will disappear. :-)

Was this page helpful?
0 / 5 - 0 ratings