grpc 1.23.1 → 1.24.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +757 -477
  3. data/include/grpc/grpc.h +3 -1
  4. data/include/grpc/grpc_security.h +20 -4
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -5
  6. data/include/grpc/impl/codegen/port_platform.h +25 -0
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +78 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.h +36 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +16 -2
  10. data/src/core/ext/filters/client_channel/client_channel.cc +325 -267
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +0 -4
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +23 -32
  13. data/src/core/ext/filters/client_channel/http_proxy.cc +7 -3
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy.h +58 -34
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -50
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +9 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +35 -17
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +130 -215
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +34 -21
  21. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1120 -802
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +8 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +33 -12
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +151 -40
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +184 -26
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +389 -245
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +98 -60
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -1
  29. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -0
  30. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +3 -8
  31. data/src/core/ext/filters/client_channel/server_address.cc +1 -3
  32. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  33. data/src/core/ext/filters/client_channel/subchannel.h +2 -1
  34. data/src/core/ext/filters/client_idle/client_idle_filter.cc +207 -29
  35. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -8
  36. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  37. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +10 -7
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +52 -26
  39. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -20
  40. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +24 -21
  41. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  42. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -24
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  44. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +237 -191
  45. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +29 -27
  46. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
  47. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +19 -4
  48. data/src/core/ext/transport/chttp2/transport/hpack_table.h +13 -4
  49. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -1
  50. data/src/core/ext/transport/chttp2/transport/internal.h +0 -2
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +99 -71
  52. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +222 -0
  53. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +818 -0
  54. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +314 -0
  55. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1142 -0
  56. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +53 -0
  57. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +158 -0
  58. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +34 -0
  59. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +69 -0
  60. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +49 -0
  61. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +240 -0
  62. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +110 -0
  63. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +324 -0
  64. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +235 -0
  65. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +661 -0
  66. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +84 -0
  67. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +274 -0
  68. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +175 -0
  69. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +572 -0
  70. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +150 -0
  71. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +596 -0
  72. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +35 -0
  73. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +80 -0
  74. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +95 -0
  75. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +308 -0
  76. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +128 -0
  77. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +392 -0
  78. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +91 -0
  79. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +236 -0
  80. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +88 -0
  81. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +258 -0
  82. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +111 -0
  83. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +324 -0
  84. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +23 -0
  85. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +50 -0
  86. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +52 -0
  87. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +130 -0
  88. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +39 -0
  89. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +87 -0
  90. data/src/core/ext/upb-generated/envoy/type/range.upb.c +39 -0
  91. data/src/core/ext/upb-generated/envoy/type/range.upb.h +85 -0
  92. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +17 -0
  93. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +30 -0
  94. data/src/core/ext/upb-generated/google/api/annotations.upb.c +18 -0
  95. data/src/core/ext/upb-generated/google/api/annotations.upb.h +30 -0
  96. data/src/core/ext/upb-generated/google/api/http.upb.c +66 -0
  97. data/src/core/ext/upb-generated/google/api/http.upb.h +190 -0
  98. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +27 -0
  99. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +58 -0
  100. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +485 -0
  101. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1690 -0
  102. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +27 -0
  103. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +58 -0
  104. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +22 -0
  105. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +50 -0
  106. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +79 -0
  107. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +215 -0
  108. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +27 -0
  109. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +58 -0
  110. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +106 -0
  111. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +238 -0
  112. data/src/core/ext/upb-generated/google/rpc/status.upb.c +33 -0
  113. data/src/core/ext/upb-generated/google/rpc/status.upb.h +74 -0
  114. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +49 -0
  115. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +126 -0
  116. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +209 -0
  117. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +681 -0
  118. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +42 -0
  119. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +109 -0
  120. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +36 -0
  121. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +84 -0
  122. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +133 -0
  123. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +359 -0
  124. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +58 -0
  125. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +144 -0
  126. data/src/core/ext/upb-generated/validate/validate.upb.c +443 -0
  127. data/src/core/ext/upb-generated/validate/validate.upb.h +2037 -0
  128. data/src/core/lib/channel/channel_args.cc +21 -0
  129. data/src/core/lib/channel/channel_args.h +16 -2
  130. data/src/core/lib/channel/channel_stack.h +2 -1
  131. data/src/core/lib/channel/channelz.cc +54 -56
  132. data/src/core/lib/channel/channelz.h +29 -12
  133. data/src/core/lib/compression/compression.cc +2 -1
  134. data/src/core/lib/compression/compression_internal.h +8 -0
  135. data/src/core/lib/gpr/log_linux.cc +2 -2
  136. data/src/core/lib/gpr/log_posix.cc +2 -2
  137. data/src/core/lib/gpr/time_precise.cc +123 -36
  138. data/src/core/lib/gpr/time_precise.h +37 -0
  139. data/src/core/lib/gprpp/abstract.h +10 -0
  140. data/src/core/lib/gprpp/atomic.h +4 -0
  141. data/src/core/lib/gprpp/inlined_vector.h +20 -4
  142. data/src/core/lib/gprpp/map.h +109 -6
  143. data/src/core/lib/gprpp/memory.h +6 -0
  144. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  145. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -54
  146. data/src/core/lib/iomgr/exec_ctx.cc +27 -17
  147. data/src/core/lib/iomgr/exec_ctx.h +3 -0
  148. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -3
  149. data/src/core/lib/iomgr/tcp_posix.cc +16 -25
  150. data/src/core/lib/iomgr/tcp_server_custom.cc +1 -1
  151. data/src/core/lib/iomgr/timer_manager.cc +8 -1
  152. data/src/core/lib/iomgr/timer_manager.h +2 -0
  153. data/src/core/lib/security/credentials/credentials.h +8 -2
  154. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -0
  155. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -0
  156. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +3 -3
  157. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -12
  158. data/src/core/lib/security/security_connector/ssl_utils.h +10 -6
  159. data/src/core/lib/security/security_connector/ssl_utils_config.cc +32 -0
  160. data/src/core/lib/security/security_connector/ssl_utils_config.h +30 -0
  161. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +161 -49
  162. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +34 -1
  163. data/src/core/lib/slice/slice_intern.cc +17 -9
  164. data/src/core/lib/slice/slice_internal.h +34 -7
  165. data/src/core/lib/slice/slice_utils.h +7 -3
  166. data/src/core/lib/surface/call.cc +97 -57
  167. data/src/core/lib/surface/channel.cc +2 -2
  168. data/src/core/lib/surface/completion_queue.cc +10 -16
  169. data/src/core/lib/surface/init.cc +3 -0
  170. data/src/core/lib/surface/server.cc +11 -14
  171. data/src/core/lib/surface/validate_metadata.cc +4 -0
  172. data/src/core/lib/surface/version.cc +2 -2
  173. data/src/core/lib/transport/metadata.cc +4 -4
  174. data/src/core/lib/transport/metadata_batch.cc +72 -16
  175. data/src/core/lib/transport/metadata_batch.h +38 -0
  176. data/src/core/lib/transport/static_metadata.cc +814 -1023
  177. data/src/core/lib/transport/static_metadata.h +271 -213
  178. data/src/core/lib/transport/transport.h +12 -0
  179. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  180. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +104 -76
  181. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -16
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  183. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +10 -6
  184. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +4 -3
  185. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +74 -48
  186. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +34 -26
  187. data/src/core/tsi/ssl_transport_security.cc +14 -6
  188. data/src/core/tsi/ssl_transport_security.h +4 -0
  189. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  190. data/src/ruby/ext/grpc/ext-export.gcc +6 -0
  191. data/src/ruby/ext/grpc/extconf.rb +5 -0
  192. data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
  193. data/src/ruby/ext/grpc/rb_grpc.c +1 -42
  194. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  195. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  196. data/src/ruby/lib/grpc.rb +2 -0
  197. data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
  198. data/src/ruby/lib/grpc/errors.rb +4 -7
  199. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +9 -4
  200. data/src/ruby/lib/grpc/structs.rb +15 -0
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/errors_spec.rb +1 -0
  203. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
  204. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +34 -0
  205. data/src/ruby/spec/pb/codegen/package_option_spec.rb +53 -29
  206. data/third_party/upb/upb/decode.c +604 -0
  207. data/third_party/upb/upb/decode.h +21 -0
  208. data/third_party/upb/upb/encode.c +378 -0
  209. data/third_party/upb/upb/encode.h +21 -0
  210. data/third_party/upb/upb/generated_util.h +105 -0
  211. data/third_party/upb/upb/msg.c +111 -0
  212. data/third_party/upb/upb/msg.h +69 -0
  213. data/third_party/upb/upb/port.c +27 -0
  214. data/third_party/upb/upb/port_def.inc +152 -0
  215. data/third_party/upb/upb/port_undef.inc +21 -0
  216. data/third_party/upb/upb/table.c +911 -0
  217. data/third_party/upb/upb/table.int.h +507 -0
  218. data/third_party/upb/upb/upb.c +261 -0
  219. data/third_party/upb/upb/upb.h +364 -0
  220. metadata +134 -55
  221. data/src/core/ext/filters/client_channel/health/health.pb.c +0 -23
  222. data/src/core/ext/filters/client_channel/health/health.pb.h +0 -73
  223. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +0 -19
  224. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +0 -54
  225. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +0 -19
  226. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +0 -54
  227. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +0 -89
  228. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -164
  229. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +0 -520
  230. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +0 -323
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +0 -145
  232. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +0 -149
  233. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -47
  234. data/src/core/tsi/alts/handshaker/altscontext.pb.h +0 -63
  235. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -122
  236. data/src/core/tsi/alts/handshaker/handshaker.pb.h +0 -254
  237. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -49
  238. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +0 -78
  239. data/third_party/nanopb/pb.h +0 -579
  240. data/third_party/nanopb/pb_common.c +0 -97
  241. data/third_party/nanopb/pb_common.h +0 -42
  242. data/third_party/nanopb/pb_decode.c +0 -1347
  243. data/third_party/nanopb/pb_decode.h +0 -149
  244. data/third_party/nanopb/pb_encode.c +0 -696
  245. data/third_party/nanopb/pb_encode.h +0 -154
