grpc 1.0.1 → 1.1.2

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 (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -34,9 +34,9 @@
34
34
  #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H
35
35
  #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H
36
36
 
37
+ #include <grpc/slice.h>
38
+ #include <grpc/slice_buffer.h>
37
39
  #include <grpc/support/port_platform.h>
38
- #include <grpc/support/slice.h>
39
- #include <grpc/support/slice_buffer.h>
40
40
  #include "src/core/ext/transport/chttp2/transport/frame.h"
41
41
  #include "src/core/lib/transport/metadata.h"
42
42
  #include "src/core/lib/transport/metadata_batch.h"
@@ -83,15 +83,18 @@ typedef struct {
83
83
  } grpc_chttp2_hpack_compressor;
84
84
 
85
85
  void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor *c);
86
- void grpc_chttp2_hpack_compressor_destroy(grpc_chttp2_hpack_compressor *c);
86
+ void grpc_chttp2_hpack_compressor_destroy(grpc_exec_ctx *exec_ctx,
87
+ grpc_chttp2_hpack_compressor *c);
87
88
  void grpc_chttp2_hpack_compressor_set_max_table_size(
88
89
  grpc_chttp2_hpack_compressor *c, uint32_t max_table_size);
89
90
  void grpc_chttp2_hpack_compressor_set_max_usable_size(
90
91
  grpc_chttp2_hpack_compressor *c, uint32_t max_table_size);
91
92
 
92
- void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor *c, uint32_t id,
93
+ void grpc_chttp2_encode_header(grpc_exec_ctx *exec_ctx,
94
+ grpc_chttp2_hpack_compressor *c, uint32_t id,
93
95
  grpc_metadata_batch *metadata, int is_eof,
96
+ size_t max_frame_size,
94
97
  grpc_transport_one_way_stats *stats,
95
- gpr_slice_buffer *outbuf);
98
+ grpc_slice_buffer *outbuf);
96
99
 
97
100
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H */
@@ -50,6 +50,7 @@
50
50
  #include <grpc/support/useful.h>
51
51
 
52
52
  #include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
53
+ #include "src/core/ext/transport/chttp2/transport/http2_errors.h"
53
54
  #include "src/core/lib/profiling/timers.h"
54
55
  #include "src/core/lib/support/string.h"
55
56
 
