Неустранимое исключение: OkHttp Dispatcher происходит в OkHttp Interceptor для обновления OAuth-токенов - PullRequest
0 голосов
/ 26 января 2020

Я использую перехватчик OkHttp с Retrofit2 для обновления просроченных токенов OAuth2.0 и выполнения запросов GET.

Вот код для перехватчика:

import androidx.annotation.NonNull;
import org.metabrainz.mobile.presentation.features.login.LoginSharedPreferences;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

class HeaderInterceptor implements Interceptor {

@NonNull
@Override
public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();
    Request request;

    // Do not add Authorization Header if request is sent to OAuth endpoint except to fetch userinfo
    if (original.url().encodedPath().contains("oauth2")) {
        if (original.url().encodedPath().contains("userinfo"))
            request = original.newBuilder()
                    .header("User-agent", "MusicBrainzAndroid/Test (kartikohri13@gmail.com)")
                    .addHeader("Accept", "application/json")
                    .header("Authorization", " Bearer " + getAccessToken()).build();
        else return chain.proceed(original);
    }
    // Check if user is logged in and add authorization header accordingly
    else {
        if (checkLoginStatus()) {
            request = original.newBuilder()
                    .header("User-agent", "MusicBrainzAndroid/Test (kartikohri13@gmail.com)")
                    .addHeader("Accept", "application/json")
                    .header("Authorization", " Bearer " + getAccessToken()).build();
        } else {
            request = original.newBuilder()
                    .header("User-agent", "MusicBrainzAndroid/Test (kartikohri13@gmail.com)")
                    .addHeader("Accept", "application/json").build();
        }
    }

    return chain.proceed(request);
}

private boolean checkLoginStatus() {
    return LoginSharedPreferences.getLoginStatus()
            == LoginSharedPreferences.STATUS_LOGGED_IN;
}

private String getAccessToken() {
    return LoginSharedPreferences.getAccessToken();
}
}

Однако, следующее ошибка возникает каждый раз, и приложение вылетает.

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: org.metabrainz.android, PID: 7295
java.lang.IllegalStateException: closed
    at okio.RealBufferedSource.request(RealBufferedSource.kt:204)
    at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.kt:245)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
    at org.metabrainz.mobile.data.sources.api.HeaderInterceptor.intercept(HeaderInterceptor.java:44)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
    at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)

Ошибка вызывается в строке 44 в файле, который return chain.proceed(request);.

Я нашел много ответов в inte rnet, чтобы устранить ошибку, но все они связаны с потреблением ResponseBody дважды. Я не думаю, что это так.

Как я могу решить проблему и какова причина проблемы?

...