@@ -38,6 +38,9 @@
38
38
  #include "src/core/lib/surface/validate_metadata.h"
39
39
  #include "src/core/lib/transport/http2_errors.h"
40
40
 
41
+ grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser(
42
+ false, "chttp2_hpack_parser");
43
+
41
44
  typedef enum {
42
45
  NOT_BINARY,
43
46
  BINARY_BEGIN,
@@ -643,7 +646,7 @@ static void GPR_ATTRIBUTE_NOINLINE on_hdr_log(grpc_mdelem md) {
643
646
  /* emission helpers */
644
647
  template <bool do_add>
645
648
  static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
646
- if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
649
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
647
650
  on_hdr_log(md);
648
651
  }
649
652
  if (do_add) {
@@ -652,12 +655,7 @@ static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
652
655
  grpc_error* err = grpc_chttp2_hptbl_add(&p->table, md);
653
656
  if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
654
657
  }
655
- if (GPR_UNLIKELY(p->on_header == nullptr)) {
656
- GRPC_MDELEM_UNREF(md);
657
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
658
- }
659
- p->on_header(p->on_header_user_data, md);
660
- return GRPC_ERROR_NONE;
658
+ return p->on_header(p->on_header_user_data, md);
661
659
  }
662
660
 
663
661
  static grpc_core::UnmanagedMemorySlice take_string_extern(
@@ -762,23 +760,26 @@ static grpc_error* parse_stream_dep0(grpc_chttp2_hpack_parser* p,
762
760
  return parse_stream_dep1(p, cur + 1, end);
763
761
  }
764
762
 
763
+ static grpc_error* GPR_ATTRIBUTE_NOINLINE
764
+ on_invalid_hpack_idx(grpc_chttp2_hpack_parser* p) {
765
+ return grpc_error_set_int(
766
+ grpc_error_set_int(
767
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
768
+ GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(p->index)),
769
+ GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
770
+ }
771
+
765
772
  /* emit an indexed field; jumps to begin the next field on completion */
766
773
  static grpc_error* finish_indexed_field(grpc_chttp2_hpack_parser* p,
767
774
  const uint8_t* cur,
768
775
  const uint8_t* end) {
769
- grpc_mdelem md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
770
- if (GRPC_MDISNULL(md)) {
771
- return grpc_error_set_int(
772
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
773
- "Invalid HPACK index received"),
774
- GRPC_ERROR_INT_INDEX,
775
- static_cast<intptr_t>(p->index)),
776
- GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
776
+ grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&p->table, p->index);
777
+ if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
778
+ return on_invalid_hpack_idx(p);
777
779
  }
778
- GRPC_MDELEM_REF(md);
779
780
  GRPC_STATS_INC_HPACK_RECV_INDEXED();
780
781
  grpc_error* err = on_hdr<false>(p, md);
781
- if (err != GRPC_ERROR_NONE) return err;
782
+ if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
782
783
  return parse_begin(p, cur, end);
783
784
  }