@@ -78,69 +79,96 @@ typedef enum {
78
79
  a set of indirect jumps, and so not waste stack space. */
79
80
 
80
81
  /* forward declarations for parsing states */
81
- static grpc_error *parse_begin(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
82
+ static grpc_error *parse_begin(grpc_exec_ctx *exec_ctx,
83
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
82
84
  const uint8_t *end);
83
- static grpc_error *parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
85
+ static grpc_error *parse_error(grpc_exec_ctx *exec_ctx,
86
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
84
87
  const uint8_t *end, grpc_error *error);
85
- static grpc_error *still_parse_error(grpc_chttp2_hpack_parser *p,
88
+ static grpc_error *still_parse_error(grpc_exec_ctx *exec_ctx,
89
+ grpc_chttp2_hpack_parser *p,
86
90
  const uint8_t *cur, const uint8_t *end);
87
- static grpc_error *parse_illegal_op(grpc_chttp2_hpack_parser *p,
91
+ static grpc_error *parse_illegal_op(grpc_exec_ctx *exec_ctx,
92
+ grpc_chttp2_hpack_parser *p,
88
93
  const uint8_t *cur, const uint8_t *end);
89
94
 
90
- static grpc_error *parse_string_prefix(grpc_chttp2_hpack_parser *p,
95
+ static grpc_error *parse_string_prefix(grpc_exec_ctx *exec_ctx,
96
+ grpc_chttp2_hpack_parser *p,
91
97
  const uint8_t *cur, const uint8_t *end);
92
- static grpc_error *parse_key_string(grpc_chttp2_hpack_parser *p,
98
+ static grpc_error *parse_key_string(grpc_exec_ctx *exec_ctx,
99
+ grpc_chttp2_hpack_parser *p,
93
100
  const uint8_t *cur, const uint8_t *end);
94
101
  static grpc_error *parse_value_string_with_indexed_key(
95
- grpc_chttp2_hpack_parser *p, const uint8_t *cur, const uint8_t *end);
102
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
103
+ const uint8_t *end);
96
104
  static grpc_error *parse_value_string_with_literal_key(
97
- grpc_chttp2_hpack_parser *p, const uint8_t *cur, const uint8_t *end);
105
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
106
+ const uint8_t *end);
98
107
 
99
- static grpc_error *parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
108
+ static grpc_error *parse_value0(grpc_exec_ctx *exec_ctx,
109
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
100
110
  const uint8_t *end);
101
- static grpc_error *parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
111
+ static grpc_error *parse_value1(grpc_exec_ctx *exec_ctx,
112
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
102
113
  const uint8_t *end);
103
- static grpc_error *parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
114
+ static grpc_error *parse_value2(grpc_exec_ctx *exec_ctx,
115
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
104
116
  const uint8_t *end);
105
- static grpc_error *parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
117
+ static grpc_error *parse_value3(grpc_exec_ctx *exec_ctx,
118
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
106
119
  const uint8_t *end);
107
- static grpc_error *parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
120
+ static grpc_error *parse_value4(grpc_exec_ctx *exec_ctx,
121
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
108
122
  const uint8_t *end);
109
- static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
123
+ static grpc_error *parse_value5up(grpc_exec_ctx *exec_ctx,
124
+ grpc_chttp2_hpack_parser *p,
110
125
  const uint8_t *cur, const uint8_t *end);
111
126
 
112
- static grpc_error *parse_indexed_field(grpc_chttp2_hpack_parser *p,
127
+ static grpc_error *parse_indexed_field(grpc_exec_ctx *exec_ctx,
128
+ grpc_chttp2_hpack_parser *p,
113
129
  const uint8_t *cur, const uint8_t *end);
114
- static grpc_error *parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
130
+ static grpc_error *parse_indexed_field_x(grpc_exec_ctx *exec_ctx,
131
+ grpc_chttp2_hpack_parser *p,
115
132
  const uint8_t *cur,
116
133
  const uint8_t *end);
117
- static grpc_error *parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
134
+ static grpc_error *parse_lithdr_incidx(grpc_exec_ctx *exec_ctx,
135
+ grpc_chttp2_hpack_parser *p,
118
136
  const uint8_t *cur, const uint8_t *end);
119
- static grpc_error *parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
137
+ static grpc_error *parse_lithdr_incidx_x(grpc_exec_ctx *exec_ctx,
138
+ grpc_chttp2_hpack_parser *p,
120
139
  const uint8_t *cur,
121
140
  const uint8_t *end);
122
- static grpc_error *parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
141
+ static grpc_error *parse_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
142
+ grpc_chttp2_hpack_parser *p,
123
143
  const uint8_t *cur,
124
144
  const uint8_t *end);
125
- static grpc_error *parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
145
+ static grpc_error *parse_lithdr_notidx(grpc_exec_ctx *exec_ctx,
146
+ grpc_chttp2_hpack_parser *p,
126
147
  const uint8_t *cur, const uint8_t *end);
127
- static grpc_error *parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
148
+ static grpc_error *parse_lithdr_notidx_x(grpc_exec_ctx *exec_ctx,
149
+ grpc_chttp2_hpack_parser *p,
128
150
  const uint8_t *cur,
129
151
  const uint8_t *end);
130
- static grpc_error *parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
152
+ static grpc_error *parse_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
153
+ grpc_chttp2_hpack_parser *p,
131
154
  const uint8_t *cur,
132
155
  const uint8_t *end);
133
- static grpc_error *parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
156
+ static grpc_error *parse_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
157
+ grpc_chttp2_hpack_parser *p,
134
158
  const uint8_t *cur, const uint8_t *end);
135
- static grpc_error *parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
159
+ static grpc_error *parse_lithdr_nvridx_x(grpc_exec_ctx *exec_ctx,
160
+ grpc_chttp2_hpack_parser *p,
136
161
  const uint8_t *cur,
137
162
  const uint8_t *end);
138
- static grpc_error *parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
163
+ static grpc_error *parse_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
164
+ grpc_chttp2_hpack_parser *p,
139
165
  const uint8_t *cur,
140
166
  const uint8_t *end);
141
- static grpc_error *parse_max_tbl_size(grpc_chttp2_hpack_parser *p,
167
+ static grpc_error *parse_max_tbl_size(grpc_exec_ctx *exec_ctx,
168
+ grpc_chttp2_hpack_parser *p,
142
169
  const uint8_t *cur, const uint8_t *end);
143
- static grpc_error *parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
170
+ static grpc_error *parse_max_tbl_size_x(grpc_exec_ctx *exec_ctx,
171
+ grpc_chttp2_hpack_parser *p,
144
172
  const uint8_t *cur, const uint8_t *end);
145
173
 
146
174
  /* we translate the first byte of a hpack field into one of these decoding
@@ -639,17 +667,17 @@ static const uint8_t inverse_base64[256] = {
639
667
  };
640
668
 
641
669
  /* emission helpers */
642
- static grpc_error *on_hdr(grpc_chttp2_hpack_parser *p, grpc_mdelem *md,
643
- int add_to_table) {
670
+ static grpc_error *on_hdr(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p,
671
+ grpc_mdelem *md, int add_to_table) {
644
672
  if (add_to_table) {
645
- grpc_error *err = grpc_chttp2_hptbl_add(&p->table, md);
673
+ grpc_error *err = grpc_chttp2_hptbl_add(exec_ctx, &p->table, md);
646
674
  if (err != GRPC_ERROR_NONE) return err;
647
675
  }
648
676
  if (p->on_header == NULL) {
649
- GRPC_MDELEM_UNREF(md);
677
+ GRPC_MDELEM_UNREF(exec_ctx, md);
650
678
  return GRPC_ERROR_CREATE("on_header callback not set");
651
679
  }
652
- p->on_header(p->on_header_user_data, md);
680
+ p->on_header(exec_ctx, p->on_header_user_data, md);
653
681
  return GRPC_ERROR_NONE;
654
682
  }
655
683
 
@@ -661,78 +689,86 @@ static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p,
661
689
  }
662
690
 
663
691
  /* jump to the next state */
664
- static grpc_error *parse_next(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
692
+ static grpc_error *parse_next(grpc_exec_ctx *exec_ctx,
693
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
665
694
  const uint8_t *end) {
666
695
  p->state = *p->next_state++;
667
- return p->state(p, cur, end);
696
+ return p->state(exec_ctx, p, cur, end);
668
697
  }
669
698
 
670
699
  /* begin parsing a header: all functionality is encoded into lookup tables
671
700
  above */
672
- static grpc_error *parse_begin(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
701
+ static grpc_error *parse_begin(grpc_exec_ctx *exec_ctx,
702
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
673
703
  const uint8_t *end) {
674
704
  if (cur == end) {
675
705
  p->state = parse_begin;
676
706
  return GRPC_ERROR_NONE;
677
707
  }
678
708
 
679
- return first_byte_action[first_byte_lut[*cur]](p, cur, end);
709
+ return first_byte_action[first_byte_lut[*cur]](exec_ctx, p, cur, end);
680
710
  }
681
711
 
682
712
  /* stream dependency and prioritization data: we just skip it */
683
- static grpc_error *parse_stream_weight(grpc_chttp2_hpack_parser *p,
713
+ static grpc_error *parse_stream_weight(grpc_exec_ctx *exec_ctx,
714
+ grpc_chttp2_hpack_parser *p,
684
715
  const uint8_t *cur, const uint8_t *end) {
685
716
  if (cur == end) {
686
717
  p->state = parse_stream_weight;
687
718
  return GRPC_ERROR_NONE;
688
719
  }
689
720
 
690
- return p->after_prioritization(p, cur + 1, end);
721
+ return p->after_prioritization(exec_ctx, p, cur + 1, end);
691
722
  }
692
723
 
693
- static grpc_error *parse_stream_dep3(grpc_chttp2_hpack_parser *p,
724
+ static grpc_error *parse_stream_dep3(grpc_exec_ctx *exec_ctx,
725
+ grpc_chttp2_hpack_parser *p,
694
726
  const uint8_t *cur, const uint8_t *end) {
695
727
  if (cur == end) {
696
728
  p->state = parse_stream_dep3;
697
729
  return GRPC_ERROR_NONE;
698
730
  }
699
731
 
700
- return parse_stream_weight(p, cur + 1, end);
732
+ return parse_stream_weight(exec_ctx, p, cur + 1, end);
701
733
  }
702
734
 
703
- static grpc_error *parse_stream_dep2(grpc_chttp2_hpack_parser *p,
735
+ static grpc_error *parse_stream_dep2(grpc_exec_ctx *exec_ctx,
736
+ grpc_chttp2_hpack_parser *p,
704
737
  const uint8_t *cur, const uint8_t *end) {
705
738
  if (cur == end) {
706
739
  p->state = parse_stream_dep2;
707
740
  return GRPC_ERROR_NONE;
708
741
  }
709
742
 
710
- return parse_stream_dep3(p, cur + 1, end);
743
+ return parse_stream_dep3(exec_ctx, p, cur + 1, end);
711
744
  }
712
745
 
713
- static grpc_error *parse_stream_dep1(grpc_chttp2_hpack_parser *p,
746
+ static grpc_error *parse_stream_dep1(grpc_exec_ctx *exec_ctx,
747
+ grpc_chttp2_hpack_parser *p,
714
748
  const uint8_t *cur, const uint8_t *end) {
715
749
  if (cur == end) {
716
750
  p->state = parse_stream_dep1;
717
751
  return GRPC_ERROR_NONE;
718
752
  }
719
753
 
720
- return parse_stream_dep2(p, cur + 1, end);
754
+ return parse_stream_dep2(exec_ctx, p, cur + 1, end);
721
755
  }
722
756
 
723
- static grpc_error *parse_stream_dep0(grpc_chttp2_hpack_parser *p,
757
+ static grpc_error *parse_stream_dep0(grpc_exec_ctx *exec_ctx,
758
+ grpc_chttp2_hpack_parser *p,
724
759
  const uint8_t *cur, const uint8_t *end) {
725
760
  if (cur == end) {
726
761
  p->state = parse_stream_dep0;
727
762
  return GRPC_ERROR_NONE;
728
763
  }
729
764
 
730
- return parse_stream_dep1(p, cur + 1, end);
765
+ return parse_stream_dep1(exec_ctx, p, cur + 1, end);
731
766
  }
732
767
 
733
768
  /* emit an indexed field; for now just logs it to console; jumps to
734
769
  begin the next field on completion */
735
- static grpc_error *finish_indexed_field(grpc_chttp2_hpack_parser *p,
770
+ static grpc_error *finish_indexed_field(grpc_exec_ctx *exec_ctx,
771
+ grpc_chttp2_hpack_parser *p,
736
772
  const uint8_t *cur,
737
773
  const uint8_t *end) {
738
774
  grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
@@ -743,21 +779,23 @@ static grpc_error *finish_indexed_field(grpc_chttp2_hpack_parser *p,
743
779
  GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents);
744
780
  }
745
781
  GRPC_MDELEM_REF(md);
746
- grpc_error *err = on_hdr(p, md, 0);
782
+ grpc_error *err = on_hdr(exec_ctx, p, md, 0);
747
783
  if (err != GRPC_ERROR_NONE) return err;
748
- return parse_begin(p, cur, end);
784
+ return parse_begin(exec_ctx, p, cur, end);
749
785
  }
750
786
 
751
787
  /* parse an indexed field with index < 127 */
752
- static grpc_error *parse_indexed_field(grpc_chttp2_hpack_parser *p,
788
+ static grpc_error *parse_indexed_field(grpc_exec_ctx *exec_ctx,
789
+ grpc_chttp2_hpack_parser *p,
753
790
  const uint8_t *cur, const uint8_t *end) {
754
791
  p->dynamic_table_update_allowed = 0;
755
792
  p->index = (*cur) & 0x7f;
756
- return finish_indexed_field(p, cur + 1, end);
793
+ return finish_indexed_field(exec_ctx, p, cur + 1, end);
757
794
  }
758
795
 
759
796
  /* parse an indexed field with index >= 127 */
760
- static grpc_error *parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
797
+ static grpc_error *parse_indexed_field_x(grpc_exec_ctx *exec_ctx,
798
+ grpc_chttp2_hpack_parser *p,
761
799
  const uint8_t *cur,
762
800
  const uint8_t *end) {
763
801
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -766,49 +804,53 @@ static grpc_error *parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
766
804
  p->next_state = and_then;
767
805
  p->index = 0x7f;
768
806
  p->parsing.value = &p->index;
769
- return parse_value0(p, cur + 1, end);
807
+ return parse_value0(exec_ctx, p, cur + 1, end);
770
808
  }
771
809
 
772
810
  /* finish a literal header with incremental indexing: just log, and jump to '
773
811
  begin */
774
- static grpc_error *finish_lithdr_incidx(grpc_chttp2_hpack_parser *p,
812
+ static grpc_error *finish_lithdr_incidx(grpc_exec_ctx *exec_ctx,
813
+ grpc_chttp2_hpack_parser *p,
775
814
  const uint8_t *cur,
776
815
  const uint8_t *end) {
777
816
  grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
778
817
  GPR_ASSERT(md != NULL); /* handled in string parsing */
779
- grpc_error *err =
780
- on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
781
- take_string(p, &p->value)),
782
- 1);
783
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
784
- return parse_begin(p, cur, end);
818
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
819
+ exec_ctx, GRPC_MDSTR_REF(md->key),
820
+ take_string(p, &p->value)),
821
+ 1);
822
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
823
+ return parse_begin(exec_ctx, p, cur, end);
785
824
  }
786
825
 
787
826
  /* finish a literal header with incremental indexing with no index */
788
- static grpc_error *finish_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
827
+ static grpc_error *finish_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
828
+ grpc_chttp2_hpack_parser *p,
789
829
  const uint8_t *cur,
790
830
  const uint8_t *end) {
791
- grpc_error *err =
792
- on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
793
- take_string(p, &p->value)),
794
- 1);
795
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
796
- return parse_begin(p, cur, end);
831
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
832
+ exec_ctx, take_string(p, &p->key),
833
+ take_string(p, &p->value)),
834
+ 1);
835
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
836
+ return parse_begin(exec_ctx, p, cur, end);
797
837
  }
798
838
 
799
839
  /* parse a literal header with incremental indexing; index < 63 */
800
- static grpc_error *parse_lithdr_incidx(grpc_chttp2_hpack_parser *p,
840
+ static grpc_error *parse_lithdr_incidx(grpc_exec_ctx *exec_ctx,
841
+ grpc_chttp2_hpack_parser *p,
801
842
  const uint8_t *cur, const uint8_t *end) {
802
843
  static const grpc_chttp2_hpack_parser_state and_then[] = {
803
844
  parse_value_string_with_indexed_key, finish_lithdr_incidx};
804
845
  p->dynamic_table_update_allowed = 0;
805
846
  p->next_state = and_then;
806
847
  p->index = (*cur) & 0x3f;
807
- return parse_string_prefix(p, cur + 1, end);
848
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
808
849
  }
809
850
 
810
851
  /* parse a literal header with incremental indexing; index >= 63 */
811
- static grpc_error *parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
852
+ static grpc_error *parse_lithdr_incidx_x(grpc_exec_ctx *exec_ctx,
853
+ grpc_chttp2_hpack_parser *p,
812
854
  const uint8_t *cur,
813
855
  const uint8_t *end) {
814
856
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -818,11 +860,12 @@ static grpc_error *parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
818
860
  p->next_state = and_then;
819
861
  p->index = 0x3f;
820
862
  p->parsing.value = &p->index;
821
- return parse_value0(p, cur + 1, end);
863
+ return parse_value0(exec_ctx, p, cur + 1, end);
822
864
  }
823
865
 
824
866
  /* parse a literal header with incremental indexing; index = 0 */
825
- static grpc_error *parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
867
+ static grpc_error *parse_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
868
+ grpc_chttp2_hpack_parser *p,
826
869
  const uint8_t *cur,
827
870
  const uint8_t *end) {
828
871
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -830,48 +873,52 @@ static grpc_error *parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
830
873
  parse_value_string_with_literal_key, finish_lithdr_incidx_v};
831
874
  p->dynamic_table_update_allowed = 0;
832
875
  p->next_state = and_then;
833
- return parse_string_prefix(p, cur + 1, end);
876
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
834
877
  }
835
878
 
836
879
  /* finish a literal header without incremental indexing */
837
- static grpc_error *finish_lithdr_notidx(grpc_chttp2_hpack_parser *p,
880
+ static grpc_error *finish_lithdr_notidx(grpc_exec_ctx *exec_ctx,
881
+ grpc_chttp2_hpack_parser *p,
838
882
  const uint8_t *cur,
839
883
  const uint8_t *end) {
840
884
  grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
841
885
  GPR_ASSERT(md != NULL); /* handled in string parsing */
842
- grpc_error *err =
843
- on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
844
- take_string(p, &p->value)),
845
- 0);
846
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
847
- return parse_begin(p, cur, end);
886
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
887
+ exec_ctx, GRPC_MDSTR_REF(md->key),
888
+ take_string(p, &p->value)),
889
+ 0);
890
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
891
+ return parse_begin(exec_ctx, p, cur, end);
848
892
  }
