private HttpRequestMessage CreateHttpRequestMessage() { var message = new HttpRequestMessage(HttpMethod.Post, _uri); message.Version = new Version(2, 0); // User agent is optional but recommended message.Headers.UserAgent.Add(GrpcProtocolConstants.UserAgentHeader); // TE is required by some servers, e.g. C Core // A missing TE header results in servers aborting the gRPC call message.Headers.TE.Add(GrpcProtocolConstants.TEHeader); if (Options.Headers != null && Options.Headers.Count > 0) { foreach (var entry in Options.Headers) { // Deadline is set via CallOptions.Deadline if (entry.Key == GrpcProtocolConstants.TimeoutHeader) { continue; } var value = entry.IsBinary ? Convert.ToBase64String(entry.ValueBytes) : entry.Value; message.Headers.Add(entry.Key, value); } } if (_timeout != null) { message.Headers.Add(GrpcProtocolConstants.TimeoutHeader, GrpcProtocolHelpers.EncodeTimeout(Convert.ToInt64(_timeout.Value.TotalMilliseconds))); } return(message); }
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); }
private HttpRequestMessage CreateHttpRequestMessage() { var message = new HttpRequestMessage(HttpMethod.Post, _uri); message.Version = new Version(2, 0); // User agent is optional but recommended message.Headers.UserAgent.Add(GrpcProtocolConstants.UserAgentHeader); // TE is required by some servers, e.g. C Core // A missing TE header results in servers aborting the gRPC call message.Headers.TE.Add(GrpcProtocolConstants.TEHeader); message.Headers.Add(GrpcProtocolConstants.MessageAcceptEncodingHeader, GrpcProtocolConstants.MessageAcceptEncodingValue); 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 message.Headers.Add(GrpcProtocolConstants.MessageEncodingHeader, entry.Value); } else { AddHeader(message.Headers, entry); } } } if (_timeout != null) { message.Headers.Add(GrpcProtocolConstants.TimeoutHeader, GrpcProtocolHelpers.EncodeTimeout(Convert.ToInt64(_timeout.Value.TotalMilliseconds))); } return(message); }