784
785
 
@@ -1021,7 +1022,7 @@ static grpc_error* parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
1021
1022
  /* finish parsing a max table size change */
1022
1023
  static grpc_error* finish_max_tbl_size(grpc_chttp2_hpack_parser* p,
1023
1024
  const uint8_t* cur, const uint8_t* end) {
1024
- if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
1025
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
1025
1026
  gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
1026
1027
  }
1027
1028
  grpc_error* err =
@@ -1554,13 +1555,8 @@ static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
1554
1555
  static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
1555
1556
  bool* is) {
1556
1557
  grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
1557
- if (GRPC_MDISNULL(elem)) {
1558
- return grpc_error_set_int(
1559
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1560
- "Invalid HPACK index received"),
1561
- GRPC_ERROR_INT_INDEX,
1562
- static_cast<intptr_t>(p->index)),
1563
- GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
1558
+ if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
1559
+ return on_invalid_hpack_idx(p);
1564
1560
  }
1565
1561
  /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
1566
1562
  * 1. elem was a result of grpc_chttp2_hptbl_lookup
@@ -1596,10 +1592,16 @@ static grpc_error* parse_value_string_with_literal_key(
1596
1592
  return parse_value_string(p, cur, end, is_binary_literal_header(p));
1597
1593
  }
