package io.grpc.internal; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; import com.google.common.util.concurrent.MoreExecutors; import io.grpc.Attributes; import io.grpc.Codec; import io.grpc.Compressor; import io.grpc.CompressorRegistry; import io.grpc.Context; import io.grpc.DecompressorRegistry; import io.grpc.InternalDecompressorRegistry; import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.ServerCall; import io.grpc.Status; import io.grpc.internal.StreamListener; import java.io.InputStream; import java.util.logging.Level; import java.util.logging.Logger; import o.C13115fRJ; import o.fRN; /* JADX INFO: Access modifiers changed from: package-private */ /* loaded from: classes6.dex */ public final class ServerCallImpl extends ServerCall { static final String MISSING_RESPONSE = "Completed without a response"; static final String TOO_MANY_RESPONSES = "Too many responses"; private static final Logger log = Logger.getLogger(ServerCallImpl.class.getName()); private volatile boolean cancelled; private boolean closeCalled; private Compressor compressor; private final CompressorRegistry compressorRegistry; private final Context.CancellableContext context; private final DecompressorRegistry decompressorRegistry; private final byte[] messageAcceptEncoding; private boolean messageSent; private final MethodDescriptor method; private boolean sendHeadersCalled; private CallTracer serverCallTracer; private final ServerStream stream; private final fRN tag; /* JADX INFO: Access modifiers changed from: package-private */ public ServerCallImpl(ServerStream serverStream, MethodDescriptor methodDescriptor, Metadata metadata, Context.CancellableContext cancellableContext, DecompressorRegistry decompressorRegistry, CompressorRegistry compressorRegistry, CallTracer callTracer, fRN frn) { this.stream = serverStream; this.method = methodDescriptor; this.context = cancellableContext; this.messageAcceptEncoding = (byte[]) metadata.get(GrpcUtil.MESSAGE_ACCEPT_ENCODING_KEY); this.decompressorRegistry = decompressorRegistry; this.compressorRegistry = compressorRegistry; this.serverCallTracer = callTracer; callTracer.reportCallStarted(); this.tag = frn; } @Override // io.grpc.ServerCall public final void request(int i) { C13115fRJ.g(); try { this.stream.request(i); } finally { C13115fRJ.i(); } } @Override // io.grpc.ServerCall public final void sendHeaders(Metadata metadata) { C13115fRJ.g(); try { sendHeadersInternal(metadata); } finally { C13115fRJ.i(); } } private void sendHeadersInternal(Metadata metadata) { Preconditions.checkState(!this.sendHeadersCalled, "sendHeaders has already been called"); Preconditions.checkState(!this.closeCalled, "call is closed"); metadata.discardAll(GrpcUtil.CONTENT_LENGTH_KEY); metadata.discardAll(GrpcUtil.MESSAGE_ENCODING_KEY); if (this.compressor == null || this.messageAcceptEncoding == null || !GrpcUtil.iterableContains(GrpcUtil.ACCEPT_ENCODING_SPLITTER.split(new String(this.messageAcceptEncoding, GrpcUtil.US_ASCII)), this.compressor.getMessageEncoding())) { this.compressor = Codec.Identity.NONE; } metadata.put(GrpcUtil.MESSAGE_ENCODING_KEY, this.compressor.getMessageEncoding()); this.stream.setCompressor(this.compressor); metadata.discardAll(GrpcUtil.MESSAGE_ACCEPT_ENCODING_KEY); byte[] rawAdvertisedMessageEncodings = InternalDecompressorRegistry.getRawAdvertisedMessageEncodings(this.decompressorRegistry); if (rawAdvertisedMessageEncodings.length != 0) { metadata.put(GrpcUtil.MESSAGE_ACCEPT_ENCODING_KEY, rawAdvertisedMessageEncodings); } this.sendHeadersCalled = true; this.stream.writeHeaders(metadata); } @Override // io.grpc.ServerCall public final void sendMessage(RespT respt) { C13115fRJ.g(); try { sendMessageInternal(respt); } finally { C13115fRJ.i(); } } private void sendMessageInternal(RespT respt) { Preconditions.checkState(this.sendHeadersCalled, "sendHeaders has not been called"); Preconditions.checkState(!this.closeCalled, "call is closed"); if (this.method.getType().serverSendsOneMessage() && this.messageSent) { internalClose(Status.INTERNAL.withDescription(TOO_MANY_RESPONSES)); return; } this.messageSent = true; try { this.stream.writeMessage(this.method.streamResponse(respt)); this.stream.flush(); } catch (Error e) { close(Status.CANCELLED.withDescription("Server sendMessage() failed with Error"), new Metadata()); throw e; } catch (RuntimeException e2) { close(Status.fromThrowable(e2), new Metadata()); } } @Override // io.grpc.ServerCall public final void setMessageCompression(boolean z) { this.stream.setMessageCompression(z); } @Override // io.grpc.ServerCall public final void setCompression(String str) { Preconditions.checkState(!this.sendHeadersCalled, "sendHeaders has been called"); Compressor lookupCompressor = this.compressorRegistry.lookupCompressor(str); this.compressor = lookupCompressor; Preconditions.checkArgument(lookupCompressor != null, "Unable to find compressor by name %s", str); } @Override // io.grpc.ServerCall public final boolean isReady() { if (this.closeCalled) { return false; } return this.stream.isReady(); } @Override // io.grpc.ServerCall public final void close(Status status, Metadata metadata) { C13115fRJ.g(); try { closeInternal(status, metadata); } finally { C13115fRJ.i(); } } private void closeInternal(Status status, Metadata metadata) { CallTracer callTracer; Preconditions.checkState(!this.closeCalled, "call already closed"); try { this.closeCalled = true; if (status.isOk() && this.method.getType().serverSendsOneMessage() && !this.messageSent) { internalClose(Status.INTERNAL.withDescription(MISSING_RESPONSE)); callTracer = this.serverCallTracer; } else { this.stream.close(status, metadata); callTracer = this.serverCallTracer; } callTracer.reportCallEnded(status.isOk()); } catch (Throwable th) { this.serverCallTracer.reportCallEnded(status.isOk()); throw th; } } /* JADX INFO: Access modifiers changed from: package-private */ public final ServerStreamListener newServerStreamListener(ServerCall.Listener listener) { return new ServerStreamListenerImpl(this, listener, this.context); } @Override // io.grpc.ServerCall public final Attributes getAttributes() { return this.stream.getAttributes(); } @Override // io.grpc.ServerCall public final String getAuthority() { return this.stream.getAuthority(); } private void internalClose(Status status) { log.log(Level.WARNING, "Cancelling the stream with status {0}", new Object[]{status}); this.stream.cancel(status); this.serverCallTracer.reportCallEnded(status.isOk()); } /* loaded from: classes6.dex */ static final class ServerStreamListenerImpl implements ServerStreamListener { private final ServerCallImpl call; private final Context.CancellableContext context; private final ServerCall.Listener listener; public ServerStreamListenerImpl(ServerCallImpl serverCallImpl, ServerCall.Listener listener, Context.CancellableContext cancellableContext) { this.call = (ServerCallImpl) Preconditions.checkNotNull(serverCallImpl, "call"); this.listener = (ServerCall.Listener) Preconditions.checkNotNull(listener, "listener must not be null"); Context.CancellableContext cancellableContext2 = (Context.CancellableContext) Preconditions.checkNotNull(cancellableContext, "context"); this.context = cancellableContext2; cancellableContext2.addListener(new Context.CancellationListener(this) { // from class: io.grpc.internal.ServerCallImpl.ServerStreamListenerImpl.1 final ServerStreamListenerImpl this$0; { this.this$0 = this; } @Override // io.grpc.Context.CancellationListener public void cancelled(Context context) { if (context.cancellationCause() != null) { this.this$0.call.cancelled = true; } } }, MoreExecutors.directExecutor()); } @Override // io.grpc.internal.StreamListener public final void messagesAvailable(StreamListener.MessageProducer messageProducer) { fRN unused = ((ServerCallImpl) this.call).tag; C13115fRJ.g(); try { messagesAvailableInternal(messageProducer); } finally { fRN unused2 = ((ServerCallImpl) this.call).tag; C13115fRJ.i(); } } /* JADX WARN: Multi-variable type inference failed */ private void messagesAvailableInternal(StreamListener.MessageProducer messageProducer) { if (((ServerCallImpl) this.call).cancelled) { GrpcUtil.closeQuietly(messageProducer); return; } while (true) { try { InputStream next = messageProducer.next(); if (next == null) { return; } try { this.listener.onMessage(((ServerCallImpl) this.call).method.parseRequest(next)); next.close(); } finally { } } catch (Throwable th) { GrpcUtil.closeQuietly(messageProducer); Throwables.throwIfUnchecked(th); throw new RuntimeException(th); } } } @Override // io.grpc.internal.ServerStreamListener public final void halfClosed() { ServerCallImpl serverCallImpl; fRN unused = ((ServerCallImpl) this.call).tag; C13115fRJ.g(); try { if (((ServerCallImpl) this.call).cancelled) { serverCallImpl = this.call; } else { this.listener.onHalfClose(); serverCallImpl = this.call; } fRN unused2 = ((ServerCallImpl) serverCallImpl).tag; C13115fRJ.i(); } catch (Throwable th) { fRN unused3 = ((ServerCallImpl) this.call).tag; C13115fRJ.i(); throw th; } } @Override // io.grpc.internal.ServerStreamListener public final void closed(Status status) { fRN unused = ((ServerCallImpl) this.call).tag; C13115fRJ.g(); try { closedInternal(status); } finally { fRN unused2 = ((ServerCallImpl) this.call).tag; C13115fRJ.i(); } } private void closedInternal(Status status) { try { if (!status.isOk()) { ((ServerCallImpl) this.call).cancelled = true; this.listener.onCancel(); } else { this.listener.onComplete(); } } finally { this.context.cancel(null); } } @Override // io.grpc.internal.StreamListener public final void onReady() { ServerCallImpl serverCallImpl; fRN unused = ((ServerCallImpl) this.call).tag; C13115fRJ.g(); try { if (((ServerCallImpl) this.call).cancelled) { serverCallImpl = this.call; } else { this.listener.onReady(); serverCallImpl = this.call; } fRN unused2 = ((ServerCallImpl) serverCallImpl).tag; C13115fRJ.i(); } catch (Throwable th) { fRN unused3 = ((ServerCallImpl) this.call).tag; C13115fRJ.i(); throw th; } } } @Override // io.grpc.ServerCall public final boolean isCancelled() { return this.cancelled; } @Override // io.grpc.ServerCall public final MethodDescriptor getMethodDescriptor() { return this.method; } }