예제 #1
0
        private static Task WriteMessageCoreAsync(this PipeWriter pipeWriter, byte[] messageData, HttpContextServerCallContext serverCallContext, bool flush)
        {
            Debug.Assert(serverCallContext.ResponseGrpcEncoding != null);

            var isCompressed =
                serverCallContext.CanWriteCompressed() &&
                !string.Equals(serverCallContext.ResponseGrpcEncoding, GrpcProtocolConstants.IdentityGrpcEncoding, StringComparison.Ordinal);

            if (isCompressed)
            {
                messageData = GrpcProtocolHelpers.CompressMessage(
                    serverCallContext.ResponseGrpcEncoding,
                    serverCallContext.ServiceOptions.ResponseCompressionLevel,
                    serverCallContext.ServiceOptions.CompressionProviders,
                    messageData);
            }

            WriteHeader(pipeWriter, messageData.Length, isCompressed);
            pipeWriter.Write(messageData);

            if (flush)
            {
                serverCallContext.HasBufferedMessage = false;
                return(pipeWriter.FlushAsync().GetAsTask());
            }
            else
            {
                // Set flag so buffered message will be written at the end
                serverCallContext.HasBufferedMessage = true;
            }

            return(Task.CompletedTask);
        }
예제 #2
0
        private static Task WriteMessageCoreAsync(this PipeWriter pipeWriter, byte[] messageData, HttpContextServerCallContext serverCallContext, bool flush)
        {
            Debug.Assert(serverCallContext.ResponseGrpcEncoding != null);

            var isCompressed =
                serverCallContext.CanWriteCompressed() &&
                !string.Equals(serverCallContext.ResponseGrpcEncoding, GrpcProtocolConstants.IdentityGrpcEncoding, StringComparison.Ordinal);

            if (isCompressed)
            {
                messageData = GrpcProtocolHelpers.CompressMessage(
                    serverCallContext.ResponseGrpcEncoding,
                    serverCallContext.ServiceOptions.ResponseCompressionLevel,
                    serverCallContext.ServiceOptions.CompressionProviders,
                    messageData);
            }

            WriteHeader(pipeWriter, messageData.Length, isCompressed);
            pipeWriter.Write(messageData);

            if (flush)
            {
                var valueTask = pipeWriter.FlushAsync();

                if (valueTask.IsCompletedSuccessfully)
                {
                    // We do this to reset the underlying value task (which happens in GetResult())
                    valueTask.GetAwaiter().GetResult();
                    return(Task.CompletedTask);
                }

                return(valueTask.AsTask());
            }

            return(Task.CompletedTask);
        }