1598
1594
 
1595
+ /* "Uninitialized" header parser to save us a branch in on_hdr(). */
1596
+ static grpc_error* on_header_uninitialized(void* user_data, grpc_mdelem md) {
1597
+ GRPC_MDELEM_UNREF(md);
1598
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
1599
+ }
1600
+
1599
1601
  /* PUBLIC INTERFACE */
1600
1602
 
1601
1603
  void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
1602
- p->on_header = nullptr;
1604
+ p->on_header = on_header_uninitialized;
1603
1605
  p->on_header_user_data = nullptr;
1604
1606
  p->state = parse_begin;
1605
1607
  p->key.data.referenced = grpc_empty_slice();
@@ -1747,7 +1749,7 @@ grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
1747
1749
  grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
1748
1750
  }
1749
1751
  }
1750
- parser->on_header = nullptr;
1752
+ parser->on_header = on_header_uninitialized;
1751
1753
  parser->on_header_user_data = nullptr;
1752
1754
  parser->is_boundary = 0xde;
1753
1755
  parser->is_eof = 0xde;
@@ -46,7 +46,7 @@ typedef struct {
46
46
 
47
47
  struct grpc_chttp2_hpack_parser {
48
48
  /* user specified callback for each header output */
49
- void (*on_header)(void* user_data, grpc_mdelem md);
49
+ grpc_error* (*on_header)(void* user_data, grpc_mdelem md);
50
50
  void* on_header_user_data;
51
51
 
52
52
  grpc_error* last_error;
@@ -44,19 +44,34 @@ void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl* tbl) {
44
44
  tbl->ents = nullptr;
45
45
  }
46
46
 
47
- grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
48
- uint32_t tbl_index) {
47
+ template <bool take_ref>
48
+ static grpc_mdelem lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
49
+ uint32_t tbl_index) {
49
50
  /* Not static - find the value in the list of valid entries */
50
51
  tbl_index -= (GRPC_CHTTP2_LAST_STATIC_ENTRY + 1);
51
52
  if (tbl_index < tbl->num_ents) {
52
53
  uint32_t offset =
53
54
  (tbl->num_ents - 1u - tbl_index + tbl->first_ent) % tbl->cap_entries;
54
- return tbl->ents[offset];
55
+ grpc_mdelem md = tbl->ents[offset];
56
+ if (take_ref) {
57
+ GRPC_MDELEM_REF(md);
58
+ }
59
+ return md;
55
60
  }
56
61
  /* Invalid entry: return error */
57
62
  return GRPC_MDNULL;
58
63
  }
59
64
 
65
+ grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
66
+ uint32_t tbl_index) {
67
+ return lookup_dynamic_index<false>(tbl, tbl_index);
68
+ }
69
+
70
+ grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
71
+ const grpc_chttp2_hptbl* tbl, uint32_t tbl_index) {
72
+ return lookup_dynamic_index<true>(tbl, tbl_index);
73
+ }
74
+
60
75
  /* Evict one element from the table */
