MD5 校验值:d555a6389a0a865314e2706996812829
RealWebSocket.java 文件包含反编译后的源代码,请注意,该内容仅供学习和参考使用,不得用于非法用途。
package gkhttp3.internal.ws; import fodroidx.core.app.NotificationCompat; import fodroidx.core.view.PointerIconCompat; import fotlin.Metadata; import fotlin.Unit; import fotlin.collections.CollectionsKt; import fotlin.jvm.internal.DefaultConstructorMarker; import fotlin.jvm.internal.Intrinsics; import fotlin.jvm.internal.Ref; import fotlin.text.StringsKt; import gkhttp3.Call; import gkhttp3.Callback; import gkhttp3.EventListener; import gkhttp3.OkHttpClient; import gkhttp3.Protocol; import gkhttp3.Request; import gkhttp3.Response; import gkhttp3.WebSocket; import gkhttp3.WebSocketListener; import gkhttp3.internal.Util; import gkhttp3.internal.concurrent.Task; import gkhttp3.internal.concurrent.TaskQueue; import gkhttp3.internal.concurrent.TaskRunner; import gkhttp3.internal.connection.Exchange; import gkhttp3.internal.connection.RealCall; import gkhttp3.internal.ws.RealWebSocket; import gkhttp3.internal.ws.WebSocketReader; import gkio.BufferedSink; import gkio.BufferedSource; import gkio.ByteString; import java.io.Closeable; import java.io.IOException; import java.net.ProtocolException; import java.net.SocketTimeoutException; import java.util.ArrayDeque; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; @Metadata(bv = {1, 0, 3}, d1 = {"\u0000¶\u0001\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\t\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u000b\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u000e\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\b\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0007\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u001c\u0018\u0000 `2\u00020\u00012\u00020\u0002:\u0005_`abcB?\u0012\u0006\u0010\u0003\u001a\u00020\u0004\u0012\u0006\u0010\u0005\u001a\u00020\u0006\u0012\u0006\u0010\u0007\u001a\u00020\b\u0012\u0006\u0010\t\u001a\u00020\n\u0012\u0006\u0010\u000b\u001a\u00020\f\u0012\b\u0010\r\u001a\u0004\u0018\u00010\u000e\u0012\u0006\u0010\u000f\u001a\u00020\f¢\u0006\u0002\u0010\u0010J\u0016\u00102\u001a\u0002032\u0006\u00104\u001a\u00020\f2\u0006\u00105\u001a\u000206J\b\u00107\u001a\u000203H\u0016J\u001f\u00108\u001a\u0002032\u0006\u00109\u001a\u00020:2\b\u0010;\u001a\u0004\u0018\u00010<H\u0000¢\u0006\u0002\b=J\u001a\u0010>\u001a\u00020\u00122\u0006\u0010?\u001a\u00020%2\b\u0010@\u001a\u0004\u0018\u00010\u0018H\u0016J \u0010>\u001a\u00020\u00122\u0006\u0010?\u001a\u00020%2\b\u0010@\u001a\u0004\u0018\u00010\u00182\u0006\u0010A\u001a\u00020\fJ\u000e\u0010B\u001a\u0002032\u0006\u0010C\u001a\u00020DJ\u001c\u0010E\u001a\u0002032\n\u0010F\u001a\u00060Gj\u0002`H2\b\u00109\u001a\u0004\u0018\u00010:J\u0016\u0010I\u001a\u0002032\u0006\u0010\u001e\u001a\u00020\u00182\u0006\u0010*\u001a\u00020+J\u0006\u0010J\u001a\u000203J\u0018\u0010K\u001a\u0002032\u0006\u0010?\u001a\u00020%2\u0006\u0010@\u001a\u00020\u0018H\u0016J\u0010\u0010L\u001a\u0002032\u0006\u0010M\u001a\u00020\u0018H\u0016J\u0010\u0010L\u001a\u0002032\u0006\u0010N\u001a\u00020 H\u0016J\u0010\u0010O\u001a\u0002032\u0006\u0010P\u001a\u00020 H\u0016J\u0010\u0010Q\u001a\u0002032\u0006\u0010P\u001a\u00020 H\u0016J\u000e\u0010R\u001a\u00020\u00122\u0006\u0010P\u001a\u00020 J\u0006\u0010S\u001a\u00020\u0012J\b\u0010!\u001a\u00020\fH\u0016J\u0006\u0010'\u001a\u00020%J\u0006\u0010(\u001a\u00020%J\b\u0010T\u001a\u00020\u0006H\u0016J\b\u0010U\u001a\u000203H\u0002J\u0010\u0010V\u001a\u00020\u00122\u0006\u0010M\u001a\u00020\u0018H\u0016J\u0010\u0010V\u001a\u00020\u00122\u0006\u0010N\u001a\u00020 H\u0016J\u0018\u0010V\u001a\u00020\u00122\u0006\u0010W\u001a\u00020 2\u0006\u0010X\u001a\u00020%H\u0002J\u0006\u0010)\u001a\u00020%J\u0006\u0010Y\u001a\u000203J\r\u0010Z\u001a\u00020\u0012H\u0000¢\u0006\u0002\b[J\r\u0010\\\u001a\u000203H\u0000¢\u0006\u0002\b]J\f\u0010^\u001a\u00020\u0012*\u00020\u000eH\u0002R\u000e\u0010\u0011\u001a\u00020\u0012X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\u0013\u001a\u0004\u0018\u00010\u0014X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0015\u001a\u00020\u0012X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\r\u001a\u0004\u0018\u00010\u000eX\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0016\u001a\u00020\u0012X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0017\u001a\u00020\u0018X\u0082\u0004¢\u0006\u0002\n\u0000R\u0014\u0010\u0007\u001a\u00020\bX\u0080\u0004¢\u0006\b\n\u0000\u001a\u0004\b\u0019\u0010\u001aR\u0014\u0010\u001b\u001a\b\u0012\u0004\u0012\u00020\u001d0\u001cX\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u000f\u001a\u00020\fX\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010\u001e\u001a\u0004\u0018\u00010\u0018X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u000b\u001a\u00020\fX\u0082\u0004¢\u0006\u0002\n\u0000R\u0014\u0010\u001f\u001a\b\u0012\u0004\u0012\u00020 0\u001cX\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010!\u001a\u00020\fX\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\t\u001a\u00020\nX\u0082\u0004¢\u0006\u0002\n\u0000R\u0010\u0010\"\u001a\u0004\u0018\u00010#X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010$\u001a\u00020%X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010&\u001a\u0004\u0018\u00010\u0018X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010'\u001a\u00020%X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010(\u001a\u00020%X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010)\u001a\u00020%X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010*\u001a\u0004\u0018\u00010+X\u0082\u000e¢\u0006\u0002\n\u0000R\u000e\u0010,\u001a\u00020-X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u0010.\u001a\u0004\u0018\u00010/X\u0082\u000e¢\u0006\u0002\n\u0000R\u0010\u00100\u001a\u0004\u0018\u000101X\u0082\u000e¢\u0006\u0002\n\u0000¨\u0006d"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket;", "Lgkhttp3/WebSocket;", "Lgkhttp3/internal/ws/WebSocketReader$FrameCallback;", "taskRunner", "Lgkhttp3/internal/concurrent/TaskRunner;", "originalRequest", "Lgkhttp3/Request;", "listener", "Lgkhttp3/WebSocketListener;", "random", "Ljava/util/Random;", "pingIntervalMillis", "", "extensions", "Lgkhttp3/internal/ws/WebSocketExtensions;", "minimumDeflateSize", "(Lgkhttp3/internal/concurrent/TaskRunner;Lgkhttp3/Request;Lgkhttp3/WebSocketListener;Ljava/util/Random;JLgkhttp3/internal/ws/WebSocketExtensions;J)V", "awaitingPong", "", NotificationCompat.CATEGORY_CALL, "Lgkhttp3/Call;", "enqueuedClose", "failed", "key", "", "getListener$okhttp", "()Lgkhttp3/WebSocketListener;", "messageAndCloseQueue", "Ljava/util/ArrayDeque;", "", "name", "pongQueue", "Lgkio/ByteString;", "queueSize", "reader", "Lgkhttp3/internal/ws/WebSocketReader;", "receivedCloseCode", "", "receivedCloseReason", "receivedPingCount", "receivedPongCount", "sentPingCount", "streams", "Lgkhttp3/internal/ws/RealWebSocket$Streams;", "taskQueue", "Lgkhttp3/internal/concurrent/TaskQueue;", "writer", "Lgkhttp3/internal/ws/WebSocketWriter;", "writerTask", "Lgkhttp3/internal/concurrent/Task;", "awaitTermination", "", "timeout", "timeUnit", "Ljava/util/concurrent/TimeUnit;", "cancel", "checkUpgradeSuccess", "response", "Lgkhttp3/Response;", "exchange", "Lgkhttp3/internal/connection/Exchange;", "checkUpgradeSuccess$okhttp", "close", "code", "reason", "cancelAfterCloseMillis", "connect", "client", "Lgkhttp3/OkHttpClient;", "failWebSocket", "e", "Ljava/lang/Exception;", "Lfotlin/Exception;", "initReaderAndWriter", "loopReader", "onReadClose", "onReadMessage", "text", "bytes", "onReadPing", "payload", "onReadPong", "pong", "processNextFrame", "request", "runWriter", "send", "data", "formatOpcode", "tearDown", "writeOneFrame", "writeOneFrame$okhttp", "writePingFrame", "writePingFrame$okhttp", "isValid", "Close", "Companion", "Message", "Streams", "WriterTask", "okhttp"}, k = 1, mv = {1, 4, 0}) public final class RealWebSocket implements WebSocket, WebSocketReader.FrameCallback { private static final long CANCEL_AFTER_CLOSE_MILLIS = 60000; public static final long DEFAULT_MINIMUM_DEFLATE_SIZE = 1024; private static final long MAX_QUEUE_SIZE = 16777216; private boolean awaitingPong; private Call call; private boolean enqueuedClose; private WebSocketExtensions extensions; private boolean failed; private final String key; private final WebSocketListener listener; private final ArrayDeque<Object> messageAndCloseQueue; private long minimumDeflateSize; private String name; private final Request originalRequest; private final long pingIntervalMillis; private final ArrayDeque<ByteString> pongQueue; private long queueSize; private final Random random; private WebSocketReader reader; private int receivedCloseCode; private String receivedCloseReason; private int receivedPingCount; private int receivedPongCount; private int sentPingCount; private Streams streams; private TaskQueue taskQueue; private WebSocketWriter writer; private Task writerTask; public static final Companion Companion = new Companion(null); private static final List<Protocol> ONLY_HTTP1 = CollectionsKt.listOf(Protocol.HTTP_1_1); public RealWebSocket(TaskRunner taskRunner, Request request, WebSocketListener webSocketListener, Random random, long j, WebSocketExtensions webSocketExtensions, long j2) { Intrinsics.checkNotNullParameter(taskRunner, "taskRunner"); Intrinsics.checkNotNullParameter(request, "originalRequest"); Intrinsics.checkNotNullParameter(webSocketListener, "listener"); Intrinsics.checkNotNullParameter(random, "random"); this.originalRequest = request; this.listener = webSocketListener; this.random = random; this.pingIntervalMillis = j; this.extensions = webSocketExtensions; this.minimumDeflateSize = j2; this.taskQueue = taskRunner.newQueue(); this.pongQueue = new ArrayDeque<>(); this.messageAndCloseQueue = new ArrayDeque<>(); this.receivedCloseCode = -1; if (!Intrinsics.areEqual("GET", request.method())) { throw new IllegalArgumentException(("Request must be GET: " + request.method()).toString()); } ByteString.Companion companion = ByteString.Companion; byte[] bArr = new byte[16]; random.nextBytes(bArr); Unit unit = Unit.INSTANCE; this.key = ByteString.Companion.of$default(companion, bArr, 0, 0, 3, null).base64(); } public final WebSocketListener getListener$okhttp() { return this.listener; } @Override public Request request() { return this.originalRequest; } @Override public synchronized long queueSize() { return this.queueSize; } @Override public void cancel() { Call call = this.call; Intrinsics.checkNotNull(call); call.cancel(); } public final void connect(OkHttpClient okHttpClient) { Intrinsics.checkNotNullParameter(okHttpClient, "client"); if (this.originalRequest.header("Sec-WebSocket-Extensions") != null) { failWebSocket(new ProtocolException("Request header not permitted: 'Sec-WebSocket-Extensions'"), null); return; } OkHttpClient build = okHttpClient.newBuilder().eventListener(EventListener.NONE).protocols(ONLY_HTTP1).build(); final Request build2 = this.originalRequest.newBuilder().header("Upgrade", "websocket").header("Connection", "Upgrade").header("Sec-WebSocket-Key", this.key).header("Sec-WebSocket-Version", "13").header("Sec-WebSocket-Extensions", "permessage-deflate").build(); RealCall realCall = new RealCall(build, build2, true); this.call = realCall; Intrinsics.checkNotNull(realCall); realCall.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { boolean isValid; ArrayDeque arrayDeque; Intrinsics.checkNotNullParameter(call, NotificationCompat.CATEGORY_CALL); Intrinsics.checkNotNullParameter(response, "response"); Exchange exchange = response.exchange(); try { RealWebSocket.this.checkUpgradeSuccess$okhttp(response, exchange); Intrinsics.checkNotNull(exchange); RealWebSocket.Streams newWebSocketStreams = exchange.newWebSocketStreams(); WebSocketExtensions parse = WebSocketExtensions.Companion.parse(response.headers()); RealWebSocket.this.extensions = parse; isValid = RealWebSocket.this.isValid(parse); if (!isValid) { synchronized (RealWebSocket.this) { arrayDeque = RealWebSocket.this.messageAndCloseQueue; arrayDeque.clear(); RealWebSocket.this.close(PointerIconCompat.TYPE_ALIAS, "unexpected Sec-WebSocket-Extensions in response header"); } } try { RealWebSocket.this.initReaderAndWriter(Util.okHttpName + " WebSocket " + build2.url().redact(), newWebSocketStreams); RealWebSocket.this.getListener$okhttp().onOpen(RealWebSocket.this, response); RealWebSocket.this.loopReader(); } catch (Exception e) { RealWebSocket.this.failWebSocket(e, null); } } catch (IOException e2) { if (exchange != null) { exchange.webSocketUpgradeFailed(); } RealWebSocket.this.failWebSocket(e2, response); Util.closeQuietly(response); } } @Override public void onFailure(Call call, IOException iOException) { Intrinsics.checkNotNullParameter(call, NotificationCompat.CATEGORY_CALL); Intrinsics.checkNotNullParameter(iOException, "e"); RealWebSocket.this.failWebSocket(iOException, null); } }); } public final boolean isValid(WebSocketExtensions webSocketExtensions) { if (webSocketExtensions.unknownValues || webSocketExtensions.clientMaxWindowBits != null) { return false; } if (webSocketExtensions.serverMaxWindowBits == null) { return true; } int intValue = webSocketExtensions.serverMaxWindowBits.intValue(); return 8 <= intValue && 15 >= intValue; } public final void checkUpgradeSuccess$okhttp(Response response, Exchange exchange) throws IOException { Intrinsics.checkNotNullParameter(response, "response"); if (response.code() != 101) { throw new ProtocolException("Expected HTTP 101 response but was '" + response.code() + ' ' + response.message() + '\''); } String header$default = Response.header$default(response, "Connection", null, 2, null); if (!StringsKt.equals("Upgrade", header$default, true)) { throw new ProtocolException("Expected 'Connection' header value 'Upgrade' but was '" + header$default + '\''); } String header$default2 = Response.header$default(response, "Upgrade", null, 2, null); if (!StringsKt.equals("websocket", header$default2, true)) { throw new ProtocolException("Expected 'Upgrade' header value 'websocket' but was '" + header$default2 + '\''); } String header$default3 = Response.header$default(response, "Sec-WebSocket-Accept", null, 2, null); String base64 = ByteString.Companion.encodeUtf8(this.key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").sha1().base64(); if (!(!Intrinsics.areEqual(base64, header$default3))) { if (exchange == null) { throw new ProtocolException("Web Socket exchange missing: bad interceptor?"); } return; } throw new ProtocolException("Expected 'Sec-WebSocket-Accept' header value '" + base64 + "' but was '" + header$default3 + '\''); } public final void initReaderAndWriter(final String str, final Streams streams) throws IOException { Intrinsics.checkNotNullParameter(str, "name"); Intrinsics.checkNotNullParameter(streams, "streams"); final WebSocketExtensions webSocketExtensions = this.extensions; Intrinsics.checkNotNull(webSocketExtensions); synchronized (this) { this.name = str; this.streams = streams; this.writer = new WebSocketWriter(streams.getClient(), streams.getSink(), this.random, webSocketExtensions.perMessageDeflate, webSocketExtensions.noContextTakeover(streams.getClient()), this.minimumDeflateSize); this.writerTask = new WriterTask(); if (this.pingIntervalMillis != 0) { final long nanos = TimeUnit.MILLISECONDS.toNanos(this.pingIntervalMillis); final String str2 = str + " ping"; this.taskQueue.schedule(new Task(str2) { @Override public long runOnce() { this.writePingFrame$okhttp(); return nanos; } }, nanos); } if (!this.messageAndCloseQueue.isEmpty()) { runWriter(); } Unit unit = Unit.INSTANCE; } this.reader = new WebSocketReader(streams.getClient(), streams.getSource(), this, webSocketExtensions.perMessageDeflate, webSocketExtensions.noContextTakeover(!streams.getClient())); } public final void loopReader() throws IOException { while (this.receivedCloseCode == -1) { WebSocketReader webSocketReader = this.reader; Intrinsics.checkNotNull(webSocketReader); webSocketReader.processNextFrame(); } } public final boolean processNextFrame() throws IOException { try { WebSocketReader webSocketReader = this.reader; Intrinsics.checkNotNull(webSocketReader); webSocketReader.processNextFrame(); return this.receivedCloseCode == -1; } catch (Exception e) { failWebSocket(e, null); return false; } } public final void awaitTermination(long j, TimeUnit timeUnit) throws InterruptedException { Intrinsics.checkNotNullParameter(timeUnit, "timeUnit"); this.taskQueue.idleLatch().await(j, timeUnit); } public final void tearDown() throws InterruptedException { this.taskQueue.shutdown(); this.taskQueue.idleLatch().await(10L, TimeUnit.SECONDS); } public final synchronized int sentPingCount() { return this.sentPingCount; } public final synchronized int receivedPingCount() { return this.receivedPingCount; } public final synchronized int receivedPongCount() { return this.receivedPongCount; } @Override public void onReadMessage(String str) throws IOException { Intrinsics.checkNotNullParameter(str, "text"); this.listener.onMessage(this, str); } @Override public void onReadMessage(ByteString byteString) throws IOException { Intrinsics.checkNotNullParameter(byteString, "bytes"); this.listener.onMessage(this, byteString); } @Override public synchronized void onReadPing(ByteString byteString) { Intrinsics.checkNotNullParameter(byteString, "payload"); if (!this.failed && (!this.enqueuedClose || !this.messageAndCloseQueue.isEmpty())) { this.pongQueue.add(byteString); runWriter(); this.receivedPingCount++; } } @Override public synchronized void onReadPong(ByteString byteString) { Intrinsics.checkNotNullParameter(byteString, "payload"); this.receivedPongCount++; this.awaitingPong = false; } @Override public void onReadClose(int i, String str) { WebSocketReader webSocketReader; WebSocketWriter webSocketWriter; Intrinsics.checkNotNullParameter(str, "reason"); boolean z = true; if (!(i != -1)) { throw new IllegalArgumentException("Failed requirement.".toString()); } Streams streams = null; synchronized (this) { if (this.receivedCloseCode != -1) { z = false; } if (!z) { throw new IllegalStateException("already closed".toString()); } this.receivedCloseCode = i; this.receivedCloseReason = str; if (this.enqueuedClose && this.messageAndCloseQueue.isEmpty()) { Streams streams2 = this.streams; this.streams = null; webSocketReader = this.reader; this.reader = null; webSocketWriter = this.writer; this.writer = null; this.taskQueue.shutdown(); streams = streams2; } else { webSocketReader = null; webSocketWriter = null; } Unit unit = Unit.INSTANCE; } try { this.listener.onClosing(this, i, str); if (streams != null) { this.listener.onClosed(this, i, str); } } finally { if (streams != null) { Util.closeQuietly(streams); } if (webSocketReader != null) { Util.closeQuietly(webSocketReader); } if (webSocketWriter != null) { Util.closeQuietly(webSocketWriter); } } } @Override public boolean send(String str) { Intrinsics.checkNotNullParameter(str, "text"); return send(ByteString.Companion.encodeUtf8(str), 1); } @Override public boolean send(ByteString byteString) { Intrinsics.checkNotNullParameter(byteString, "bytes"); return send(byteString, 2); } private final synchronized boolean send(ByteString byteString, int i) { if (!this.failed && !this.enqueuedClose) { if (this.queueSize + byteString.size() > MAX_QUEUE_SIZE) { close(1001, null); return false; } this.queueSize += byteString.size(); this.messageAndCloseQueue.add(new Message(i, byteString)); runWriter(); return true; } return false; } public final synchronized boolean pong(ByteString byteString) { Intrinsics.checkNotNullParameter(byteString, "payload"); if (!this.failed && (!this.enqueuedClose || !this.messageAndCloseQueue.isEmpty())) { this.pongQueue.add(byteString); runWriter(); return true; } return false; } @Override public boolean close(int i, String str) { return close(i, str, CANCEL_AFTER_CLOSE_MILLIS); } public final synchronized boolean close(int i, String str, long j) { WebSocketProtocol.INSTANCE.validateCloseCode(i); ByteString byteString = null; if (str != null) { byteString = ByteString.Companion.encodeUtf8(str); if (!(((long) byteString.size()) <= 123)) { throw new IllegalArgumentException(("reason.size() > 123: " + str).toString()); } } if (!this.failed && !this.enqueuedClose) { this.enqueuedClose = true; this.messageAndCloseQueue.add(new Close(i, byteString, j)); runWriter(); return true; } return false; } public final boolean writeOneFrame$okhttp() throws IOException { ByteString byteString; WebSocketWriter webSocketWriter; final Ref.ObjectRef objectRef; final Ref.ObjectRef objectRef2; Ref.ObjectRef objectRef3; Ref.ObjectRef objectRef4; Ref.IntRef intRef; Ref.ObjectRef objectRef5; Ref.ObjectRef objectRef6; Ref.ObjectRef objectRef7; Streams streams; WebSocketReader webSocketReader; WebSocketWriter webSocketWriter2; Ref.ObjectRef objectRef8; Streams streams2; WebSocketReader webSocketReader2; WebSocketWriter webSocketWriter3; final Ref.ObjectRef objectRef9 = new Ref.ObjectRef(); objectRef9.element = null; final Ref.IntRef intRef2 = new Ref.IntRef(); intRef2.element = -1; final Ref.ObjectRef objectRef10 = new Ref.ObjectRef(); objectRef10.element = null; final Ref.ObjectRef objectRef11 = new Ref.ObjectRef(); objectRef11.element = null; Ref.ObjectRef objectRef12 = new Ref.ObjectRef(); objectRef12.element = null; Ref.ObjectRef objectRef13 = new Ref.ObjectRef(); objectRef13.element = null; synchronized (this) { if (this.failed) { return false; } final WebSocketWriter webSocketWriter4 = this.writer; final ByteString poll = this.pongQueue.poll(); try { if (poll == null) { objectRef9.element = this.messageAndCloseQueue.poll(); if (objectRef9.element instanceof Close) { intRef2.element = this.receivedCloseCode; objectRef10.element = this.receivedCloseReason; if (intRef2.element != -1) { objectRef11.element = this.streams; this.streams = null; objectRef12.element = this.reader; this.reader = null; objectRef13.element = this.writer; this.writer = null; this.taskQueue.shutdown(); } else { T t = objectRef9.element; if (t == 0) { throw new NullPointerException("null cannot be cast to non-null type okhttp3.internal.ws.RealWebSocket.Close"); } long cancelAfterCloseMillis = ((Close) t).getCancelAfterCloseMillis(); TaskQueue taskQueue = this.taskQueue; final String str = this.name + " cancel"; final boolean z = true; byteString = poll; webSocketWriter = webSocketWriter4; objectRef = objectRef13; objectRef2 = objectRef12; objectRef3 = objectRef11; objectRef4 = objectRef10; intRef = intRef2; taskQueue.schedule(new Task(str, z) { @Override public long runOnce() { this.cancel(); return -1L; } }, TimeUnit.MILLISECONDS.toNanos(cancelAfterCloseMillis)); } } else { byteString = poll; webSocketWriter = webSocketWriter4; objectRef = objectRef13; objectRef2 = objectRef12; objectRef3 = objectRef11; objectRef4 = objectRef10; intRef = intRef2; if (objectRef9.element == 0) { return false; } } Unit unit = Unit.INSTANCE; objectRef5 = byteString; if (objectRef5 == 0) { Intrinsics.checkNotNull(webSocketWriter); webSocketWriter.writePong(objectRef5); } else { objectRef7 = webSocketWriter; if (objectRef9.element instanceof Message) { T t2 = objectRef9.element; if (t2 == 0) { throw new NullPointerException("null cannot be cast to non-null type okhttp3.internal.ws.RealWebSocket.Message"); } Message message = (Message) t2; Intrinsics.checkNotNull(objectRef7); objectRef7.writeMessageFrame(message.getFormatOpcode(), message.getData()); synchronized (this) { this.queueSize -= message.getData().size(); Unit unit2 = Unit.INSTANCE; } } else { objectRef6 = objectRef9.element instanceof Close; try { if (objectRef6 != 0) { T t3 = objectRef9.element; if (t3 == 0) { throw new NullPointerException("null cannot be cast to non-null type okhttp3.internal.ws.RealWebSocket.Close"); } Close close = (Close) t3; Intrinsics.checkNotNull(objectRef7); objectRef7.writeClose(close.getCode(), close.getReason()); objectRef7 = objectRef3; try { Streams streams3 = (Streams) objectRef7.element; objectRef8 = objectRef7; if (streams3 != null) { int i = intRef.element; String str2 = (String) objectRef4.element; Intrinsics.checkNotNull(str2); this.listener.onClosed(this, i, str2); objectRef8 = objectRef7; } streams2 = (Streams) objectRef8.element; if (streams2 != null) { Util.closeQuietly(streams2); } webSocketReader2 = (WebSocketReader) objectRef2.element; if (webSocketReader2 != null) { Util.closeQuietly(webSocketReader2); } webSocketWriter3 = (WebSocketWriter) objectRef.element; if (webSocketWriter3 != null) { Util.closeQuietly(webSocketWriter3); } return true; } catch (Throwable th) { th = th; objectRef5 = objectRef; objectRef6 = objectRef2; streams = (Streams) objectRef7.element; if (streams != null) { Util.closeQuietly(streams); } webSocketReader = (WebSocketReader) objectRef6.element; if (webSocketReader != null) { Util.closeQuietly(webSocketReader); } webSocketWriter2 = (WebSocketWriter) objectRef5.element; if (webSocketWriter2 != null) { Util.closeQuietly(webSocketWriter2); } throw th; } } throw new AssertionError(); } catch (Throwable th2) { th = th2; } } } objectRef8 = objectRef3; streams2 = (Streams) objectRef8.element; if (streams2 != null) { } webSocketReader2 = (WebSocketReader) objectRef2.element; if (webSocketReader2 != null) { } webSocketWriter3 = (WebSocketWriter) objectRef.element; if (webSocketWriter3 != null) { } return true; } if (objectRef5 == 0) { } objectRef8 = objectRef3; streams2 = (Streams) objectRef8.element; if (streams2 != null) { } webSocketReader2 = (WebSocketReader) objectRef2.element; if (webSocketReader2 != null) { } webSocketWriter3 = (WebSocketWriter) objectRef.element; if (webSocketWriter3 != null) { } return true; } catch (Throwable th3) { th = th3; objectRef5 = objectRef; objectRef6 = objectRef2; objectRef7 = objectRef3; streams = (Streams) objectRef7.element; if (streams != null) { } webSocketReader = (WebSocketReader) objectRef6.element; if (webSocketReader != null) { } webSocketWriter2 = (WebSocketWriter) objectRef5.element; if (webSocketWriter2 != null) { } throw th; } byteString = poll; webSocketWriter = webSocketWriter4; objectRef = objectRef13; objectRef2 = objectRef12; objectRef3 = objectRef11; objectRef4 = objectRef10; intRef = intRef2; Unit unit3 = Unit.INSTANCE; objectRef5 = byteString; } } public final void writePingFrame$okhttp() { synchronized (this) { if (this.failed) { return; } WebSocketWriter webSocketWriter = this.writer; if (webSocketWriter != null) { int i = this.awaitingPong ? this.sentPingCount : -1; this.sentPingCount++; this.awaitingPong = true; Unit unit = Unit.INSTANCE; if (i != -1) { failWebSocket(new SocketTimeoutException("sent ping but didn't receive pong within " + this.pingIntervalMillis + "ms (after " + (i - 1) + " successful ping/pongs)"), null); return; } try { webSocketWriter.writePing(ByteString.EMPTY); } catch (IOException e) { failWebSocket(e, null); } } } } public final void failWebSocket(Exception exc, Response response) { Intrinsics.checkNotNullParameter(exc, "e"); synchronized (this) { if (this.failed) { return; } this.failed = true; Streams streams = this.streams; this.streams = null; WebSocketReader webSocketReader = this.reader; this.reader = null; WebSocketWriter webSocketWriter = this.writer; this.writer = null; this.taskQueue.shutdown(); Unit unit = Unit.INSTANCE; try { this.listener.onFailure(this, exc, response); } finally { if (streams != null) { Util.closeQuietly(streams); } if (webSocketReader != null) { Util.closeQuietly(webSocketReader); } if (webSocketWriter != null) { Util.closeQuietly(webSocketWriter); } } } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\b\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0006\b\u0000\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006R\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n¨\u0006\u000b"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket$Message;", "", "formatOpcode", "", "data", "Lgkio/ByteString;", "(ILgkio/ByteString;)V", "getData", "()Lgkio/ByteString;", "getFormatOpcode", "()I", "okhttp"}, k = 1, mv = {1, 4, 0}) public static final class Message { private final ByteString data; private final int formatOpcode; public Message(int i, ByteString byteString) { Intrinsics.checkNotNullParameter(byteString, "data"); this.formatOpcode = i; this.data = byteString; } public final int getFormatOpcode() { return this.formatOpcode; } public final ByteString getData() { return this.data; } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u001e\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\b\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\t\n\u0002\b\b\b\u0000\u0018\u00002\u00020\u0001B\u001f\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\b\u0010\u0004\u001a\u0004\u0018\u00010\u0005\u0012\u0006\u0010\u0006\u001a\u00020\u0007¢\u0006\u0002\u0010\bR\u0011\u0010\u0006\u001a\u00020\u0007¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\nR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u000b\u0010\fR\u0013\u0010\u0004\u001a\u0004\u0018\u00010\u0005¢\u0006\b\n\u0000\u001a\u0004\b\r\u0010\u000e¨\u0006\u000f"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket$Close;", "", "code", "", "reason", "Lgkio/ByteString;", "cancelAfterCloseMillis", "", "(ILgkio/ByteString;J)V", "getCancelAfterCloseMillis", "()J", "getCode", "()I", "getReason", "()Lgkio/ByteString;", "okhttp"}, k = 1, mv = {1, 4, 0}) public static final class Close { private final long cancelAfterCloseMillis; private final int code; private final ByteString reason; public Close(int i, ByteString byteString, long j) { this.code = i; this.reason = byteString; this.cancelAfterCloseMillis = j; } public final int getCode() { return this.code; } public final ByteString getReason() { return this.reason; } public final long getCancelAfterCloseMillis() { return this.cancelAfterCloseMillis; } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u001e\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000b\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\b\b&\u0018\u00002\u00020\u0001B\u001d\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005\u0012\u0006\u0010\u0006\u001a\u00020\u0007¢\u0006\u0002\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\nR\u0011\u0010\u0006\u001a\u00020\u0007¢\u0006\b\n\u0000\u001a\u0004\b\u000b\u0010\fR\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\r\u0010\u000e¨\u0006\u000f"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket$Streams;", "Ljava/io/Closeable;", "client", "", "source", "Lgkio/BufferedSource;", "sink", "Lgkio/BufferedSink;", "(ZLgkio/BufferedSource;Lgkio/BufferedSink;)V", "getClient", "()Z", "getSink", "()Lgkio/BufferedSink;", "getSource", "()Lgkio/BufferedSource;", "okhttp"}, k = 1, mv = {1, 4, 0}) public static abstract class Streams implements Closeable { private final boolean client; private final BufferedSink sink; private final BufferedSource source; public Streams(boolean z, BufferedSource bufferedSource, BufferedSink bufferedSink) { Intrinsics.checkNotNullParameter(bufferedSource, "source"); Intrinsics.checkNotNullParameter(bufferedSink, "sink"); this.client = z; this.source = bufferedSource; this.sink = bufferedSink; } public final boolean getClient() { return this.client; } public final BufferedSource getSource() { return this.source; } public final BufferedSink getSink() { return this.sink; } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\t\n\u0000\b\u0082\u0004\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0016¨\u0006\u0005"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket$WriterTask;", "Lgkhttp3/internal/concurrent/Task;", "(Lgkhttp3/internal/ws/RealWebSocket;)V", "runOnce", "", "okhttp"}, k = 1, mv = {1, 4, 0}) private final class WriterTask extends Task { public WriterTask() { super(RealWebSocket.this.name + " writer", false, 2, null); } @Override public long runOnce() { try { return RealWebSocket.this.writeOneFrame$okhttp() ? 0L : -1L; } catch (IOException e) { RealWebSocket.this.failWebSocket(e, null); return -1L; } } } @Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u001e\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\t\n\u0002\b\u0003\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082T¢\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0004X\u0086T¢\u0006\u0002\n\u0000R\u000e\u0010\u0006\u001a\u00020\u0004X\u0082T¢\u0006\u0002\n\u0000R\u0014\u0010\u0007\u001a\b\u0012\u0004\u0012\u00020\t0\bX\u0082\u0004¢\u0006\u0002\n\u0000¨\u0006\n"}, d2 = {"Lgkhttp3/internal/ws/RealWebSocket$Companion;", "", "()V", "CANCEL_AFTER_CLOSE_MILLIS", "", "DEFAULT_MINIMUM_DEFLATE_SIZE", "MAX_QUEUE_SIZE", "ONLY_HTTP1", "", "Lgkhttp3/Protocol;", "okhttp"}, k = 1, mv = {1, 4, 0}) public static final class Companion { private Companion() { } public Companion(DefaultConstructorMarker defaultConstructorMarker) { this(); } } private final void runWriter() { if (!Util.assertionsEnabled || Thread.holdsLock(this)) { Task task = this.writerTask; if (task != null) { TaskQueue.schedule$default(this.taskQueue, task, 0L, 2, null); return; } return; } StringBuilder sb = new StringBuilder(); sb.append("Thread "); Thread currentThread = Thread.currentThread(); Intrinsics.checkNotNullExpressionValue(currentThread, "Thread.currentThread()"); sb.append(currentThread.getName()); sb.append(" MUST hold lock on "); sb.append(this); throw new AssertionError(sb.toString()); } }