849
893
 
850
894
  /* finish a literal header without incremental indexing with index = 0 */
851
- static grpc_error *finish_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
895
+ static grpc_error *finish_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
896
+ grpc_chttp2_hpack_parser *p,
852
897
  const uint8_t *cur,
853
898
  const uint8_t *end) {
854
- grpc_error *err =
855
- on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
856
- take_string(p, &p->value)),
857
- 0);
858
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
859
- return parse_begin(p, cur, end);
899
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
900
+ exec_ctx, take_string(p, &p->key),
901
+ take_string(p, &p->value)),
902
+ 0);
903
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
904
+ return parse_begin(exec_ctx, p, cur, end);
860
905
  }
861
906
 
862
907
  /* parse a literal header without incremental indexing; index < 15 */
863
- static grpc_error *parse_lithdr_notidx(grpc_chttp2_hpack_parser *p,
908
+ static grpc_error *parse_lithdr_notidx(grpc_exec_ctx *exec_ctx,
909
+ grpc_chttp2_hpack_parser *p,
864
910
  const uint8_t *cur, const uint8_t *end) {
865
911
  static const grpc_chttp2_hpack_parser_state and_then[] = {
866
912
  parse_value_string_with_indexed_key, finish_lithdr_notidx};
867
913
  p->dynamic_table_update_allowed = 0;
868
914
  p->next_state = and_then;
869
915
  p->index = (*cur) & 0xf;
870
- return parse_string_prefix(p, cur + 1, end);
916
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
871
917
  }
872
918
 
873
919
  /* parse a literal header without incremental indexing; index >= 15 */
874
- static grpc_error *parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
920
+ static grpc_error *parse_lithdr_notidx_x(grpc_exec_ctx *exec_ctx,
921
+ grpc_chttp2_hpack_parser *p,
875
922
  const uint8_t *cur,
876
923
  const uint8_t *end) {
877
924
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -881,11 +928,12 @@ static grpc_error *parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
881
928
  p->next_state = and_then;
882
929
  p->index = 0xf;
883
930
  p->parsing.value = &p->index;
884
- return parse_value0(p, cur + 1, end);
931
+ return parse_value0(exec_ctx, p, cur + 1, end);
885
932
  }
886
933
 
887
934
  /* parse a literal header without incremental indexing; index == 0 */
888
- static grpc_error *parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
935
+ static grpc_error *parse_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
936
+ grpc_chttp2_hpack_parser *p,
889
937
  const uint8_t *cur,
890
938
  const uint8_t *end) {
891
939
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -893,48 +941,52 @@ static grpc_error *parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
893
941
  parse_value_string_with_literal_key, finish_lithdr_notidx_v};
