grpc 1.82.0 → 1.83.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8 -5
  3. data/etc/roots.pem +10400 -3855
  4. data/include/grpc/grpc_audit_logging.h +2 -2
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +23 -0
  7. data/src/core/call/call_filters.h +19 -3
  8. data/src/core/call/call_spine.h +4 -4
  9. data/src/core/call/client_call.cc +1 -1
  10. data/src/core/call/metadata.cc +7 -2
  11. data/src/core/call/server_call.cc +13 -3
  12. data/src/core/call/server_call.h +5 -3
  13. data/src/core/client_channel/backup_poller.cc +2 -17
  14. data/src/core/client_channel/client_channel.cc +17 -14
  15. data/src/core/client_channel/client_channel.h +3 -1
  16. data/src/core/client_channel/client_channel_filter.cc +11 -13
  17. data/src/core/client_channel/client_channel_service_config.cc +5 -13
  18. data/src/core/client_channel/direct_channel.cc +5 -1
  19. data/src/core/client_channel/direct_channel.h +3 -1
  20. data/src/core/config/experiment_env_var.cc +30 -0
  21. data/src/core/config/experiment_env_var.h +26 -0
  22. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +6 -6
  23. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +14 -2
  24. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.cc +172 -0
  25. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +103 -0
  26. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +3 -2
  27. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +10 -3
  28. data/src/core/credentials/transport/tls/tls_security_connector.cc +14 -2
  29. data/src/core/credentials/transport/xds/xds_credentials.cc +4 -12
  30. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -1
  31. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -13
  32. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +11 -9
  33. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  34. data/src/core/ext/transport/chttp2/transport/flow_control.h +3 -2
  35. data/src/core/ext/transport/chttp2/transport/frame.cc +58 -1
  36. data/src/core/ext/transport/chttp2/transport/frame.h +13 -1
  37. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -4
  38. data/src/core/ext/transport/chttp2/transport/frame_security.cc +10 -1
  39. data/src/core/ext/transport/chttp2/transport/frame_security.h +2 -1
  40. data/src/core/ext/transport/chttp2/transport/goaway.cc +11 -1
  41. data/src/core/ext/transport/chttp2/transport/goaway.h +17 -1
  42. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -0
  43. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +117 -276
  44. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +44 -17
  45. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +382 -496
  46. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +75 -77
  47. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  48. data/src/core/ext/transport/chttp2/transport/http2_settings.h +30 -11
  49. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +24 -9
  50. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +26 -0
  51. data/src/core/ext/transport/chttp2/transport/http2_transport.h +2 -0
  52. data/src/core/ext/transport/chttp2/transport/internal.h +4 -0
  53. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  54. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +1 -1
  55. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +4 -10
  56. data/src/core/ext/transport/chttp2/transport/read_context.h +62 -20
  57. data/src/core/ext/transport/chttp2/transport/security_frame.h +1 -0
  58. data/src/core/ext/transport/chttp2/transport/stream.h +271 -120
  59. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +77 -61
  60. data/src/core/handshaker/security/secure_endpoint.cc +0 -13
  61. data/src/core/lib/channel/promise_based_filter.cc +77 -3
  62. data/src/core/lib/channel/promise_based_filter.h +238 -184
  63. data/src/core/lib/event_engine/extensions/receive_coalescing_extension.h +0 -4
  64. data/src/core/lib/event_engine/extensions/tcp_trace.h +1 -1
  65. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -12
  66. data/src/core/lib/event_engine/shim.cc +2 -16
  67. data/src/core/lib/event_engine/shim.h +0 -4
  68. data/src/core/lib/experiments/experiments.cc +51 -102
  69. data/src/core/lib/experiments/experiments.h +37 -59
  70. data/src/core/lib/iomgr/error.cc +3 -73
  71. data/src/core/lib/iomgr/error.h +8 -6
  72. data/src/core/lib/iomgr/error_cfstream.cc +1 -2
  73. data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -6
  74. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -6
  75. data/src/core/lib/iomgr/tcp_posix.cc +2 -6
  76. data/src/core/lib/security/authorization/audit_logging.cc +2 -2
  77. data/src/core/lib/security/authorization/audit_logging.h +3 -3
  78. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +11 -13
  79. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  80. data/src/core/lib/security/authorization/matchers.cc +20 -20
  81. data/src/core/lib/security/authorization/matchers.h +15 -16
  82. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  83. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  84. data/src/core/lib/security/authorization/stdout_logger.h +6 -5
  85. data/src/core/lib/surface/call.cc +0 -8
  86. data/src/core/lib/surface/call.h +2 -0
  87. data/src/core/lib/surface/channel.cc +21 -2
  88. data/src/core/lib/surface/channel.h +14 -6
  89. data/src/core/lib/surface/filter_stack_call.cc +10 -29
  90. data/src/core/lib/surface/legacy_channel.cc +7 -7
  91. data/src/core/lib/surface/legacy_channel.h +3 -1
  92. data/src/core/lib/surface/version.cc +2 -2
  93. data/src/core/lib/transport/bdp_estimator.cc +13 -13
  94. data/src/core/lib/transport/bdp_estimator.h +9 -5
  95. data/src/core/lib/transport/error_utils.cc +26 -138
  96. data/src/core/lib/transport/promise_endpoint.h +2 -4
  97. data/src/core/load_balancing/grpclb/grpclb.cc +2 -1
  98. data/src/core/load_balancing/pick_first/pick_first.cc +33 -2
  99. data/src/core/load_balancing/pick_first/pick_first.h +6 -0
  100. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -10
  101. data/src/core/load_balancing/rls/rls.cc +2 -1
  102. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +2 -7
  103. data/src/core/load_balancing/xds/cds.cc +80 -56
  104. data/src/core/load_balancing/xds/cds.h +21 -0
  105. data/src/core/mitigation_engine/mitigation.h +53 -0
  106. data/src/core/mitigation_engine/mitigation_provider.h +62 -0
  107. data/src/core/resolver/dns/dns_resolver_plugin.cc +1 -6
  108. data/src/core/resolver/xds/xds_resolver.cc +14 -11
  109. data/src/core/server/server.h +1 -4
  110. data/src/core/server/server_config_selector.h +5 -4
  111. data/src/core/server/server_config_selector_filter.cc +67 -80
  112. data/src/core/server/xds_server_config_fetcher.cc +681 -692
  113. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -12
  114. data/src/core/telemetry/call_tracer.cc +49 -2
  115. data/src/core/telemetry/call_tracer.h +1 -0
  116. data/src/core/telemetry/tcp_tracer.h +38 -0
  117. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  118. data/src/core/tsi/ssl_telemetry_utils.cc +343 -0
  119. data/src/core/tsi/ssl_telemetry_utils.h +74 -0
  120. data/src/core/tsi/ssl_transport_security.cc +577 -301
  121. data/src/core/tsi/ssl_transport_security.h +22 -6
  122. data/src/core/tsi/ssl_transport_security_utils.cc +2 -0
  123. data/src/core/tsi/transport_security.h +7 -0
  124. data/src/core/util/http_client/httpcli.cc +1 -4
  125. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  126. data/src/core/util/status_helper.cc +71 -192
  127. data/src/core/util/status_helper.h +16 -21
  128. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +2 -11
  129. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -7
  130. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -16
  131. data/src/core/xds/grpc/xds_common_types.cc +94 -38
  132. data/src/core/xds/grpc/xds_common_types.h +33 -18
  133. data/src/core/xds/grpc/xds_common_types_parser.cc +168 -100
  134. data/src/core/xds/grpc/xds_common_types_parser.h +18 -1
  135. data/src/core/xds/grpc/xds_endpoint_parser.cc +6 -17
  136. data/src/core/xds/grpc/xds_http_filter_registry.cc +2 -10
  137. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -12
  138. data/src/core/xds/grpc/xds_metadata_parser.cc +0 -2
  139. data/src/core/xds/grpc/xds_route_config_parser.cc +7 -11
  140. data/src/core/xds/grpc/xds_routing.cc +113 -82
  141. data/src/core/xds/grpc/xds_routing.h +70 -20
  142. data/src/core/xds/grpc/xds_server_grpc.cc +22 -13
  143. data/src/core/xds/grpc/xds_server_grpc.h +16 -2
  144. data/src/core/xds/grpc/xds_server_grpc_interface.h +10 -0
  145. data/src/core/xds/grpc/xds_transport_grpc.cc +123 -18
  146. data/src/core/xds/grpc/xds_transport_grpc.h +28 -4
  147. data/src/core/xds/xds_client/lrs_client.cc +3 -7
  148. data/src/core/xds/xds_client/xds_bootstrap.cc +4 -16
  149. data/src/core/xds/xds_client/xds_client.cc +2 -15
  150. data/src/core/xds/xds_client/xds_transport.h +3 -0
  151. data/src/ruby/lib/grpc/version.rb +1 -1
  152. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -1
  153. metadata +9 -1
