Пример #1
0
        public override void Complete()
        {
            switch (_state)
            {
            case InternalState.IncompleteBufferWriter:
                _state = InternalState.CompleteBufferWriter;

                if (!DirectSerializationSupported)
                {
                    CompatibilityExtensions.Assert(_bufferWriter != null, "Buffer writer has been set to get to this state.");

                    var data = _bufferWriter.WrittenSpan;

                    GrpcCallLog.SerializedMessage(_call.Logger, _call.RequestType, data.Length);
                    WriteMessage(data);
                }
                else
                {
                    GrpcCallLog.SerializedMessage(_call.Logger, _call.RequestType, _payloadLength.GetValueOrDefault());
                }
                break;

            default:
                ThrowInvalidState(_state);
                break;
            }
        }
Пример #2
0
        public override IBufferWriter <byte> GetBufferWriter()
        {
            switch (_state)
            {
            case InternalState.Initialized:
                var bufferWriter = ResolveBufferWriter();

                // When writing directly to the buffer the header with message size needs to be written first
                if (DirectSerializationSupported)
                {
                    CompatibilityExtensions.Assert(_payloadLength != null, "A payload length is required for direct serialization.");

                    EnsureMessageSizeAllowed(_payloadLength.Value);

                    WriteHeader(_buffer, _payloadLength.Value, compress: false);
                    _bufferPosition += GrpcProtocolConstants.HeaderSize;
                }

                _state = InternalState.IncompleteBufferWriter;
                return(bufferWriter);

            case InternalState.IncompleteBufferWriter:
                return(ResolveBufferWriter());

            default:
                ThrowInvalidState(_state);
                return(default !);
            }
        }
Пример #3
0
        private ICompressionProvider?ResolveCompressionProvider()
        {
            CompatibilityExtensions.Assert(
                _call.RequestGrpcEncoding != null,
                "Response encoding should have been calculated at this point.");

            var canCompress =
                GrpcProtocolHelpers.CanWriteCompressed(CallOptions.WriteOptions) &&
                !string.Equals(_call.RequestGrpcEncoding, GrpcProtocolConstants.IdentityGrpcEncoding, StringComparison.Ordinal);

            if (canCompress)
            {
                if (_call.Channel.CompressionProviders.TryGetValue(_call.RequestGrpcEncoding, out var compressionProvider))
                {
                    return(compressionProvider);
                }

                throw new InvalidOperationException($"Could not find compression provider for '{_call.RequestGrpcEncoding}'.");
            }

            return(null);
        }
Пример #4
0
        private async Task <Metadata> GetResponseHeadersCoreAsync()
        {
            CompatibilityExtensions.Assert(_httpResponseTask != null);

            try
            {
                var httpResponse = await _httpResponseTask.ConfigureAwait(false);

                // Check if the headers have a status. If they do then wait for the overall call task
                // to complete before returning headers. This means that if the call failed with a
                // a status then it is possible to await response headers and then call GetStatus().
                var grpcStatus = GrpcProtocolHelpers.GetHeaderValue(httpResponse.Headers, GrpcProtocolConstants.StatusTrailer);
                if (grpcStatus != null)
                {
                    await CallTask.ConfigureAwait(false);
                }

                return(GrpcProtocolHelpers.BuildMetadata(httpResponse.Headers));
            }
            catch (Exception ex) when(ResolveException(ErrorStartingCallMessage, ex, out _, out var resolvedException))
            {
                throw resolvedException;
            }
        }