61
76
  static void evict1(grpc_chttp2_hptbl* tbl) {
62
77
  grpc_mdelem first_ent = tbl->ents[tbl->first_ent];
@@ -189,7 +204,7 @@ grpc_chttp2_hptbl_find_result grpc_chttp2_hptbl_find(
189
204
 
190
205
  /* See if the string is in the static table */
191
206
  for (i = 0; i < GRPC_CHTTP2_LAST_STATIC_ENTRY; i++) {
192
- grpc_mdelem ent = grpc_static_mdelem_manifested[i];
207
+ grpc_mdelem ent = grpc_static_mdelem_manifested()[i];
193
208
  if (!grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDKEY(ent))) continue;
194
209
  r.index = i + 1u;
195
210
  r.has_value = grpc_slice_eq(GRPC_MDVALUE(md), GRPC_MDVALUE(ent));
@@ -95,6 +95,9 @@ grpc_error* grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl* tbl,
95
95
  /* lookup a table entry based on its hpack index */
96
96
  grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
97
97
  uint32_t tbl_index);
98
+ grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
99
+ const grpc_chttp2_hptbl* tbl, uint32_t tbl_index);
100
+ template <bool take_ref = false>
98
101
  inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
99
102
  uint32_t index) {
100
103
  /* Static table comes first, just return an entry from it.
@@ -103,9 +106,15 @@ inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
103
106
  must follow the hpack standard. If that changes, we *must* not rely on
104
107
  reading the core static metadata table here; at that point we'd need our
105
108
  own singleton static metadata in the correct order. */
106
- return index <= GRPC_CHTTP2_LAST_STATIC_ENTRY
107
- ? grpc_static_mdelem_manifested[index - 1]
108
- : grpc_chttp2_hptbl_lookup_dynamic_index(tbl, index);
109
+ if (index <= GRPC_CHTTP2_LAST_STATIC_ENTRY) {
110
+ return grpc_static_mdelem_manifested()[index - 1];
111
+ } else {
112
+ if (take_ref) {
113
+ return grpc_chttp2_hptbl_lookup_ref_dynamic_index(tbl, index);
114
+ } else {
115
+ return grpc_chttp2_hptbl_lookup_dynamic_index(tbl, index);
116
+ }
117
+ }
109
118
  }
110
119
  /* add a table entry to the index */
111
120
  grpc_error* grpc_chttp2_hptbl_add(grpc_chttp2_hptbl* tbl,
@@ -120,7 +129,7 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
120
129
  inline uintptr_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
121
130
  uintptr_t index =
122
131
  reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md)) -
123
- grpc_static_mdelem_table;
132
+ grpc_static_mdelem_table();
124
133
  if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
125
134
  return index + 1; // Hpack static metadata element indices start at 1
126
135
  }
@@ -38,7 +38,8 @@ grpc_error* grpc_chttp2_incoming_metadata_buffer_add(
38
38
  storage = static_cast<grpc_linked_mdelem*>(
39
39
  buffer->arena->Alloc(sizeof(grpc_linked_mdelem)));
40
40
  }
41
- return grpc_metadata_batch_add_tail(&buffer->batch, storage, elem);
41
+ storage->md = elem;
42
+ return grpc_metadata_batch_link_tail(&buffer->batch, storage);
42
43
  }
43
44
 