@@ -294,13 +294,14 @@ struct Http2FrameCountTracker {
294
294
  http2::Http2Status ValidateSettingsValues(
295
295
  std::vector<Http2SettingsFrame::Setting>& list);
296
296
 
297
+ // The checks in this function MUST be done before the frame payload is read.
297
298
  http2::Http2Status ValidateFrameHeader(
298
299
  const uint32_t max_frame_size_setting,
299
300
  const bool incoming_header_in_progress,
300
301
  const uint32_t incoming_header_stream_id,
301
302
  const Http2FrameHeader& current_frame_header, const uint32_t last_stream_id,
302
303
  const bool is_client, const bool is_first_settings_processed,
303
- Http2FrameCountTracker& tracker);
304
+ Http2FrameCountTracker& tracker, const uint32_t max_security_frame_size);
304
305
 
305
306
  ///////////////////////////////////////////////////////////////////////////////
306
307
  // RFC9113 Related Strings and Consts
@@ -424,6 +425,7 @@ inline constexpr uint32_t kHttp2InitialWindowSize = 65535u;
424
425
  } // namespace RFC9113
425
426
 
426
427
  namespace GrpcErrors {
428
+
427
429
  inline constexpr absl::string_view kTooManyMetadata =
428
430
  "gRPC Error : A gRPC server can send upto 1 initial metadata followed by "
429
431
  "upto 1 trailing metadata.";
@@ -441,6 +443,16 @@ inline constexpr absl::string_view kFailedToEnqueueStream =
441
443
  "gRPC Transport Error : Failed to enqueue stream to writable stream list";
442
444
  inline constexpr absl::string_view kStreamCreationFailed =
443
445
  "gRPC Transport Error : Stream creation failed";
446
+
447
+ inline constexpr uint32_t kDefaultMaxPendingInducedFrames = 10000u;
448
+
449
+ // Security frame related limits and errors
450
+ inline constexpr uint32_t kMaxSecurityFrameSize = 16u * 1024u;
451
+ inline constexpr int kMinMaxSecurityFrameSize = 0;
452
+ inline constexpr absl::string_view kSecurityFrameTooLarge =
453
+ "gRPC Transport Error : Security frame is larger than the maximum allowed "
454
+ "size : ";
455
+
444
456
  } // namespace GrpcErrors
