我正在使用retrofit2开发Android应用程序。 gzip有问题,这里是异常堆栈。 我不知道异常究竟发生在哪里。任何建议表示赞赏。感谢。
Unknown exception
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.java:64)
at okio.GzipSource.consumeHeader(GzipSource.java:114)
at okio.GzipSource.read(GzipSource.java:73)
at okio.RealBufferedSource.request(RealBufferedSource.java:71)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:225)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
at okhttp3.RealCall.execute(RealCall.java:57)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
at com.hello.de.aloha.domain.interactor.RetrofitServerInteraction.callVerifyOauthToken(RetrofitServerInteraction.java:424)
at com.hello.de.aloha.domain.security.SecurityHandshake.validateOAuthToken(SecurityHandshake.java:178)
at com.hello.de.aloha.domain.security.SecurityHandshake.requestOAuthToken(SecurityHandshake.java:150)
at com.hello.de.aloha.domain.security.SecurityHandshake.authenticate(SecurityHandshake.java:122)
at com.hello.de.aloha.domain.security.SecurityHandshake.challenge(SecurityHandshake.java:70)
at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.determineNewToken(SecurityInterceptor.java:152)
at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.intercept(SecurityInterceptor.java:89)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at com.hello.de.aloha.domain.interceptor.SendCookieInterceptor.intercept(SendCookieInterceptor.java:46)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at com.hello.de.aloha.domain.interceptor.ReceiveCookiesInterceptor.intercept(ReceiveCookiesInterceptor.java:43)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at com.hello.de.aloha.domain.interceptor.HttpParamInterceptor.intercept(HttpParamInterceptor.java:75)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:203)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
at okhttp3.RealCall.access$100(RealCall.java:30)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
答案 0 :(得分:2)
我已经检查了GzipSource中的代码:
private void consumeHeader() throws IOException {
// Read the 10-byte header. We peek at the flags byte first so we know if we
// need to CRC the entire header. Then we read the magic ID1ID2 sequence.
// We can skip everything else in the first 10 bytes.
// +---+---+---+---+---+---+---+---+---+---+
// |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
// +---+---+---+---+---+---+---+---+---+---+
source.require(10);
...
}
@Override public void require(long byteCount) throws IOException {
if (!request(byteCount)) throw new EOFException();
}
@Override public boolean request(long byteCount) throws IOException {
if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount);
if (closed) throw new IllegalStateException("closed");
while (buffer.size < byteCount) {
if (source.read(buffer, Segment.SIZE) == -1) return false;
}
return true;
}
您的响应数据似乎违反了gzip的格式。因此建议先检查响应数据。您可能还需要检查传入的请求标头,这会影响响应数据格式(即:accept:gzip)。