44
45
  grpc_error* grpc_chttp2_incoming_metadata_buffer_replace_or_add(
@@ -571,8 +571,6 @@ struct grpc_chttp2_stream {
571
571
  /** Are we buffering writes on this stream? If yes, we won't become writable
572
572
  until there's enough queued up in the flow_controlled_buffer */
573
573
  bool write_buffering = false;
574
- /** Has trailing metadata been received. */
575
- bool received_trailing_metadata = false;
576
574
 
577
575
  /* have we sent or received the EOS bit? */
578
576
  bool eos_received = false;
@@ -108,7 +108,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
108
108
  /* fallthrough */
109
109
  dts_fh_0:
110
110
  case GRPC_DTS_FH_0:
111
- GPR_ASSERT(cur < end);
111
+ GPR_DEBUG_ASSERT(cur < end);
112
112
  t->incoming_frame_size = (static_cast<uint32_t>(*cur)) << 16;
113
113
  if (++cur == end) {
114
114
  t->deframe_state = GRPC_DTS_FH_1;
@@ -116,7 +116,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
116
116
  }
117
117
  /* fallthrough */
118
118
  case GRPC_DTS_FH_1:
119
- GPR_ASSERT(cur < end);
119
+ GPR_DEBUG_ASSERT(cur < end);
120
120
  t->incoming_frame_size |= (static_cast<uint32_t>(*cur)) << 8;
121
121
  if (++cur == end) {
122
122
  t->deframe_state = GRPC_DTS_FH_2;
@@ -124,7 +124,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
124
124
  }
125
125
  /* fallthrough */
126
126
  case GRPC_DTS_FH_2:
127
- GPR_ASSERT(cur < end);
127
+ GPR_DEBUG_ASSERT(cur < end);
128
128
  t->incoming_frame_size |= *cur;
129
129
  if (++cur == end) {
130
130
  t->deframe_state = GRPC_DTS_FH_3;
@@ -132,7 +132,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
132
132
  }
133
133
  /* fallthrough */
134
134
  case GRPC_DTS_FH_3:
135
- GPR_ASSERT(cur < end);
135
+ GPR_DEBUG_ASSERT(cur < end);
136
136
  t->incoming_frame_type = *cur;
137
137
  if (++cur == end) {
138
138
  t->deframe_state = GRPC_DTS_FH_4;
@@ -140,7 +140,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
140
140
  }
141
141
  /* fallthrough */
142
142
  case GRPC_DTS_FH_4:
143
- GPR_ASSERT(cur < end);
143
+ GPR_DEBUG_ASSERT(cur < end);
144
144
  t->incoming_frame_flags = *cur;
145
145
  if (++cur == end) {
146
146
  t->deframe_state = GRPC_DTS_FH_5;
@@ -148,7 +148,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
148
148
  }
149
149
  /* fallthrough */
150
150
  case GRPC_DTS_FH_5:
151
- GPR_ASSERT(cur < end);
151
+ GPR_DEBUG_ASSERT(cur < end);
152
152
  t->incoming_stream_id = ((static_cast<uint32_t>(*cur)) & 0x7f) << 24;
153
153
  if (++cur == end) {
154
154
  t->deframe_state = GRPC_DTS_FH_6;
@@ -156,7 +156,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
156
156
  }
157
157
  /* fallthrough */
158
158
  case GRPC_DTS_FH_6:
159
- GPR_ASSERT(cur < end);
159
+ GPR_DEBUG_ASSERT(cur < end);
160
160
  t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 16;
161
161
  if (++cur == end) {
162
162
  t->deframe_state = GRPC_DTS_FH_7;
@@ -164,7 +164,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
164
164
  }
165
165
  /* fallthrough */
166
166
  case GRPC_DTS_FH_7:
167
- GPR_ASSERT(cur < end);
167
+ GPR_DEBUG_ASSERT(cur < end);
168
168
  t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 8;
169
169
  if (++cur == end) {
170
170
  t->deframe_state = GRPC_DTS_FH_8;
@@ -172,7 +172,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
172
172
  }
173
173
  /* fallthrough */
174
174
  case GRPC_DTS_FH_8:
175
- GPR_ASSERT(cur < end);
175
+ GPR_DEBUG_ASSERT(cur < end);
176
176
  t->incoming_stream_id |= (static_cast<uint32_t>(*cur));
177
177
  t->deframe_state = GRPC_DTS_FRAME;
178
178
  err = init_frame_parser(t);
@@ -208,7 +208,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
208
208
  }
209
209
  /* fallthrough */
210
210
  case GRPC_DTS_FRAME:
211
- GPR_ASSERT(cur < end);
211
+ GPR_DEBUG_ASSERT(cur < end);
212
212
  if (static_cast<uint32_t>(end - cur) == t->incoming_frame_size) {
213
213
  err = parse_frame_slice(
214
214
  t,
@@ -318,7 +318,10 @@ static grpc_error* skip_parser(void* parser, grpc_chttp2_transport* t,
318
318
  return GRPC_ERROR_NONE;
319
319
  }
320
320
 
321
- static void skip_header(void* tp, grpc_mdelem md) { GRPC_MDELEM_UNREF(md); }
321
+ static grpc_error* skip_header(void* tp, grpc_mdelem md) {
322
+ GRPC_MDELEM_UNREF(md);
323
+ return GRPC_ERROR_NONE;
324
+ }
322
325
 
323
326
  static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
324
327
  int is_header) {
@@ -419,91 +422,117 @@ static bool is_nonzero_status(grpc_mdelem md) {
419
422
  !md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS);
420
423
  }
421
424
 
422
- static void on_initial_header(void* tp, grpc_mdelem md) {
425
+ static void GPR_ATTRIBUTE_NOINLINE on_initial_header_log(
426
+ grpc_chttp2_transport* t, grpc_chttp2_stream* s, grpc_mdelem md) {
427
+ char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
428
+ char* value =
429
+ grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
430
+ gpr_log(GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", s->id,
431
+ t->is_client ? "CLI" : "SVR", key, value);
432
+ gpr_free(key);
433
+ gpr_free(value);
434
+ }
435
+
436
+ static grpc_error* GPR_ATTRIBUTE_NOINLINE handle_timeout(grpc_chttp2_stream* s,
437
+ grpc_mdelem md) {
438
+ grpc_millis* cached_timeout =
439
+ static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
440
+ grpc_millis timeout;
441
+ if (cached_timeout != nullptr) {
442
+ timeout = *cached_timeout;
443
+ } else {
444
+ if (GPR_UNLIKELY(!grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
445
+ char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
446
+ gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
447
+ gpr_free(val);
448
+ timeout = GRPC_MILLIS_INF_FUTURE;
449
+ }
450
+ if (GRPC_MDELEM_IS_INTERNED(md)) {
451
+ /* store the result */
452
+ cached_timeout =
453
+ static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
454
+ *cached_timeout = timeout;
455
+ grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
456
+ }
457
+ }
458
+ if (timeout != GRPC_MILLIS_INF_FUTURE) {
459
+ grpc_chttp2_incoming_metadata_buffer_set_deadline(
460
+ &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
461
+ }
462
+ GRPC_MDELEM_UNREF(md);
463
+ return GRPC_ERROR_NONE;
464
+ }
465
+
466
+ static grpc_error* GPR_ATTRIBUTE_NOINLINE handle_metadata_size_limit_exceeded(
467
+ grpc_chttp2_transport* t, grpc_chttp2_stream* s, grpc_mdelem md,
468
+ size_t new_size, size_t metadata_size_limit) {
469
+ gpr_log(GPR_DEBUG,
470
+ "received initial metadata size exceeds limit (%" PRIuPTR
471
+ " vs. %" PRIuPTR ")",
472
+ new_size, metadata_size_limit);
473
+ grpc_chttp2_cancel_stream(
474
+ t, s,
475
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
476
+ "received initial metadata size exceeds limit"),
477
+ GRPC_ERROR_INT_GRPC_STATUS,
478
+ GRPC_STATUS_RESOURCE_EXHAUSTED));
479
+ grpc_chttp2_parsing_become_skip_parser(t);
480
+ s->seen_error = true;
481
+ GRPC_MDELEM_UNREF(md);
482
+ return GRPC_ERROR_NONE;
483
+ }
484
+
485
+ static grpc_error* GPR_ATTRIBUTE_NOINLINE
486
+ handle_metadata_add_failure(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
487
+ grpc_mdelem md, grpc_error* error) {
488
+ grpc_chttp2_cancel_stream(t, s, error);
489
+ grpc_chttp2_parsing_become_skip_parser(t);
490
+ s->seen_error = true;
491
+ GRPC_MDELEM_UNREF(md);
492
+ return GRPC_ERROR_NONE;
493
+ }
494
+
495
+ static grpc_error* on_initial_header(void* tp, grpc_mdelem md) {
423
496
  GPR_TIMER_SCOPE("on_initial_header", 0);
424
497
 
425
498
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
426
499
  grpc_chttp2_stream* s = t->incoming_stream;
427
- GPR_ASSERT(s != nullptr);
500
+ GPR_DEBUG_ASSERT(s != nullptr);
428
501
 
429
502
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
430
- char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
431
- char* value =
432
- grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
433
- gpr_log(GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", s->id,
434
- t->is_client ? "CLI" : "SVR", key, value);
435
- gpr_free(key);
436
- gpr_free(value);
503
+ on_initial_header_log(t, s, md);
437
504
  }
438
505
 
439
506
  if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
440
507
  s->seen_error = true;
441
508
  } else if (md_key_cmp(md, GRPC_MDSTR_GRPC_TIMEOUT)) {
442
- grpc_millis* cached_timeout =
443
- static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
444
- grpc_millis timeout;
445
- if (cached_timeout != nullptr) {
446
- timeout = *cached_timeout;
447
- } else {
448
- if (GPR_UNLIKELY(
449
- !grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
450
- char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
451
- gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
452
- gpr_free(val);
453
- timeout = GRPC_MILLIS_INF_FUTURE;
454
- }
455
- if (GRPC_MDELEM_IS_INTERNED(md)) {
456
- /* store the result */
457
- cached_timeout =
458
- static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
459
- *cached_timeout = timeout;
460
- grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
461
- }
462
- }
463
- if (timeout != GRPC_MILLIS_INF_FUTURE) {
464
- grpc_chttp2_incoming_metadata_buffer_set_deadline(
465
- &s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
466
- }
467
- GRPC_MDELEM_UNREF(md);
468
- return;
509
+ return handle_timeout(s, md);
469
510
  }
470
511
 
471
512
  const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
472
513
  const size_t metadata_size_limit =
473
514
  t->settings[GRPC_ACKED_SETTINGS]
474
515
  [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
475
- if (new_size > metadata_size_limit) {
476
- gpr_log(GPR_DEBUG,
477
- "received initial metadata size exceeds limit (%" PRIuPTR
478
- " vs. %" PRIuPTR ")",
479
- new_size, metadata_size_limit);
480
- grpc_chttp2_cancel_stream(
481
- t, s,
482
- grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
483
- "received initial metadata size exceeds limit"),
484
- GRPC_ERROR_INT_GRPC_STATUS,
485
- GRPC_STATUS_RESOURCE_EXHAUSTED));
486
- grpc_chttp2_parsing_become_skip_parser(t);
487
- s->seen_error = true;
488
- GRPC_MDELEM_UNREF(md);
516
+ if (GPR_UNLIKELY(new_size > metadata_size_limit)) {
517
+ return handle_metadata_size_limit_exceeded(t, s, md, new_size,
518
+ metadata_size_limit);
489
519
  } else {
490
520
  grpc_error* error =
491
521
  grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[0], md);
492
- if (error != GRPC_ERROR_NONE) {
493
- grpc_chttp2_cancel_stream(t, s, error);
494
- grpc_chttp2_parsing_become_skip_parser(t);
495
- s->seen_error = true;
496
- GRPC_MDELEM_UNREF(md);
522
+ if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
523
+ return handle_metadata_add_failure(t, s, md, error);
497
524
  }
498
525
  }
526
+ // Not timeout-related metadata, and no error occurred.
527
+ return GRPC_ERROR_NONE;
499
528
  }
500
529
 
501
- static void on_trailing_header(void* tp, grpc_mdelem md) {
530
+ static grpc_error* on_trailing_header(void* tp, grpc_mdelem md) {
502
531
  GPR_TIMER_SCOPE("on_trailing_header", 0);
503
532
 
504
533
  grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
505
534
  grpc_chttp2_stream* s = t->incoming_stream;
506
- GPR_ASSERT(s != nullptr);
535
+ GPR_DEBUG_ASSERT(s != nullptr);
507
536
 
508
537
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
509
538
  char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
@@ -547,6 +576,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
547
576
  GRPC_MDELEM_UNREF(md);
548
577
  }
549
578
  }
579
+ return GRPC_ERROR_NONE;
550
580
  }
551
581
 
552
582
  static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
@@ -626,7 +656,7 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
626
656
  } else {
627
657
  t->incoming_stream = s;
628
658
  }
629
- GPR_ASSERT(s != nullptr);
659
+ GPR_DEBUG_ASSERT(s != nullptr);
630
660
  s->stats.incoming.framing_bytes += 9;
631
661
  if (GPR_UNLIKELY(s->read_closed)) {
632
662
  GRPC_CHTTP2_IF_TRACING(gpr_log(
@@ -647,7 +677,6 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
647
677
  *s->trailing_metadata_available = true;
648
678
  }
649
679
  t->hpack_parser.on_header = on_trailing_header;
650
- s->received_trailing_metadata = true;
651
680
  } else {
652
681
  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing initial_metadata"));
653
682
  t->hpack_parser.on_header = on_initial_header;
@@ -656,7 +685,6 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
656
685
  case 1:
657
686
  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing trailing_metadata"));
658
687
  t->hpack_parser.on_header = on_trailing_header;
659
- s->received_trailing_metadata = true;
660
688
  break;
661
689
  case 2:
662
690
  gpr_log(GPR_ERROR, "too many header frames received");