RealCall.java 源代码
package com.mbridge.msdk.thrid.okhttp;
import androidx.core.app.NotificationCompat;
import com.mbridge.msdk.thrid.okhttp.internal.NamedRunnable;
import com.mbridge.msdk.thrid.okhttp.internal.Util;
import com.mbridge.msdk.thrid.okhttp.internal.cache.CacheInterceptor;
import com.mbridge.msdk.thrid.okhttp.internal.connection.ConnectInterceptor;
import com.mbridge.msdk.thrid.okhttp.internal.connection.StreamAllocation;
import com.mbridge.msdk.thrid.okhttp.internal.http.BridgeInterceptor;
import com.mbridge.msdk.thrid.okhttp.internal.http.CallServerInterceptor;
import com.mbridge.msdk.thrid.okhttp.internal.http.RealInterceptorChain;
import com.mbridge.msdk.thrid.okhttp.internal.http.RetryAndFollowUpInterceptor;
import com.mbridge.msdk.thrid.okhttp.internal.platform.Platform;
import com.mbridge.msdk.thrid.okio.AsyncTimeout;
import com.mbridge.msdk.thrid.okio.Timeout;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
public final class RealCall implements Call {
final OkHttpClient client;
@Nullable
private EventListener eventListener;
private boolean executed;
final boolean forWebSocket;
final Request originalRequest;
final RetryAndFollowUpInterceptor retryAndFollowUpInterceptor;
final AsyncTimeout timeout;
public final class AsyncCall extends NamedRunnable {
static final boolean $assertionsDisabled = false;
private final Callback responseCallback;
AsyncCall(Callback callback) {
super("OkHttp %s", RealCall.this.redactedUrl());
this.responseCallback = callback;
}
@Override
protected void execute() {
Throwable th;
boolean z6;
IOException e6;
RealCall.this.timeout.enter();
try {
try {
z6 = true;
try {
this.responseCallback.onResponse(RealCall.this, RealCall.this.getResponseWithInterceptorChain());
} catch (IOException e7) {
e6 = e7;
IOException timeoutExit = RealCall.this.timeoutExit(e6);
if (z6) {
Platform.get().log(4, "Callback failure for " + RealCall.this.toLoggableString(), timeoutExit);
} else {
RealCall.this.eventListener.callFailed(RealCall.this, timeoutExit);
this.responseCallback.onFailure(RealCall.this, timeoutExit);
}
} catch (Throwable th2) {
th = th2;
RealCall.this.cancel();
if (!z6) {
this.responseCallback.onFailure(RealCall.this, new IOException("canceled due to " + th));
}
throw th;
}
} finally {
RealCall.this.client.dispatcher().finished(this);
}
} catch (IOException e8) {
e6 = e8;
z6 = false;
} catch (Throwable th3) {
th = th3;
z6 = false;
}
}
public void executeOn(ExecutorService executorService) {
try {
try {
executorService.execute(this);
} catch (RejectedExecutionException e6) {
InterruptedIOException interruptedIOException = new InterruptedIOException("executor rejected");
interruptedIOException.initCause(e6);
RealCall.this.eventListener.callFailed(RealCall.this, interruptedIOException);
this.responseCallback.onFailure(RealCall.this, interruptedIOException);
RealCall.this.client.dispatcher().finished(this);
}
} catch (Throwable th) {
RealCall.this.client.dispatcher().finished(this);
throw th;
}
}
public RealCall get() {
return RealCall.this;
}
public String host() {
return RealCall.this.originalRequest.url().host();
}
Request request() {
return RealCall.this.originalRequest;
}
}
private RealCall(OkHttpClient okHttpClient, Request request, boolean z6) {
this.client = okHttpClient;
this.originalRequest = request;
this.forWebSocket = z6;
this.retryAndFollowUpInterceptor = new RetryAndFollowUpInterceptor(okHttpClient, z6);
AsyncTimeout asyncTimeout = new AsyncTimeout() {
@Override
protected void timedOut() {
RealCall.this.cancel();
}
};
this.timeout = asyncTimeout;
asyncTimeout.timeout(okHttpClient.callTimeoutMillis(), TimeUnit.MILLISECONDS);
}
private void captureCallStackTrace() {
this.retryAndFollowUpInterceptor.setCallStackTrace(Platform.get().getStackTraceForCloseable("response.body().close()"));
}
public static RealCall newRealCall(OkHttpClient okHttpClient, Request request, boolean z6) {
RealCall realCall = new RealCall(okHttpClient, request, z6);
realCall.eventListener = okHttpClient.eventListenerFactory().create(realCall);
return realCall;
}
@Override
public void cancel() {
this.retryAndFollowUpInterceptor.cancel();
}
@Override
public void enqueue(Callback callback) {
synchronized (this) {
if (!this.executed) {
this.executed = true;
} else {
throw new IllegalStateException("Already Executed");
}
}
captureCallStackTrace();
this.eventListener.callStart(this);
this.client.dispatcher().enqueue(new AsyncCall(callback));
}
@Override
public Response execute() throws IOException {
synchronized (this) {
if (!this.executed) {
this.executed = true;
} else {
throw new IllegalStateException("Already Executed");
}
}
captureCallStackTrace();
this.timeout.enter();
this.eventListener.callStart(this);
try {
try {
this.client.dispatcher().executed(this);
Response responseWithInterceptorChain = getResponseWithInterceptorChain();
if (responseWithInterceptorChain != null) {
return responseWithInterceptorChain;
}
throw new IOException("Canceled");
} catch (IOException e6) {
IOException timeoutExit = timeoutExit(e6);
this.eventListener.callFailed(this, timeoutExit);
throw timeoutExit;
}
} finally {
this.client.dispatcher().finished(this);
}
}
Response getResponseWithInterceptorChain() throws IOException {
ArrayList arrayList = new ArrayList();
arrayList.addAll(this.client.interceptors());
arrayList.add(this.retryAndFollowUpInterceptor);
arrayList.add(new BridgeInterceptor(this.client.cookieJar()));
arrayList.add(new CacheInterceptor(this.client.internalCache()));
arrayList.add(new ConnectInterceptor(this.client));
if (!this.forWebSocket) {
arrayList.addAll(this.client.networkInterceptors());
}
arrayList.add(new CallServerInterceptor(this.forWebSocket));
Response proceed = new RealInterceptorChain(arrayList, null, null, null, 0, this.originalRequest, this, this.eventListener, this.client.connectTimeoutMillis(), this.client.readTimeoutMillis(), this.client.writeTimeoutMillis()).proceed(this.originalRequest);
if (!this.retryAndFollowUpInterceptor.isCanceled()) {
return proceed;
}
Util.closeQuietly(proceed);
throw new IOException("Canceled");
}
@Override
public boolean isCanceled() {
return this.retryAndFollowUpInterceptor.isCanceled();
}
@Override
public synchronized boolean isExecuted() {
return this.executed;
}
String redactedUrl() {
return this.originalRequest.url().redact();
}
@Override
public Request request() {
return this.originalRequest;
}
public StreamAllocation streamAllocation() {
return this.retryAndFollowUpInterceptor.streamAllocation();
}
@Override
public Timeout timeout() {
return this.timeout;
}
@Nullable
public IOException timeoutExit(@Nullable IOException iOException) {
if (!this.timeout.exit()) {
return iOException;
}
InterruptedIOException interruptedIOException = new InterruptedIOException("timeout");
if (iOException != null) {
interruptedIOException.initCause(iOException);
}
return interruptedIOException;
}
String toLoggableString() {
String str;
String str2;
StringBuilder sb = new StringBuilder();
if (isCanceled()) {
str = "canceled ";
} else {
str = "";
}
sb.append(str);
if (this.forWebSocket) {
str2 = "web socket";
} else {
str2 = NotificationCompat.CATEGORY_CALL;
}
sb.append(str2);
sb.append(" to ");
sb.append(redactedUrl());
return sb.toString();
}
@Override
public RealCall m6clone() {
return newRealCall(this.client, this.originalRequest, this.forWebSocket);
}
}