894
942
  p->dynamic_table_update_allowed = 0;
895
943
  p->next_state = and_then;
896
- return parse_string_prefix(p, cur + 1, end);
944
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
897
945
  }
898
946
 
899
947
  /* finish a literal header that is never indexed */
900
- static grpc_error *finish_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
948
+ static grpc_error *finish_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
949
+ grpc_chttp2_hpack_parser *p,
901
950
  const uint8_t *cur,
902
951
  const uint8_t *end) {
903
952
  grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
904
953
  GPR_ASSERT(md != NULL); /* handled in string parsing */
905
- grpc_error *err =
906
- on_hdr(p, grpc_mdelem_from_metadata_strings(GRPC_MDSTR_REF(md->key),
907
- take_string(p, &p->value)),
908
- 0);
909
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
910
- return parse_begin(p, cur, end);
954
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
955
+ exec_ctx, GRPC_MDSTR_REF(md->key),
956
+ take_string(p, &p->value)),
957
+ 0);
958
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
959
+ return parse_begin(exec_ctx, p, cur, end);
911
960
  }
912
961
 
913
962
  /* finish a literal header that is never indexed with an extra value */
914
- static grpc_error *finish_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
963
+ static grpc_error *finish_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
964
+ grpc_chttp2_hpack_parser *p,
915
965
  const uint8_t *cur,
916
966
  const uint8_t *end) {
917
- grpc_error *err =
918
- on_hdr(p, grpc_mdelem_from_metadata_strings(take_string(p, &p->key),
919
- take_string(p, &p->value)),
920
- 0);
921
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
922
- return parse_begin(p, cur, end);
967
+ grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
968
+ exec_ctx, take_string(p, &p->key),
969
+ take_string(p, &p->value)),
970
+ 0);
971
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
972
+ return parse_begin(exec_ctx, p, cur, end);
923
973
  }
924
974
 
925
975
  /* parse a literal header that is never indexed; index < 15 */
926
- static grpc_error *parse_lithdr_nvridx(grpc_chttp2_hpack_parser *p,
976
+ static grpc_error *parse_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
977
+ grpc_chttp2_hpack_parser *p,
927
978
  const uint8_t *cur, const uint8_t *end) {
928
979
  static const grpc_chttp2_hpack_parser_state and_then[] = {
929
980
  parse_value_string_with_indexed_key, finish_lithdr_nvridx};
930
981
  p->dynamic_table_update_allowed = 0;
931
982
  p->next_state = and_then;
932
983
  p->index = (*cur) & 0xf;
933
- return parse_string_prefix(p, cur + 1, end);
984
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
934
985
  }
935
986
 
936
987
  /* parse a literal header that is never indexed; index >= 15 */
937
- static grpc_error *parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
988
+ static grpc_error *parse_lithdr_nvridx_x(grpc_exec_ctx *exec_ctx,
989
+ grpc_chttp2_hpack_parser *p,
938
990
  const uint8_t *cur,
939
991
  const uint8_t *end) {
940
992
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -944,11 +996,12 @@ static grpc_error *parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
944
996
  p->next_state = and_then;
945
997
  p->index = 0xf;
946
998
  p->parsing.value = &p->index;
947
- return parse_value0(p, cur + 1, end);
999
+ return parse_value0(exec_ctx, p, cur + 1, end);
948
1000
  }
949
1001
 
950
1002
  /* parse a literal header that is never indexed; index == 0 */
951
- static grpc_error *parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
1003
+ static grpc_error *parse_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
1004
+ grpc_chttp2_hpack_parser *p,
952
1005
  const uint8_t *cur,