445
457
 
446
458
  } // namespace grpc_core
@@ -132,10 +132,8 @@ grpc_error_handle grpc_chttp2_rst_stream_parser_parse(void* parser,
132
132
  if (reason != static_cast<uint32_t>(Http2ErrorCode::kNoError) ||
133
133
  s->trailing_metadata_buffer.empty()) {
134
134
  error = grpc_error_set_int(
135
- grpc_error_set_str(
136
- GRPC_ERROR_CREATE("RST_STREAM"),
137
- grpc_core::StatusStrProperty::kGrpcMessage,
138
- absl::StrCat("Received RST_STREAM with error code ", reason)),
135
+ GRPC_ERROR_CREATE(absl::StrCat(
136
+ "RST_STREAM (Received RST_STREAM with error code ", reason, ")")),
139
137
  grpc_core::StatusIntProperty::kHttp2Error,
140
138
  static_cast<intptr_t>(reason));
141
139
  }
@@ -27,6 +27,7 @@
27
27
  #include "src/core/lib/transport/transport_framing_endpoint_extension.h"
28
28
  #include "src/core/util/grpc_check.h"
29
29
  #include "absl/status/status.h"
30
+ #include "absl/strings/str_cat.h"
30
31
 
31
32
  absl::Status grpc_chttp2_security_frame_parser_parse(void* parser,
32
33
  grpc_chttp2_transport* t,
@@ -52,7 +53,15 @@ absl::Status grpc_chttp2_security_frame_parser_parse(void* parser,
52
53
  }
53
54
 
54
55
  absl::Status grpc_chttp2_security_frame_parser_begin_frame(
55
- grpc_chttp2_security_frame_parser* parser) {
56
+ grpc_chttp2_security_frame_parser* parser, const uint32_t length,
57
+ const uint32_t max_frame_size) {
58
+ if (GPR_UNLIKELY(length > max_frame_size &&
59
+ grpc_core::IsCustomFrameCheckEnabled())) {
60
+ return GRPC_ERROR_CREATE(absl::StrCat(
61
+ "gRPC Transport Error : Security frame is larger than the maximum "
62
+ "allowed size : ",
63
+ max_frame_size, ", Received size : ", length));
64
+ }
56
65
  parser->payload.Clear();
57
66
  return absl::OkStatus();
58
67
  }
@@ -35,7 +35,8 @@ void grpc_chttp2_security_frame_create(grpc_slice_buffer* payload,
35
35
  grpc_slice_buffer* frame);
36
36
 
37
37
  absl::Status grpc_chttp2_security_frame_parser_begin_frame(
38
- grpc_chttp2_security_frame_parser* parser);
38
+ grpc_chttp2_security_frame_parser* parser, uint32_t length,
39
+ uint32_t max_frame_size);
39
40
 
40
41
  grpc_error_handle grpc_chttp2_security_frame_parser_parse(
41
42
  void* parser, grpc_chttp2_transport* t, grpc_chttp2_stream* s,
@@ -32,6 +32,7 @@ GoawayManager::GoawayManager(std::unique_ptr<GoawayInterface> goaway_interface)
32
32
  std::optional<Http2Frame> GoawayManager::MaybeGetGoawayFrame() {
33
33
  switch (context_->goaway_state) {
34
34
  case GoawayState::kIdle:
35
+ case GoawayState::kInitialGracefulGoawaySent:
35
36
  case GoawayState::kDone:
36
37
  break;
37
38
  case GoawayState::kInitialGracefulGoawayScheduled: {
@@ -85,9 +86,16 @@ void GoawayManager::Context::SentGoawayTransition() {
85
86
  << GoawayStateToString(goaway_state);
86
87
  switch (goaway_state) {
87
88
  case GoawayState::kIdle:
88
- case GoawayState::kInitialGracefulGoawayScheduled:
89
+ case GoawayState::kInitialGracefulGoawaySent:
89
90
  case GoawayState::kDone:
90
91
  break;
92
+ case GoawayState::kInitialGracefulGoawayScheduled: {
93
+ GRPC_HTTP2_GOAWAY_LOG
94
+ << "Transitioning to kInitialGracefulGoawaySent from "
95
+ << GoawayStateToString(goaway_state);
96
+ goaway_state = GoawayState::kInitialGracefulGoawaySent;
97
+ break;
98
+ }
91
99
  case GoawayState::kFinalGracefulGoawayScheduled:
92
100
  case GoawayState::kImmediateGoawayRequested: {
93
101
  GRPC_HTTP2_GOAWAY_LOG << "Transitioning to kDone from "
@@ -109,6 +117,8 @@ std::string GoawayManager::Context::GoawayStateToString(
109
117
  return "kIdle";
110
118
  case GoawayState::kInitialGracefulGoawayScheduled:
111
119
  return "kInitialGracefulGoawayScheduled";
120
+ case GoawayState::kInitialGracefulGoawaySent:
121
+ return "kInitialGracefulGoawaySent";
112
122
  case GoawayState::kFinalGracefulGoawayScheduled:
113
123
  return "kFinalGracefulGoawayScheduled";
114
124
  case GoawayState::kImmediateGoawayRequested:
@@ -64,6 +64,8 @@ enum class GoawayState : uint8_t {
64
64
  // Initial graceful GOAWAY is scheduled to be sent in the next transport write
65
65
  // cycle.
66
66
  kInitialGracefulGoawayScheduled,
67
+ // Initial graceful GOAWAY has been written on the wire.
68
+ kInitialGracefulGoawaySent,
67
69
  // Final graceful GOAWAY is scheduled to be sent in the next transport write
68
70
  // cycle. Sending this GOAWAY frame completes the graceful GOAWAY process and
69
71
  // transitions the state to kDone.
@@ -161,6 +163,7 @@ class GoawayManager {
161
163
  absl::Status TriggerWriteCycle();
162
164
 
163
165
  GoawayState goaway_state = GoawayState::kIdle;
166
+ bool was_immediate = false;
164
167
  std::unique_ptr<GoawayInterface> goaway_interface;
165
168
  // TODO(akshitpatel) : [PH2][P4] : There is scope to make this
166
169
  // IntractivityWaker.
@@ -222,6 +225,7 @@ class GoawayManager {
222
225
  << " -> "
223
226
  "kImmediateGoawayRequested.";
224
227
 
228
+ ctx->was_immediate = true;
225
229
  ctx->goaway_state = GoawayState::kImmediateGoawayRequested;
226
230
  ctx->SetGoawayArgs(
227
231
  /*error_code=*/static_cast<uint32_t>(error_code),
@@ -275,6 +279,7 @@ class GoawayManager {
275
279
  << " -> "
276
280
  "kInitialGracefulGoawayScheduled.";
277
281
  GRPC_DCHECK(error_code == Http2ErrorCode::kNoError);
282
+ ctx->was_immediate = false;
278
283
  ctx->goaway_state = GoawayState::kInitialGracefulGoawayScheduled;
279
284
  ctx->SetGoawayArgs(
280
285
  /*error_code=*/static_cast<uint32_t>(Http2ErrorCode::kNoError),
@@ -290,7 +295,7 @@ class GoawayManager {
290
295
  << "Ping resolved. Current state: "
291
296
  << ctx->GoawayStateToString(ctx->goaway_state);
292
297
  if (ctx->goaway_state ==
293
- GoawayState::kInitialGracefulGoawayScheduled) {
298
+ GoawayState::kInitialGracefulGoawaySent) {
294
299
  GRPC_HTTP2_GOAWAY_LOG
295
300
  << " [Graceful GOAWAY] state change "
296
301
  << ctx->GoawayStateToString(ctx->goaway_state)
@@ -349,6 +354,17 @@ class GoawayManager {
349
354
  return context_->goaway_state == GoawayState::kImmediateGoawayRequested;
350
355
  }
351
356
 
357
+ bool IsFinalGracefulGoawayScheduledOrSent() const {
358
+ return (context_->goaway_state ==
359
+ GoawayState::kFinalGracefulGoawayScheduled) ||
360
+ IsFinalGracefulGoawaySent();
361
+ }
362
+
363
+ bool IsFinalGracefulGoawaySent() const {
364
+ return context_->goaway_state == GoawayState::kDone &&
365
+ !context_->was_immediate;
366
+ }
367
+
352
368
  // Called from the transport write cycle to notify the GOAWAY manager that a
353
369
  // GOAWAY frame may have been sent. If a GOAWAY frame is sent in current
354
370
  // write cycle, this function handles the needed state transition.
@@ -996,6 +996,15 @@ class HPackParser::Parser {
996
996
  }
997
997
  }
998
998
  auto value_slice = value.value.Take();
999
+ if (IsOptimization05Enabled() && !state_.is_binary_header &&
1000
+ state_.field_error.ok()) {
1001
+ auto r =
1002
+ ValidateNonBinaryHeaderValueIsLegal(value_slice.as_string_view());
1003
+ if (r != ValidateMetadataResult::kOk) {
1004
+ input_->SetErrorAndContinueParsing(
1005
+ HpackParseResult::InvalidMetadataError(r, key_string));
1006
+ }
1007
+ }
999
1008
  const auto transport_size =
1000
1009
  key_string.size() + value.wire_size + hpack_constants::kEntryOverhead;
1001
1010
  if (state_.mitigation_engine != nullptr) {