Я использую перехватчик 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
дважды. Я не думаю, что это так.
Как я могу решить проблему и какова причина проблемы?