private HttpRequestMessage CreateHttpRequestMessage(TimeSpan?timeout) { var message = new HttpRequestMessage(HttpMethod.Post, _grpcMethodInfo.CallUri); message.Version = GrpcProtocolConstants.Http2Version; #if NET5_0 message.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher; #endif // Set raw headers on request using name/values. Typed headers allocate additional objects. var headers = message.Headers; // User agent is optional but recommended. headers.TryAddWithoutValidation(GrpcProtocolConstants.UserAgentHeader, GrpcProtocolConstants.UserAgentHeaderValue); // TE is required by some servers, e.g. C Core. // A missing TE header results in servers aborting the gRPC call. headers.TryAddWithoutValidation(GrpcProtocolConstants.TEHeader, GrpcProtocolConstants.TEHeaderValue); headers.TryAddWithoutValidation(GrpcProtocolConstants.MessageAcceptEncodingHeader, Channel.MessageAcceptEncoding); // https://github.com/grpc/proposal/blob/master/A6-client-retries.md#exposed-retry-metadata if (_attemptCount > 1) { headers.TryAddWithoutValidation(GrpcProtocolConstants.RetryPreviousAttemptsHeader, (_attemptCount - 1).ToString(CultureInfo.InvariantCulture)); } if (Options.Headers != null && Options.Headers.Count > 0) { foreach (var entry in Options.Headers) { if (entry.Key == GrpcProtocolConstants.TimeoutHeader) { // grpc-timeout is set via CallOptions.Deadline continue; } else if (entry.Key == GrpcProtocolConstants.CompressionRequestAlgorithmHeader) { // grpc-internal-encoding-request is used in the client to set message compression. // 'grpc-encoding' is sent even if WriteOptions.Flags = NoCompress. In that situation // individual messages will not be written with compression. headers.TryAddWithoutValidation(GrpcProtocolConstants.MessageEncodingHeader, entry.Value); } else { GrpcProtocolHelpers.AddHeader(headers, entry); } } } if (timeout != null) { headers.TryAddWithoutValidation(GrpcProtocolConstants.TimeoutHeader, GrpcProtocolHelpers.EncodeTimeout(timeout.Value.Ticks / TimeSpan.TicksPerMillisecond)); } return(message); }
private HttpRequestMessage CreateHttpRequestMessage(TimeSpan?timeout) { var message = new HttpRequestMessage(HttpMethod.Post, _grpcMethodInfo.CallUri); message.Version = HttpVersion.Version20; // Set raw headers on request using name/values. Typed headers allocate additional objects. var headers = message.Headers; // User agent is optional but recommended. headers.Add(GrpcProtocolConstants.UserAgentHeader, GrpcProtocolConstants.UserAgentHeaderValue); // TE is required by some servers, e.g. C Core. // A missing TE header results in servers aborting the gRPC call. headers.Add(GrpcProtocolConstants.TEHeader, GrpcProtocolConstants.TEHeaderValue); headers.Add(GrpcProtocolConstants.MessageAcceptEncodingHeader, Channel.MessageAcceptEncoding); if (Options.Headers != null && Options.Headers.Count > 0) { foreach (var entry in Options.Headers) { if (entry.Key == GrpcProtocolConstants.TimeoutHeader) { // grpc-timeout is set via CallOptions.Deadline continue; } else if (entry.Key == GrpcProtocolConstants.CompressionRequestAlgorithmHeader) { // grpc-internal-encoding-request is used in the client to set message compression. // 'grpc-encoding' is sent even if WriteOptions.Flags = NoCompress. In that situation // individual messages will not be written with compression. headers.Add(GrpcProtocolConstants.MessageEncodingHeader, entry.Value); } else { GrpcProtocolHelpers.AddHeader(headers, entry); } } } if (timeout != null) { headers.Add(GrpcProtocolConstants.TimeoutHeader, GrpcProtocolHelpers.EncodeTimeout(timeout.Value.Ticks / TimeSpan.TicksPerMillisecond)); } return(message); }