Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OKHttp throwing an illegal state exception when I try to log the network response

Tags:

I put the following interceptor on my OkHttp client:

httpClient.addInterceptor(new Interceptor() {     @Override     public Response intercept(Chain chain) throws IOException {         Response response = chain.proceed(chain.request());         Log.d("Response", response.body().string());         return response;     }     }); 

However, this isn't playing nice with Retrofit 2. It seems that you can only read the stream from the response once and that might be what is causing the exception. I'm thinking retrofit is trying to parse the stream which the log already parsed. How then do I get my hands on the response? I'm currently trying to debug a very nasty and strange malformed json exception.

This is the exception stack trace:

07 - 28 10: 58: 21.575 22401 - 22529 / REDACTED E / AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher     Process: REDACTED, PID: 22401     java.lang.IllegalStateException: closed     at okhttp3.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java: 378)     at okio.Buffer.writeAll(Buffer.java: 956)     at okio.RealBufferedSource.readByteArray(RealBufferedSource.java: 92)     at okhttp3.ResponseBody.bytes(ResponseBody.java: 83)     at okhttp3.ResponseBody.string(ResponseBody.java: 109)     at REDACTED.ServiceGenerator$2.intercept(ServiceGenerator.java: 90)     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java: 187)     at REDACTED.ServiceGenerator$2.intercept(ServiceGenerator.java: 89)     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java: 187)     at REDACTED.ServiceGenerator$2.intercept(ServiceGenerator.java: 89)     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java: 187)     at REDACTED.ServiceGenerator$2.intercept(ServiceGenerator.java: 89)     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: 841) 

I see that there are multiple interceptors in the stack but I only ever explicitly add the one, which is the on that is throwing the exception.