953
1006
  const uint8_t *end) {
954
1007
  static const grpc_chttp2_hpack_parser_state and_then[] = {
@@ -956,44 +1009,47 @@ static grpc_error *parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
956
1009
  parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
957
1010
  p->dynamic_table_update_allowed = 0;
958
1011
  p->next_state = and_then;
959
- return parse_string_prefix(p, cur + 1, end);
1012
+ return parse_string_prefix(exec_ctx, p, cur + 1, end);
960
1013
  }
961
1014
 
962
1015
  /* finish parsing a max table size change */
963
- static grpc_error *finish_max_tbl_size(grpc_chttp2_hpack_parser *p,
1016
+ static grpc_error *finish_max_tbl_size(grpc_exec_ctx *exec_ctx,
1017
+ grpc_chttp2_hpack_parser *p,
964
1018
  const uint8_t *cur, const uint8_t *end) {
965
1019
  if (grpc_http_trace) {
966
1020
  gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
967
1021
  }
968
1022
  grpc_error *err =
969
- grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index);
970
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
971
- return parse_begin(p, cur, end);
1023
+ grpc_chttp2_hptbl_set_current_table_size(exec_ctx, &p->table, p->index);
1024
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1025
+ return parse_begin(exec_ctx, p, cur, end);
972
1026
  }
973
1027
 
974
1028
  /* parse a max table size change, max size < 15 */
975
- static grpc_error *parse_max_tbl_size(grpc_chttp2_hpack_parser *p,
1029
+ static grpc_error *parse_max_tbl_size(grpc_exec_ctx *exec_ctx,
1030
+ grpc_chttp2_hpack_parser *p,
976
1031
  const uint8_t *cur, const uint8_t *end) {
977
1032
  if (p->dynamic_table_update_allowed == 0) {
978
1033
  return parse_error(
979
- p, cur, end,
1034
+ exec_ctx, p, cur, end,
980
1035
  GRPC_ERROR_CREATE(
981
1036
  "More than two max table size changes in a single frame"));
982
1037
  }
983
1038
  p->dynamic_table_update_allowed--;
984
1039
  p->index = (*cur) & 0x1f;
985
- return finish_max_tbl_size(p, cur + 1, end);
1040
+ return finish_max_tbl_size(exec_ctx, p, cur + 1, end);
986
1041
  }
987
1042
 
988
1043
  /* parse a max table size change, max size >= 15 */
989
- static grpc_error *parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
1044
+ static grpc_error *parse_max_tbl_size_x(grpc_exec_ctx *exec_ctx,
1045
+ grpc_chttp2_hpack_parser *p,
990
1046
  const uint8_t *cur,
991
1047
  const uint8_t *end) {
992
1048
  static const grpc_chttp2_hpack_parser_state and_then[] = {
993
1049
  finish_max_tbl_size};
994
1050
  if (p->dynamic_table_update_allowed == 0) {
995
1051
  return parse_error(
996
- p, cur, end,
1052
+ exec_ctx, p, cur, end,
997
1053
  GRPC_ERROR_CREATE(
998
1054
  "More than two max table size changes in a single frame"));
999
1055
  }
@@ -1001,11 +1057,12 @@ static grpc_error *parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
1001
1057
  p->next_state = and_then;
1002
1058
  p->index = 0x1f;
1003
1059
  p->parsing.value = &p->index;
1004
- return parse_value0(p, cur + 1, end);
1060
+ return parse_value0(exec_ctx, p, cur + 1, end);
1005
1061
  }
1006
1062
 
1007
1063
  /* a parse error: jam the parse state into parse_error, and return error */
1008
- static grpc_error *parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1064
+ static grpc_error *parse_error(grpc_exec_ctx *exec_ctx,
1065
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1009
1066
  const uint8_t *end, grpc_error *err) {
1010
1067
  GPR_ASSERT(err != GRPC_ERROR_NONE);
1011
1068
  if (p->last_error == GRPC_ERROR_NONE) {
@@ -1015,24 +1072,27 @@ static grpc_error *parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1015
1072
  return err;
1016
1073
  }
1017
1074
 
1018
- static grpc_error *still_parse_error(grpc_chttp2_hpack_parser *p,
1075
+ static grpc_error *still_parse_error(grpc_exec_ctx *exec_ctx,
1076
+ grpc_chttp2_hpack_parser *p,
1019
1077
  const uint8_t *cur, const uint8_t *end) {
1020
1078
  return GRPC_ERROR_REF(p->last_error);
1021
1079
  }
1022
1080
 
1023
- static grpc_error *parse_illegal_op(grpc_chttp2_hpack_parser *p,
1081
+ static grpc_error *parse_illegal_op(grpc_exec_ctx *exec_ctx,
1082
+ grpc_chttp2_hpack_parser *p,
1024
1083
  const uint8_t *cur, const uint8_t *end) {
1025
1084
  GPR_ASSERT(cur != end);
1026
1085
  char *msg;
1027
1086
  gpr_asprintf(&msg, "Illegal hpack op code %d", *cur);
1028
1087
  grpc_error *err = GRPC_ERROR_CREATE(msg);
1029
1088
  gpr_free(msg);
1030
- return parse_error(p, cur, end, err);
1089
+ return parse_error(exec_ctx, p, cur, end, err);
1031
1090
  }
1032
1091
 
1033
1092
  /* parse the 1st byte of a varint into p->parsing.value
1034
1093
  no overflow is possible */
1035
- static grpc_error *parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1094
+ static grpc_error *parse_value0(grpc_exec_ctx *exec_ctx,
1095
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1036
1096
  const uint8_t *end) {
1037
1097
  if (cur == end) {
1038
1098
  p->state = parse_value0;
@@ -1042,15 +1102,16 @@ static grpc_error *parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1042
1102
  *p->parsing.value += (*cur) & 0x7f;
1043
1103
 
1044
1104
  if ((*cur) & 0x80) {
1045
- return parse_value1(p, cur + 1, end);
1105
+ return parse_value1(exec_ctx, p, cur + 1, end);
1046
1106
  } else {
1047
- return parse_next(p, cur + 1, end);
1107
+ return parse_next(exec_ctx, p, cur + 1, end);
1048
1108
  }
1049
1109
  }
1050
1110
 
1051
1111
  /* parse the 2nd byte of a varint into p->parsing.value
1052
1112
  no overflow is possible */
1053
- static grpc_error *parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1113
+ static grpc_error *parse_value1(grpc_exec_ctx *exec_ctx,
1114
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1054
1115
  const uint8_t *end) {
1055
1116
  if (cur == end) {
1056
1117
  p->state = parse_value1;
@@ -1060,15 +1121,16 @@ static grpc_error *parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1060
1121
  *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 7;
1061
1122
 
1062
1123
  if ((*cur) & 0x80) {
1063
- return parse_value2(p, cur + 1, end);
1124
+ return parse_value2(exec_ctx, p, cur + 1, end);
1064
1125
  } else {
1065
- return parse_next(p, cur + 1, end);
1126
+ return parse_next(exec_ctx, p, cur + 1, end);
1066
1127
  }
1067
1128
  }
1068
1129
 
1069
1130
  /* parse the 3rd byte of a varint into p->parsing.value
1070
1131
  no overflow is possible */
1071
- static grpc_error *parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1132
+ static grpc_error *parse_value2(grpc_exec_ctx *exec_ctx,
1133
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1072
1134
  const uint8_t *end) {
1073
1135
  if (cur == end) {
1074
1136
  p->state = parse_value2;
@@ -1078,15 +1140,16 @@ static grpc_error *parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1078
1140
  *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 14;
1079
1141
 
1080
1142
  if ((*cur) & 0x80) {
1081
- return parse_value3(p, cur + 1, end);
1143
+ return parse_value3(exec_ctx, p, cur + 1, end);
1082
1144
  } else {
1083
- return parse_next(p, cur + 1, end);
1145
+ return parse_next(exec_ctx, p, cur + 1, end);
1084
1146
  }
1085
1147
  }
1086
1148
 
1087
1149
  /* parse the 4th byte of a varint into p->parsing.value
1088
1150
  no overflow is possible */
1089
- static grpc_error *parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1151
+ static grpc_error *parse_value3(grpc_exec_ctx *exec_ctx,
1152
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1090
1153
  const uint8_t *end) {
1091
1154
  if (cur == end) {
1092
1155
  p->state = parse_value3;
@@ -1096,15 +1159,16 @@ static grpc_error *parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1096
1159
  *p->parsing.value += (((uint32_t)*cur) & 0x7f) << 21;
1097
1160
 
1098
1161
  if ((*cur) & 0x80) {
1099
- return parse_value4(p, cur + 1, end);
1162
+ return parse_value4(exec_ctx, p, cur + 1, end);
1100
1163
  } else {
1101
- return parse_next(p, cur + 1, end);
1164
+ return parse_next(exec_ctx, p, cur + 1, end);
1102
1165
  }
1103
1166
  }
1104
1167
 
1105
1168
  /* parse the 5th byte of a varint into p->parsing.value
1106
1169
  depending on the byte, we may overflow, and care must be taken */
1107
- static grpc_error *parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1170
+ static grpc_error *parse_value4(grpc_exec_ctx *exec_ctx,
1171
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1108
1172
  const uint8_t *end) {
1109
1173
  uint8_t c;
1110
1174
  uint32_t cur_value;
@@ -1130,9 +1194,9 @@ static grpc_error *parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1130
1194
  *p->parsing.value = cur_value + add_value;
1131
1195
 
1132
1196
  if ((*cur) & 0x80) {
1133
- return parse_value5up(p, cur + 1, end);
1197
+ return parse_value5up(exec_ctx, p, cur + 1, end);
1134
1198
  } else {
1135
- return parse_next(p, cur + 1, end);
1199
+ return parse_next(exec_ctx, p, cur + 1, end);
1136
1200
  }
1137
1201
 
1138
1202
  error:
@@ -1142,13 +1206,14 @@ error:
1142
1206
  *p->parsing.value, *cur);
1143
1207
  grpc_error *err = GRPC_ERROR_CREATE(msg);
1144
1208
  gpr_free(msg);
1145
- return parse_error(p, cur, end, err);
1209
+ return parse_error(exec_ctx, p, cur, end, err);
1146
1210
  }
1147
1211
 
1148
1212
  /* parse any trailing bytes in a varint: it's possible to append an arbitrary
1149
1213
  number of 0x80's and not affect the value - a zero will terminate - and
1150
1214
  anything else will overflow */
1151
- static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
1215
+ static grpc_error *parse_value5up(grpc_exec_ctx *exec_ctx,
1216
+ grpc_chttp2_hpack_parser *p,
1152
1217
  const uint8_t *cur, const uint8_t *end) {
1153
1218
  while (cur != end && *cur == 0x80) {
1154
1219
  ++cur;
@@ -1160,7 +1225,7 @@ static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
1160
1225
  }
1161
1226
 
1162
1227
  if (*cur == 0) {
1163
- return parse_next(p, cur + 1, end);
1228
+ return parse_next(exec_ctx, p, cur + 1, end);
1164
1229
  }
1165
1230
 
1166
1231
  char *msg;
@@ -1170,11 +1235,12 @@ static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
1170
1235
  *p->parsing.value, *cur);
1171
1236
  grpc_error *err = GRPC_ERROR_CREATE(msg);
1172
1237
  gpr_free(msg);
1173
- return parse_error(p, cur, end, err);
1238
+ return parse_error(exec_ctx, p, cur, end, err);
1174
1239
  }
1175
1240
 
1176
1241
  /* parse a string prefix */
1177
- static grpc_error *parse_string_prefix(grpc_chttp2_hpack_parser *p,
1242
+ static grpc_error *parse_string_prefix(grpc_exec_ctx *exec_ctx,
1243
+ grpc_chttp2_hpack_parser *p,
1178
1244
  const uint8_t *cur, const uint8_t *end) {
1179
1245
  if (cur == end) {
1180
1246
  p->state = parse_string_prefix;
@@ -1185,9 +1251,9 @@ static grpc_error *parse_string_prefix(grpc_chttp2_hpack_parser *p,
1185
1251
  p->huff = (*cur) >> 7;
1186
1252
  if (p->strlen == 0x7f) {
1187
1253
  p->parsing.value = &p->strlen;
1188
- return parse_value0(p, cur + 1, end);
1254
+ return parse_value0(exec_ctx, p, cur + 1, end);
1189
1255
  } else {
1190
- return parse_next(p, cur + 1, end);
1256
+ return parse_next(exec_ctx, p, cur + 1, end);
1191
1257
  }
1192
1258
  }
1193
1259
 
@@ -1205,7 +1271,8 @@ static void append_bytes(grpc_chttp2_hpack_parser_string *str,
1205
1271
  str->length += (uint32_t)length;
1206
1272
  }
1207
1273
 
1208
- static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1274
+ static grpc_error *append_string(grpc_exec_ctx *exec_ctx,
1275
+ grpc_chttp2_hpack_parser *p,
1209
1276
  const uint8_t *cur, const uint8_t *end) {
1210
1277
  grpc_chttp2_hpack_parser_string *str = p->parsing.str;
1211
1278
  uint32_t bits;
@@ -1223,7 +1290,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1223
1290
  bits = inverse_base64[*cur];
1224
1291
  ++cur;
1225
1292
  if (bits == 255)
1226
- return parse_error(p, cur, end,
1293
+ return parse_error(exec_ctx, p, cur, end,
1227
1294
  GRPC_ERROR_CREATE("Illegal base64 character"));
1228
1295
  else if (bits == 64)
1229
1296
  goto b64_byte0;
@@ -1238,7 +1305,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1238
1305
  bits = inverse_base64[*cur];
1239
1306
  ++cur;
1240
1307
  if (bits == 255)
1241
- return parse_error(p, cur, end,
1308
+ return parse_error(exec_ctx, p, cur, end,
1242
1309
  GRPC_ERROR_CREATE("Illegal base64 character"));
1243
1310
  else if (bits == 64)
1244
1311
  goto b64_byte1;
@@ -1253,7 +1320,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1253
1320
  bits = inverse_base64[*cur];
1254
1321
  ++cur;
1255
1322
  if (bits == 255)
1256
- return parse_error(p, cur, end,
1323
+ return parse_error(exec_ctx, p, cur, end,
1257
1324
  GRPC_ERROR_CREATE("Illegal base64 character"));
1258
1325
  else if (bits == 64)
1259
1326
  goto b64_byte2;
@@ -1268,7 +1335,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1268
1335
  bits = inverse_base64[*cur];
1269
1336
  ++cur;
1270
1337
  if (bits == 255)
1271
- return parse_error(p, cur, end,
1338
+ return parse_error(exec_ctx, p, cur, end,
1272
1339
  GRPC_ERROR_CREATE("Illegal base64 character"));
1273
1340
  else if (bits == 64)
1274
1341
  goto b64_byte3;
@@ -1281,11 +1348,12 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
1281
1348
  goto b64_byte0;
1282
1349
  }
1283
1350
  GPR_UNREACHABLE_CODE(return parse_error(
1284
- p, cur, end, GRPC_ERROR_CREATE("Should never reach here")));
1351
+ exec_ctx, p, cur, end, GRPC_ERROR_CREATE("Should never reach here")));
1285
1352
  }
1286
1353
 
1287
1354
  /* append a null terminator to a string */
1288
- static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1355
+ static grpc_error *finish_str(grpc_exec_ctx *exec_ctx,
1356
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1289
1357
  const uint8_t *end) {
1290
1358
  uint8_t terminator = 0;
1291
1359
  uint8_t decoded[2];
@@ -1298,7 +1366,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1298
1366
  break;
1299
1367
  case B64_BYTE1:
1300
1368
  return parse_error(
1301
- p, cur, end,
1369
+ exec_ctx, p, cur, end,
1302
1370
  GRPC_ERROR_CREATE("illegal base64 encoding")); /* illegal encoding */
1303
1371
  case B64_BYTE2:
1304
1372
  bits = p->base64_buffer;
@@ -1308,7 +1376,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1308
1376
  bits & 0xffff);
1309
1377
  grpc_error *err = GRPC_ERROR_CREATE(msg);
1310
1378
  gpr_free(msg);
1311
- return parse_error(p, cur, end, err);
1379
+ return parse_error(exec_ctx, p, cur, end, err);
1312
1380
  }
1313
1381
  decoded[0] = (uint8_t)(bits >> 16);
1314
1382
  append_bytes(str, decoded, 1);
@@ -1321,7 +1389,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1321
1389
  bits & 0xff);
1322
1390
  grpc_error *err = GRPC_ERROR_CREATE(msg);
1323
1391
  gpr_free(msg);
1324
- return parse_error(p, cur, end, err);
1392
+ return parse_error(exec_ctx, p, cur, end, err);
1325
1393
  }
1326
1394
  decoded[0] = (uint8_t)(bits >> 16);
1327
1395
  decoded[1] = (uint8_t)(bits >> 8);
@@ -1334,13 +1402,14 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1334
1402
  }
1335
1403
 
1336
1404
  /* decode a nibble from a huffman encoded stream */
1337
- static grpc_error *huff_nibble(grpc_chttp2_hpack_parser *p, uint8_t nibble) {
1405
+ static grpc_error *huff_nibble(grpc_exec_ctx *exec_ctx,
1406
+ grpc_chttp2_hpack_parser *p, uint8_t nibble) {
1338
1407
  int16_t emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
1339
1408
  int16_t next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
1340
1409
  if (emit != -1) {
1341
1410
  if (emit >= 0 && emit < 256) {
1342
1411
  uint8_t c = (uint8_t)emit;
1343
- grpc_error *err = append_string(p, &c, (&c) + 1);
1412
+ grpc_error *err = append_string(exec_ctx, p, &c, (&c) + 1);
1344
1413
  if (err != GRPC_ERROR_NONE) return err;
1345
1414
  } else {
1346
1415
  assert(emit == 256);
@@ -1351,42 +1420,45 @@ static grpc_error *huff_nibble(grpc_chttp2_hpack_parser *p, uint8_t nibble) {
1351
1420
  }
1352
1421
 
1353
1422
  /* decode full bytes from a huffman encoded stream */
1354
- static grpc_error *add_huff_bytes(grpc_chttp2_hpack_parser *p,
1423
+ static grpc_error *add_huff_bytes(grpc_exec_ctx *exec_ctx,
1424
+ grpc_chttp2_hpack_parser *p,
1355
1425
  const uint8_t *cur, const uint8_t *end) {
1356
1426
  for (; cur != end; ++cur) {
1357
- grpc_error *err = huff_nibble(p, *cur >> 4);
1358
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1359
- err = huff_nibble(p, *cur & 0xf);
1360
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1427
+ grpc_error *err = huff_nibble(exec_ctx, p, *cur >> 4);
1428
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1429
+ err = huff_nibble(exec_ctx, p, *cur & 0xf);
1430
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1361
1431
  }
1362
1432
  return GRPC_ERROR_NONE;
1363
1433
  }
1364
1434
 
1365
1435
  /* decode some string bytes based on the current decoding mode
1366
1436
  (huffman or not) */
1367
- static grpc_error *add_str_bytes(grpc_chttp2_hpack_parser *p,
1437
+ static grpc_error *add_str_bytes(grpc_exec_ctx *exec_ctx,
1438
+ grpc_chttp2_hpack_parser *p,
1368
1439
  const uint8_t *cur, const uint8_t *end) {
1369
1440
  if (p->huff) {
1370
- return add_huff_bytes(p, cur, end);
1441
+ return add_huff_bytes(exec_ctx, p, cur, end);
1371
1442
  } else {
1372
- return append_string(p, cur, end);
1443
+ return append_string(exec_ctx, p, cur, end);
1373
1444
  }
1374
1445
  }
1375
1446
 
1376
1447
  /* parse a string - tries to do large chunks at a time */
1377
- static grpc_error *parse_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1448
+ static grpc_error *parse_string(grpc_exec_ctx *exec_ctx,
1449
+ grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1378
1450
  const uint8_t *end) {
1379
1451
  size_t remaining = p->strlen - p->strgot;
1380
1452
  size_t given = (size_t)(end - cur);
1381
1453
  if (remaining <= given) {
1382
- grpc_error *err = add_str_bytes(p, cur, cur + remaining);
1383
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1384
- err = finish_str(p, cur + remaining, end);
1385
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1386
- return parse_next(p, cur + remaining, end);
1454
+ grpc_error *err = add_str_bytes(exec_ctx, p, cur, cur + remaining);
1455
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1456
+ err = finish_str(exec_ctx, p, cur + remaining, end);
1457
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1458
+ return parse_next(exec_ctx, p, cur + remaining, end);
1387
1459
  } else {
1388
- grpc_error *err = add_str_bytes(p, cur, cur + given);
1389
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1460
+ grpc_error *err = add_str_bytes(exec_ctx, p, cur, cur + given);
1461
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1390
1462
  GPR_ASSERT(given <= UINT32_MAX - p->strgot);
1391
1463
  p->strgot += (uint32_t)given;
1392
1464
  p->state = parse_string;
@@ -1395,7 +1467,8 @@ static grpc_error *parse_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1395
1467
  }
1396
1468
 
1397
1469
  /* begin parsing a string - performs setup, calls parse_string */
1398
- static grpc_error *begin_parse_string(grpc_chttp2_hpack_parser *p,
1470
+ static grpc_error *begin_parse_string(grpc_exec_ctx *exec_ctx,
1471
+ grpc_chttp2_hpack_parser *p,
1399
1472
  const uint8_t *cur, const uint8_t *end,
1400
1473
  uint8_t binary,
1401
1474
  grpc_chttp2_hpack_parser_string *str) {
@@ -1404,13 +1477,14 @@ static grpc_error *begin_parse_string(grpc_chttp2_hpack_parser *p,
1404
1477
  p->parsing.str = str;
1405
1478
  p->huff_state = 0;
1406
1479
  p->binary = binary;
1407
- return parse_string(p, cur, end);
1480
+ return parse_string(exec_ctx, p, cur, end);
1408
1481
  }
1409
1482
 
1410
1483
  /* parse the key string */
1411
- static grpc_error *parse_key_string(grpc_chttp2_hpack_parser *p,
1484
+ static grpc_error *parse_key_string(grpc_exec_ctx *exec_ctx,
1485
+ grpc_chttp2_hpack_parser *p,
1412
1486
  const uint8_t *cur, const uint8_t *end) {
1413
- return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
1487
+ return begin_parse_string(exec_ctx, p, cur, end, NOT_BINARY, &p->key);
1414
1488
  }
1415
1489
 
1416
1490
  /* check if a key represents a binary header or not */
@@ -1428,36 +1502,40 @@ static grpc_error *is_binary_indexed_header(grpc_chttp2_hpack_parser *p,
1428
1502
  GRPC_ERROR_INT_INDEX, (intptr_t)p->index),
1429
1503
  GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents);
1430
1504
  }
1431
- *is =
1432
- grpc_is_binary_header((const char *)GPR_SLICE_START_PTR(elem->key->slice),
1433
- GPR_SLICE_LENGTH(elem->key->slice));
1505
+ *is = grpc_is_binary_header(
1506
+ (const char *)GRPC_SLICE_START_PTR(elem->key->slice),
1507
+ GRPC_SLICE_LENGTH(elem->key->slice));
1434
1508
  return GRPC_ERROR_NONE;
1435
1509
  }
1436
1510
 
1437
1511
  /* parse the value string */
1438
- static grpc_error *parse_value_string(grpc_chttp2_hpack_parser *p,
1512
+ static grpc_error *parse_value_string(grpc_exec_ctx *exec_ctx,
1513
+ grpc_chttp2_hpack_parser *p,
1439
1514
  const uint8_t *cur, const uint8_t *end,
1440
1515
  bool is_binary) {
1441
- return begin_parse_string(p, cur, end, is_binary ? B64_BYTE0 : NOT_BINARY,
1442
- &p->value);
1516
+ return begin_parse_string(exec_ctx, p, cur, end,
1517
+ is_binary ? B64_BYTE0 : NOT_BINARY, &p->value);
1443
1518
  }
1444
1519
 
1445
1520
  static grpc_error *parse_value_string_with_indexed_key(
1446
- grpc_chttp2_hpack_parser *p, const uint8_t *cur, const uint8_t *end) {
1521
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1522
+ const uint8_t *end) {
1447
1523
  bool is_binary = false;
1448
1524
  grpc_error *err = is_binary_indexed_header(p, &is_binary);
1449
- if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
1450
- return parse_value_string(p, cur, end, is_binary);
1525
+ if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
1526
+ return parse_value_string(exec_ctx, p, cur, end, is_binary);
1451
1527
  }
1452
1528
 
1453
1529
  static grpc_error *parse_value_string_with_literal_key(
1454
- grpc_chttp2_hpack_parser *p, const uint8_t *cur, const uint8_t *end) {
1455
- return parse_value_string(p, cur, end, is_binary_literal_header(p));
1530
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
1531
+ const uint8_t *end) {
1532
+ return parse_value_string(exec_ctx, p, cur, end, is_binary_literal_header(p));
1456
1533
  }
1457
1534
 
1458
1535
  /* PUBLIC INTERFACE */
1459
1536
 
1460
- void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
1537
+ void grpc_chttp2_hpack_parser_init(grpc_exec_ctx *exec_ctx,
1538
+ grpc_chttp2_hpack_parser *p) {
1461
1539
  p->on_header = NULL;
1462
1540
  p->on_header_user_data = NULL;
1463
1541
  p->state = parse_begin;
@@ -1469,7 +1547,7 @@ void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
1469
1547
  p->value.length = 0;
1470
1548
  p->dynamic_table_update_allowed = 2;
1471
1549
  p->last_error = GRPC_ERROR_NONE;
1472
- grpc_chttp2_hptbl_init(&p->table);
1550
+ grpc_chttp2_hptbl_init(exec_ctx, &p->table);
1473
1551
  }
1474
1552
 
1475
1553
  void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
@@ -1477,34 +1555,58 @@ void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
1477
1555
  p->state = parse_stream_dep0;
1478
1556
  }
1479
1557
 
1480
- void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p) {
1481
- grpc_chttp2_hptbl_destroy(&p->table);
1558
+ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx,
1559
+ grpc_chttp2_hpack_parser *p) {
1560
+ grpc_chttp2_hptbl_destroy(exec_ctx, &p->table);
1482
1561
  GRPC_ERROR_UNREF(p->last_error);
1483
1562
  gpr_free(p->key.str);
1484
1563
  gpr_free(p->value.str);
1485
1564
  }
1486
1565
 
1487
- grpc_error *grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p,
1566
+ grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx,
1567
+ grpc_chttp2_hpack_parser *p,
1488
1568
  const uint8_t *beg,
1489
1569
  const uint8_t *end) {
1490
1570
  /* TODO(ctiller): limit the distance of end from beg, and perform multiple
1491
1571
  steps in the event of a large chunk of data to limit
1492
1572
  stack space usage when no tail call optimization is
1493
1573
  available */
1494
- return p->state(p, beg, end);
1574
+ return p->state(exec_ctx, p, beg, end);
1495
1575
  }
1496
1576
 
1497
- grpc_error *grpc_chttp2_header_parser_parse(
1498
- grpc_exec_ctx *exec_ctx, void *hpack_parser,
1499
- grpc_chttp2_transport_parsing *transport_parsing,
1500
- grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) {
1577
+ typedef void (*maybe_complete_func_type)(grpc_exec_ctx *exec_ctx,
1578
+ grpc_chttp2_transport *t,
1579
+ grpc_chttp2_stream *s);
1580
+ static const maybe_complete_func_type maybe_complete_funcs[] = {
1581
+ grpc_chttp2_maybe_complete_recv_initial_metadata,
1582
+ grpc_chttp2_maybe_complete_recv_trailing_metadata};
1583
+
1584
+ static void force_client_rst_stream(grpc_exec_ctx *exec_ctx, void *sp,
1585
+ grpc_error *error) {
1586
+ grpc_chttp2_stream *s = sp;
1587
+ grpc_chttp2_transport *t = s->t;
1588
+ if (!s->write_closed) {
1589
+ grpc_slice_buffer_add(
1590
+ &t->qbuf, grpc_chttp2_rst_stream_create(s->id, GRPC_CHTTP2_NO_ERROR,
1591
+ &s->stats.outgoing));
1592
+ grpc_chttp2_initiate_write(exec_ctx, t, false, "force_rst_stream");
1593
+ grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, true, GRPC_ERROR_NONE);
1594
+ }
1595
+ GRPC_CHTTP2_STREAM_UNREF(exec_ctx, s, "final_rst");
1596
+ }
1597
+
1598
+ grpc_error *grpc_chttp2_header_parser_parse(grpc_exec_ctx *exec_ctx,
1599
+ void *hpack_parser,
1600
+ grpc_chttp2_transport *t,
1601
+ grpc_chttp2_stream *s,
1602
+ grpc_slice slice, int is_last) {
1501
1603
  grpc_chttp2_hpack_parser *parser = hpack_parser;
1502
1604
  GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0);
1503
- if (stream_parsing != NULL) {
1504
- stream_parsing->stats.incoming.header_bytes += GPR_SLICE_LENGTH(slice);
1605
+ if (s != NULL) {
1606
+ s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
1505
1607
  }
1506
1608
  grpc_error *error = grpc_chttp2_hpack_parser_parse(
1507
- parser, GPR_SLICE_START_PTR(slice), GPR_SLICE_END_PTR(slice));
1609
+ exec_ctx, parser, GRPC_SLICE_START_PTR(slice), GRPC_SLICE_END_PTR(slice));
1508
1610
  if (error != GRPC_ERROR_NONE) {
1509
1611
  GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
1510
1612
  return error;
@@ -1517,20 +1619,31 @@ grpc_error *grpc_chttp2_header_parser_parse(
1517
1619
  }
1518
1620
  /* need to check for null stream: this can occur if we receive an invalid
1519
1621
  stream id on a header */
1520
- if (stream_parsing != NULL) {
1622
+ if (s != NULL) {
1521
1623
  if (parser->is_boundary) {
1522
- if (stream_parsing->header_frames_received ==
1523
- GPR_ARRAY_SIZE(stream_parsing->got_metadata_on_parse)) {
1624
+ if (s->header_frames_received == GPR_ARRAY_SIZE(s->metadata_buffer)) {
1524
1625
  return GRPC_ERROR_CREATE("Too many trailer frames");
1525
1626
  }
1526
- stream_parsing
1527
- ->got_metadata_on_parse[stream_parsing->header_frames_received] = 1;
1528
- stream_parsing->header_frames_received++;
1529
- grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
1530
- stream_parsing);
1627
+ s->published_metadata[s->header_frames_received] =
1628
+ GRPC_METADATA_PUBLISHED_FROM_WIRE;
1629
+ maybe_complete_funcs[s->header_frames_received](exec_ctx, t, s);
1630
+ s->header_frames_received++;
1531
1631
  }
1532
1632
  if (parser->is_eof) {
1533
- stream_parsing->received_close = 1;
1633
+ if (t->is_client && !s->write_closed) {
1634
+ /* server eof ==> complete closure; we may need to forcefully close
1635
+ the stream. Wait until the combiner lock is ready to be released
1636
+ however -- it might be that we receive a RST_STREAM following this
1637
+ and can avoid the extra write */
1638
+ GRPC_CHTTP2_STREAM_REF(s, "final_rst");
1639
+ grpc_closure_sched(
1640
+ exec_ctx, grpc_closure_create(force_client_rst_stream, s,
1641
+ grpc_combiner_finally_scheduler(
1642
+ t->combiner, false)),
1643
+ GRPC_ERROR_NONE);
1644
+ }
1645
+ grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false,
1646
+ GRPC_ERROR_NONE);
1534
1647
  }
1535
1648
  }
1536
1649
  parser->on_header = NULL;