grpc 0.11.0 → 0.12.0

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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29456 -0
  3. data/Rakefile +13 -8
  4. data/etc/roots.pem +5114 -0
  5. data/include/grpc/byte_buffer.h +120 -0
  6. data/include/grpc/byte_buffer_reader.h +58 -0
  7. data/include/grpc/census.h +488 -0
  8. data/include/grpc/compression.h +106 -0
  9. data/include/grpc/grpc.h +732 -0
  10. data/include/grpc/grpc_security.h +374 -0
  11. data/include/grpc/grpc_zookeeper.h +59 -0
  12. data/include/grpc/status.h +163 -0
  13. data/include/grpc/support/alloc.h +72 -0
  14. data/include/grpc/support/atm.h +92 -0
  15. data/include/grpc/support/atm_gcc_atomic.h +72 -0
  16. data/include/grpc/support/atm_gcc_sync.h +87 -0
  17. data/include/grpc/support/atm_win32.h +125 -0
  18. data/include/grpc/support/avl.h +91 -0
  19. data/include/grpc/support/cmdline.h +101 -0
  20. data/include/grpc/support/cpu.h +57 -0
  21. data/include/grpc/support/histogram.h +76 -0
  22. data/include/grpc/support/host_port.h +64 -0
  23. data/include/grpc/support/log.h +108 -0
  24. data/include/grpc/support/log_win32.h +51 -0
  25. data/include/grpc/support/port_platform.h +356 -0
  26. data/include/grpc/support/slice.h +182 -0
  27. data/include/grpc/support/slice_buffer.h +102 -0
  28. data/include/grpc/support/string_util.h +61 -0
  29. data/include/grpc/support/subprocess.h +57 -0
  30. data/include/grpc/support/sync.h +315 -0
  31. data/include/grpc/support/sync_generic.h +55 -0
  32. data/include/grpc/support/sync_posix.h +47 -0
  33. data/include/grpc/support/sync_win32.h +49 -0
  34. data/include/grpc/support/thd.h +91 -0
  35. data/include/grpc/support/time.h +128 -0
  36. data/include/grpc/support/tls.h +77 -0
  37. data/include/grpc/support/tls_gcc.h +56 -0
  38. data/include/grpc/support/tls_msvc.h +56 -0
  39. data/include/grpc/support/tls_pthread.h +60 -0
  40. data/include/grpc/support/useful.h +75 -0
  41. data/src/core/census/aggregation.h +66 -0
  42. data/src/core/census/context.c +46 -0
  43. data/src/core/census/context.h +47 -0
  44. data/src/core/census/grpc_context.c +53 -0
  45. data/src/core/census/grpc_filter.c +184 -0
  46. data/src/core/census/grpc_filter.h +44 -0
  47. data/src/core/census/initialize.c +57 -0
  48. data/src/core/census/operation.c +63 -0
  49. data/src/core/census/rpc_metric_id.h +51 -0
  50. data/src/core/census/tracing.c +45 -0
  51. data/src/core/channel/channel_args.c +209 -0
  52. data/src/core/channel/channel_args.h +88 -0
  53. data/src/core/channel/channel_stack.c +262 -0
  54. data/src/core/channel/channel_stack.h +260 -0
  55. data/src/core/channel/client_channel.c +524 -0
  56. data/src/core/channel/client_channel.h +63 -0
  57. data/src/core/channel/client_uchannel.c +243 -0
  58. data/src/core/channel/client_uchannel.h +60 -0
  59. data/src/core/channel/compress_filter.c +297 -0
  60. data/src/core/channel/compress_filter.h +65 -0
  61. data/src/core/channel/connected_channel.c +167 -0
  62. data/src/core/channel/connected_channel.h +51 -0
  63. data/src/core/channel/context.h +49 -0
  64. data/src/core/channel/http_client_filter.c +248 -0
  65. data/src/core/channel/http_client_filter.h +44 -0
  66. data/src/core/channel/http_server_filter.c +233 -0
  67. data/src/core/channel/http_server_filter.h +42 -0
  68. data/src/core/channel/subchannel_call_holder.c +259 -0
  69. data/src/core/channel/subchannel_call_holder.h +98 -0
  70. data/src/core/client_config/client_config.c +72 -0
  71. data/src/core/client_config/client_config.h +53 -0
  72. data/src/core/client_config/connector.c +54 -0
  73. data/src/core/client_config/connector.h +95 -0
  74. data/src/core/client_config/default_initial_connect_string.c +39 -0
  75. data/src/core/client_config/initial_connect_string.c +53 -0
  76. data/src/core/client_config/initial_connect_string.h +50 -0
  77. data/src/core/client_config/lb_policies/pick_first.c +398 -0
  78. data/src/core/client_config/lb_policies/pick_first.h +43 -0
  79. data/src/core/client_config/lb_policies/round_robin.c +537 -0
  80. data/src/core/client_config/lb_policies/round_robin.h +46 -0
  81. data/src/core/client_config/lb_policy.c +134 -0
  82. data/src/core/client_config/lb_policy.h +143 -0
  83. data/src/core/client_config/lb_policy_factory.c +48 -0
  84. data/src/core/client_config/lb_policy_factory.h +73 -0
  85. data/src/core/client_config/lb_policy_registry.c +88 -0
  86. data/src/core/client_config/lb_policy_registry.h +54 -0
  87. data/src/core/client_config/resolver.c +82 -0
  88. data/src/core/client_config/resolver.h +94 -0
  89. data/src/core/client_config/resolver_factory.c +55 -0
  90. data/src/core/client_config/resolver_factory.h +82 -0
  91. data/src/core/client_config/resolver_registry.c +137 -0
  92. data/src/core/client_config/resolver_registry.h +65 -0
  93. data/src/core/client_config/resolvers/dns_resolver.c +257 -0
  94. data/src/core/client_config/resolvers/dns_resolver.h +42 -0
  95. data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
  96. data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
  97. data/src/core/client_config/subchannel.c +697 -0
  98. data/src/core/client_config/subchannel.h +165 -0
  99. data/src/core/client_config/subchannel_factory.c +49 -0
  100. data/src/core/client_config/subchannel_factory.h +66 -0
  101. data/src/core/client_config/uri_parser.c +242 -0
  102. data/src/core/client_config/uri_parser.h +51 -0
  103. data/src/core/compression/algorithm.c +166 -0
  104. data/src/core/compression/algorithm_metadata.h +53 -0
  105. data/src/core/compression/message_compress.c +198 -0
  106. data/src/core/compression/message_compress.h +52 -0
  107. data/src/core/debug/trace.c +136 -0
  108. data/src/core/debug/trace.h +43 -0
  109. data/src/core/httpcli/format_request.c +120 -0
  110. data/src/core/httpcli/format_request.h +45 -0
  111. data/src/core/httpcli/httpcli.c +286 -0
  112. data/src/core/httpcli/httpcli.h +162 -0
  113. data/src/core/httpcli/httpcli_security_connector.c +189 -0
  114. data/src/core/httpcli/parser.c +211 -0
  115. data/src/core/httpcli/parser.h +64 -0
  116. data/src/core/iomgr/closure.c +98 -0
  117. data/src/core/iomgr/closure.h +97 -0
  118. data/src/core/iomgr/endpoint.c +67 -0
  119. data/src/core/iomgr/endpoint.h +102 -0
  120. data/src/core/iomgr/endpoint_pair.h +47 -0
  121. data/src/core/iomgr/endpoint_pair_posix.c +82 -0
  122. data/src/core/iomgr/endpoint_pair_windows.c +97 -0
  123. data/src/core/iomgr/exec_ctx.c +72 -0
  124. data/src/core/iomgr/exec_ctx.h +78 -0
  125. data/src/core/iomgr/executor.c +143 -0
  126. data/src/core/iomgr/executor.h +53 -0
  127. data/src/core/iomgr/fd_posix.c +438 -0
  128. data/src/core/iomgr/fd_posix.h +189 -0
  129. data/src/core/iomgr/iocp_windows.c +206 -0
  130. data/src/core/iomgr/iocp_windows.h +56 -0
  131. data/src/core/iomgr/iomgr.c +156 -0
  132. data/src/core/iomgr/iomgr.h +43 -0
  133. data/src/core/iomgr/iomgr_internal.h +58 -0
  134. data/src/core/iomgr/iomgr_posix.c +52 -0
  135. data/src/core/iomgr/iomgr_posix.h +39 -0
  136. data/src/core/iomgr/iomgr_windows.c +73 -0
  137. data/src/core/iomgr/pollset.h +95 -0
  138. data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
  139. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
  140. data/src/core/iomgr/pollset_posix.c +638 -0
  141. data/src/core/iomgr/pollset_posix.h +147 -0
  142. data/src/core/iomgr/pollset_set.h +67 -0
  143. data/src/core/iomgr/pollset_set_posix.c +182 -0
  144. data/src/core/iomgr/pollset_set_posix.h +61 -0
  145. data/src/core/iomgr/pollset_set_windows.c +60 -0
  146. data/src/core/iomgr/pollset_set_windows.h +39 -0
  147. data/src/core/iomgr/pollset_windows.c +248 -0
  148. data/src/core/iomgr/pollset_windows.h +79 -0
  149. data/src/core/iomgr/resolve_address.h +72 -0
  150. data/src/core/iomgr/resolve_address_posix.c +183 -0
  151. data/src/core/iomgr/resolve_address_windows.c +166 -0
  152. data/src/core/iomgr/sockaddr.h +47 -0
  153. data/src/core/iomgr/sockaddr_posix.h +44 -0
  154. data/src/core/iomgr/sockaddr_utils.c +234 -0
  155. data/src/core/iomgr/sockaddr_utils.h +89 -0
  156. data/src/core/iomgr/sockaddr_win32.h +46 -0
  157. data/src/core/iomgr/socket_utils_common_posix.c +208 -0
  158. data/src/core/iomgr/socket_utils_linux.c +51 -0
  159. data/src/core/iomgr/socket_utils_posix.c +70 -0
  160. data/src/core/iomgr/socket_utils_posix.h +113 -0
  161. data/src/core/iomgr/socket_windows.c +98 -0
  162. data/src/core/iomgr/socket_windows.h +111 -0
  163. data/src/core/iomgr/tcp_client.h +53 -0
  164. data/src/core/iomgr/tcp_client_posix.c +304 -0
  165. data/src/core/iomgr/tcp_client_windows.c +221 -0
  166. data/src/core/iomgr/tcp_posix.c +485 -0
  167. data/src/core/iomgr/tcp_posix.h +65 -0
  168. data/src/core/iomgr/tcp_server.h +83 -0
  169. data/src/core/iomgr/tcp_server_posix.c +562 -0
  170. data/src/core/iomgr/tcp_server_windows.c +509 -0
  171. data/src/core/iomgr/tcp_windows.c +406 -0
  172. data/src/core/iomgr/tcp_windows.h +57 -0
  173. data/src/core/iomgr/time_averaged_stats.c +77 -0
  174. data/src/core/iomgr/time_averaged_stats.h +88 -0
  175. data/src/core/iomgr/timer.c +345 -0
  176. data/src/core/iomgr/timer.h +89 -0
  177. data/src/core/iomgr/timer_heap.c +148 -0
  178. data/src/core/iomgr/timer_heap.h +57 -0
  179. data/src/core/iomgr/timer_internal.h +61 -0
  180. data/src/core/iomgr/udp_server.c +439 -0
  181. data/src/core/iomgr/udp_server.h +83 -0
  182. data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
  183. data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
  184. data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
  185. data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
  186. data/src/core/iomgr/wakeup_fd_posix.c +72 -0
  187. data/src/core/iomgr/wakeup_fd_posix.h +101 -0
  188. data/src/core/iomgr/workqueue.h +85 -0
  189. data/src/core/iomgr/workqueue_posix.c +143 -0
  190. data/src/core/iomgr/workqueue_posix.h +51 -0
  191. data/src/core/iomgr/workqueue_windows.c +40 -0
  192. data/src/core/iomgr/workqueue_windows.h +37 -0
  193. data/src/core/json/json.c +64 -0
  194. data/src/core/json/json.h +88 -0
  195. data/src/core/json/json_common.h +49 -0
  196. data/src/core/json/json_reader.c +660 -0
  197. data/src/core/json/json_reader.h +160 -0
  198. data/src/core/json/json_string.c +379 -0
  199. data/src/core/json/json_writer.c +260 -0
  200. data/src/core/json/json_writer.h +97 -0
  201. data/src/core/profiling/basic_timers.c +274 -0
  202. data/src/core/profiling/stap_timers.c +65 -0
  203. data/src/core/profiling/timers.h +119 -0
  204. data/src/core/security/auth_filters.h +42 -0
  205. data/src/core/security/base64.c +233 -0
  206. data/src/core/security/base64.h +52 -0
  207. data/src/core/security/client_auth_filter.c +337 -0
  208. data/src/core/security/credentials.c +1273 -0
  209. data/src/core/security/credentials.h +376 -0
  210. data/src/core/security/credentials_metadata.c +101 -0
  211. data/src/core/security/credentials_posix.c +61 -0
  212. data/src/core/security/credentials_win32.c +61 -0
  213. data/src/core/security/google_default_credentials.c +260 -0
  214. data/src/core/security/handshake.c +327 -0
  215. data/src/core/security/handshake.h +50 -0
  216. data/src/core/security/json_token.c +405 -0
  217. data/src/core/security/json_token.h +118 -0
  218. data/src/core/security/jwt_verifier.c +842 -0
  219. data/src/core/security/jwt_verifier.h +136 -0
  220. data/src/core/security/secure_endpoint.c +383 -0
  221. data/src/core/security/secure_endpoint.h +49 -0
  222. data/src/core/security/security_connector.c +756 -0
  223. data/src/core/security/security_connector.h +246 -0
  224. data/src/core/security/security_context.c +342 -0
  225. data/src/core/security/security_context.h +114 -0
  226. data/src/core/security/server_auth_filter.c +264 -0
  227. data/src/core/security/server_secure_chttp2.c +268 -0
  228. data/src/core/statistics/census_interface.h +76 -0
  229. data/src/core/statistics/census_rpc_stats.h +101 -0
  230. data/src/core/support/alloc.c +90 -0
  231. data/src/core/support/avl.c +288 -0
  232. data/src/core/support/block_annotate.h +48 -0
  233. data/src/core/support/cmdline.c +347 -0
  234. data/src/core/support/cpu_iphone.c +49 -0
  235. data/src/core/support/cpu_linux.c +78 -0
  236. data/src/core/support/cpu_posix.c +77 -0
  237. data/src/core/support/cpu_windows.c +47 -0
  238. data/src/core/support/env.h +60 -0
  239. data/src/core/support/env_linux.c +62 -0
  240. data/src/core/support/env_posix.c +57 -0
  241. data/src/core/support/env_win32.c +65 -0
  242. data/src/core/support/file.c +91 -0
  243. data/src/core/support/file.h +63 -0
  244. data/src/core/support/file_posix.c +85 -0
  245. data/src/core/support/file_win32.c +84 -0
  246. data/src/core/support/histogram.c +244 -0
  247. data/src/core/support/host_port.c +110 -0
  248. data/src/core/support/log.c +66 -0
  249. data/src/core/support/log_android.c +87 -0
  250. data/src/core/support/log_linux.c +105 -0
  251. data/src/core/support/log_posix.c +102 -0
  252. data/src/core/support/log_win32.c +125 -0
  253. data/src/core/support/murmur_hash.c +96 -0
  254. data/src/core/support/murmur_hash.h +44 -0
  255. data/src/core/support/slice.c +343 -0
  256. data/src/core/support/slice_buffer.c +282 -0
  257. data/src/core/support/stack_lockfree.c +175 -0
  258. data/src/core/support/stack_lockfree.h +53 -0
  259. data/src/core/support/string.c +296 -0
  260. data/src/core/support/string.h +121 -0
  261. data/src/core/support/string_posix.c +86 -0
  262. data/src/core/support/string_win32.c +109 -0
  263. data/src/core/support/string_win32.h +47 -0
  264. data/src/core/support/subprocess_posix.c +112 -0
  265. data/src/core/support/sync.c +122 -0
  266. data/src/core/support/sync_posix.c +104 -0
  267. data/src/core/support/sync_win32.c +128 -0
  268. data/src/core/support/thd.c +64 -0
  269. data/src/core/support/thd_internal.h +39 -0
  270. data/src/core/support/thd_posix.c +94 -0
  271. data/src/core/support/thd_win32.c +117 -0
  272. data/src/core/support/time.c +304 -0
  273. data/src/core/support/time_posix.c +161 -0
  274. data/src/core/support/time_precise.c +89 -0
  275. data/src/core/support/time_precise.h +42 -0
  276. data/src/core/support/time_win32.c +101 -0
  277. data/src/core/support/tls_pthread.c +45 -0
  278. data/src/core/surface/api_trace.c +36 -0
  279. data/src/core/surface/api_trace.h +65 -0
  280. data/src/core/surface/byte_buffer.c +97 -0
  281. data/src/core/surface/byte_buffer_reader.c +123 -0
  282. data/src/core/surface/call.c +1424 -0
  283. data/src/core/surface/call.h +109 -0
  284. data/src/core/surface/call_details.c +50 -0
  285. data/src/core/surface/call_log_batch.c +118 -0
  286. data/src/core/surface/call_test_only.h +64 -0
  287. data/src/core/surface/channel.c +327 -0
  288. data/src/core/surface/channel.h +74 -0
  289. data/src/core/surface/channel_connectivity.c +220 -0
  290. data/src/core/surface/channel_create.c +235 -0
  291. data/src/core/surface/channel_ping.c +79 -0
  292. data/src/core/surface/completion_queue.c +481 -0
  293. data/src/core/surface/completion_queue.h +91 -0
  294. data/src/core/surface/event_string.c +81 -0
  295. data/src/core/surface/event_string.h +42 -0
  296. data/src/core/surface/init.c +168 -0
  297. data/src/core/surface/init.h +40 -0
  298. data/src/core/surface/init_secure.c +42 -0
  299. data/src/core/surface/lame_client.c +149 -0
  300. data/src/core/surface/metadata_array.c +49 -0
  301. data/src/core/surface/secure_channel_create.c +336 -0
  302. data/src/core/surface/server.c +1343 -0
  303. data/src/core/surface/server.h +67 -0
  304. data/src/core/surface/server_chttp2.c +149 -0
  305. data/src/core/surface/server_create.c +51 -0
  306. data/src/core/surface/surface_trace.h +48 -0
  307. data/src/core/surface/validate_metadata.c +73 -0
  308. data/src/core/surface/version.c +39 -0
  309. data/src/core/transport/byte_stream.c +76 -0
  310. data/src/core/transport/byte_stream.h +88 -0
  311. data/src/core/transport/chttp2/alpn.c +56 -0
  312. data/src/core/transport/chttp2/alpn.h +49 -0
  313. data/src/core/transport/chttp2/bin_encoder.c +285 -0
  314. data/src/core/transport/chttp2/bin_encoder.h +54 -0
  315. data/src/core/transport/chttp2/frame.h +69 -0
  316. data/src/core/transport/chttp2/frame_data.c +245 -0
  317. data/src/core/transport/chttp2/frame_data.h +101 -0
  318. data/src/core/transport/chttp2/frame_goaway.c +193 -0
  319. data/src/core/transport/chttp2/frame_goaway.h +77 -0
  320. data/src/core/transport/chttp2/frame_ping.c +97 -0
  321. data/src/core/transport/chttp2/frame_ping.h +56 -0
  322. data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
  323. data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
  324. data/src/core/transport/chttp2/frame_settings.c +259 -0
  325. data/src/core/transport/chttp2/frame_settings.h +103 -0
  326. data/src/core/transport/chttp2/frame_window_update.c +114 -0
  327. data/src/core/transport/chttp2/frame_window_update.h +58 -0
  328. data/src/core/transport/chttp2/hpack_encoder.c +572 -0
  329. data/src/core/transport/chttp2/hpack_encoder.h +95 -0
  330. data/src/core/transport/chttp2/hpack_parser.c +1449 -0
  331. data/src/core/transport/chttp2/hpack_parser.h +116 -0
  332. data/src/core/transport/chttp2/hpack_table.c +361 -0
  333. data/src/core/transport/chttp2/hpack_table.h +108 -0
  334. data/src/core/transport/chttp2/http2_errors.h +56 -0
  335. data/src/core/transport/chttp2/huffsyms.c +297 -0
  336. data/src/core/transport/chttp2/huffsyms.h +48 -0
  337. data/src/core/transport/chttp2/incoming_metadata.c +96 -0
  338. data/src/core/transport/chttp2/incoming_metadata.h +60 -0
  339. data/src/core/transport/chttp2/internal.h +757 -0
  340. data/src/core/transport/chttp2/parsing.c +866 -0
  341. data/src/core/transport/chttp2/status_conversion.c +109 -0
  342. data/src/core/transport/chttp2/status_conversion.h +50 -0
  343. data/src/core/transport/chttp2/stream_lists.c +401 -0
  344. data/src/core/transport/chttp2/stream_map.c +198 -0
  345. data/src/core/transport/chttp2/stream_map.h +85 -0
  346. data/src/core/transport/chttp2/timeout_encoding.c +185 -0
  347. data/src/core/transport/chttp2/timeout_encoding.h +47 -0
  348. data/src/core/transport/chttp2/varint.c +66 -0
  349. data/src/core/transport/chttp2/varint.h +76 -0
  350. data/src/core/transport/chttp2/writing.c +356 -0
  351. data/src/core/transport/chttp2_transport.c +1692 -0
  352. data/src/core/transport/chttp2_transport.h +51 -0
  353. data/src/core/transport/connectivity_state.c +164 -0
  354. data/src/core/transport/connectivity_state.h +85 -0
  355. data/src/core/transport/metadata.c +690 -0
  356. data/src/core/transport/metadata.h +156 -0
  357. data/src/core/transport/metadata_batch.c +194 -0
  358. data/src/core/transport/metadata_batch.h +125 -0
  359. data/src/core/transport/static_metadata.c +90 -0
  360. data/src/core/transport/static_metadata.h +408 -0
  361. data/src/core/transport/transport.c +183 -0
  362. data/src/core/transport/transport.h +222 -0
  363. data/src/core/transport/transport_impl.h +78 -0
  364. data/src/core/transport/transport_op_string.c +140 -0
  365. data/src/core/tsi/fake_transport_security.c +525 -0
  366. data/src/core/tsi/fake_transport_security.h +61 -0
  367. data/src/core/tsi/ssl_transport_security.c +1467 -0
  368. data/src/core/tsi/ssl_transport_security.h +173 -0
  369. data/src/core/tsi/transport_security.c +284 -0
  370. data/src/core/tsi/transport_security.h +111 -0
  371. data/src/core/tsi/transport_security_interface.h +344 -0
  372. data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
  373. data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
  374. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
  375. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
  376. data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
  377. data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
  378. data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
  379. data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
  380. data/src/ruby/bin/math.rb +32 -0
  381. data/{bin → src/ruby/bin}/math_client.rb +1 -1
  382. data/{bin → src/ruby/bin}/math_server.rb +1 -1
  383. data/src/ruby/bin/math_services.rb +27 -0
  384. data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
  385. data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
  386. data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
  387. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
  388. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
  389. data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
  390. data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
  391. data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
  392. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  393. data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
  394. data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
  395. data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
  396. data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
  397. data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
  398. data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
  399. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
  400. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
  401. data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
  402. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  403. data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
  404. data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
  405. data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
  406. data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
  407. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
  408. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
  409. data/{lib → src/ruby/lib}/grpc.rb +6 -1
  410. data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
  411. data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
  412. data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
  413. data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
  414. data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
  415. data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
  416. data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
  417. data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
  418. data/src/ruby/lib/grpc/grpc.so +0 -0
  419. data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
  420. data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
  421. data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
  422. data/src/ruby/pb/README.md +42 -0
  423. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  424. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  425. data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
  426. data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
  427. data/src/ruby/pb/test/client.rb +469 -0
  428. data/src/ruby/pb/test/proto/empty.rb +15 -0
  429. data/src/ruby/pb/test/proto/messages.rb +80 -0
  430. data/src/ruby/pb/test/proto/test.rb +14 -0
  431. data/src/ruby/pb/test/proto/test_services.rb +64 -0
  432. data/src/ruby/pb/test/server.rb +253 -0
  433. data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
  434. data/{spec → src/ruby/spec}/call_spec.rb +10 -1
  435. data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
  436. data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
  437. data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
  438. data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
  439. data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
  440. data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
  441. data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
  442. data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
  443. data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
  444. data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
  445. data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
  446. data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
  447. data/{spec → src/ruby/spec}/server_spec.rb +0 -0
  448. data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
  449. data/{spec → src/ruby/spec}/testdata/README +0 -0
  450. data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
  451. data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
  452. data/src/ruby/spec/testdata/server1.pem +16 -0
  453. data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
  454. metadata +496 -97
  455. data/bin/math.proto +0 -80
  456. data/bin/math.rb +0 -61
  457. data/ext/grpc/rb_credentials.c +0 -294
  458. data/lib/grpc/grpc.so +0 -0
  459. data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,866 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/transport/chttp2/internal.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include <grpc/support/alloc.h>
39
+ #include <grpc/support/log.h>
40
+ #include <grpc/support/string_util.h>
41
+
42
+ #include "src/core/profiling/timers.h"
43
+ #include "src/core/transport/chttp2/http2_errors.h"
44
+ #include "src/core/transport/chttp2/status_conversion.h"
45
+ #include "src/core/transport/chttp2/timeout_encoding.h"
46
+ #include "src/core/transport/static_metadata.h"
47
+
48
+ static int init_frame_parser(grpc_exec_ctx *exec_ctx,
49
+ grpc_chttp2_transport_parsing *transport_parsing);
50
+ static int init_header_frame_parser(
51
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
52
+ int is_continuation);
53
+ static int init_data_frame_parser(
54
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing);
55
+ static int init_rst_stream_parser(
56
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing);
57
+ static int init_settings_frame_parser(
58
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing);
59
+ static int init_window_update_frame_parser(
60
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing);
61
+ static int init_ping_parser(grpc_exec_ctx *exec_ctx,
62
+ grpc_chttp2_transport_parsing *transport_parsing);
63
+ static int init_goaway_parser(grpc_exec_ctx *exec_ctx,
64
+ grpc_chttp2_transport_parsing *transport_parsing);
65
+ static int init_skip_frame_parser(
66
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
67
+ int is_header);
68
+
69
+ static int parse_frame_slice(grpc_exec_ctx *exec_ctx,
70
+ grpc_chttp2_transport_parsing *transport_parsing,
71
+ gpr_slice slice, int is_last);
72
+
73
+ void grpc_chttp2_prepare_to_read(
74
+ grpc_chttp2_transport_global *transport_global,
75
+ grpc_chttp2_transport_parsing *transport_parsing) {
76
+ grpc_chttp2_stream_global *stream_global;
77
+ grpc_chttp2_stream_parsing *stream_parsing;
78
+
79
+ GPR_TIMER_BEGIN("grpc_chttp2_prepare_to_read", 0);
80
+
81
+ transport_parsing->next_stream_id = transport_global->next_stream_id;
82
+ transport_parsing->last_sent_max_table_size =
83
+ transport_global->settings[GRPC_SENT_SETTINGS]
84
+ [GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE];
85
+
86
+ /* update the parsing view of incoming window */
87
+ while (grpc_chttp2_list_pop_unannounced_incoming_window_available(
88
+ transport_global, transport_parsing, &stream_global, &stream_parsing)) {
89
+ GRPC_CHTTP2_FLOW_MOVE_STREAM("parse", transport_parsing, stream_parsing,
90
+ incoming_window, stream_global,
91
+ unannounced_incoming_window_for_parse);
92
+ }
93
+
94
+ GPR_TIMER_END("grpc_chttp2_prepare_to_read", 0);
95
+ }
96
+
97
+ void grpc_chttp2_publish_reads(
98
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
99
+ grpc_chttp2_transport_parsing *transport_parsing) {
100
+ grpc_chttp2_stream_global *stream_global;
101
+ grpc_chttp2_stream_parsing *stream_parsing;
102
+ int was_zero;
103
+ int is_zero;
104
+
105
+ /* transport_parsing->last_incoming_stream_id is used as
106
+ last-grpc_chttp2_stream-id when
107
+ sending GOAWAY frame.
108
+ https://tools.ietf.org/html/draft-ietf-httpbis-http2-17#section-6.8
109
+ says that last-grpc_chttp2_stream-id is peer-initiated grpc_chttp2_stream
110
+ ID. So,
111
+ since we don't have server pushed streams, client should send
112
+ GOAWAY last-grpc_chttp2_stream-id=0 in this case. */
113
+ if (!transport_parsing->is_client) {
114
+ transport_global->last_incoming_stream_id =
115
+ transport_parsing->incoming_stream_id;
116
+ }
117
+
118
+ /* update global settings */
119
+ if (transport_parsing->settings_updated) {
120
+ memcpy(transport_global->settings[GRPC_PEER_SETTINGS],
121
+ transport_parsing->settings, sizeof(transport_parsing->settings));
122
+ transport_parsing->settings_updated = 0;
123
+ }
124
+
125
+ /* update settings based on ack if received */
126
+ if (transport_parsing->settings_ack_received) {
127
+ memcpy(transport_global->settings[GRPC_ACKED_SETTINGS],
128
+ transport_global->settings[GRPC_SENT_SETTINGS],
129
+ GRPC_CHTTP2_NUM_SETTINGS * sizeof(gpr_uint32));
130
+ transport_parsing->settings_ack_received = 0;
131
+ transport_global->sent_local_settings = 0;
132
+ }
133
+
134
+ /* move goaway to the global state if we received one (it will be
135
+ published later */
136
+ if (transport_parsing->goaway_received) {
137
+ grpc_chttp2_add_incoming_goaway(exec_ctx, transport_global,
138
+ (gpr_uint32)transport_parsing->goaway_error,
139
+ transport_parsing->goaway_text);
140
+ transport_parsing->goaway_text = gpr_empty_slice();
141
+ transport_parsing->goaway_received = 0;
142
+ }
143
+
144
+ /* propagate flow control tokens to global state */
145
+ was_zero = transport_global->outgoing_window <= 0;
146
+ GRPC_CHTTP2_FLOW_MOVE_TRANSPORT("parsed", transport_global, outgoing_window,
147
+ transport_parsing, outgoing_window);
148
+ is_zero = transport_global->outgoing_window <= 0;
149
+ if (was_zero && !is_zero) {
150
+ while (grpc_chttp2_list_pop_stalled_by_transport(transport_global,
151
+ &stream_global)) {
152
+ grpc_chttp2_list_add_writable_stream(transport_global, stream_global);
153
+ }
154
+ }
155
+
156
+ if (transport_parsing->incoming_window <
157
+ transport_global->connection_window_target * 3 / 4) {
158
+ gpr_int64 announce_bytes = transport_global->connection_window_target -
159
+ transport_parsing->incoming_window;
160
+ GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", transport_global,
161
+ announce_incoming_window, announce_bytes);
162
+ GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", transport_parsing,
163
+ incoming_window, announce_bytes);
164
+ }
165
+
166
+ /* for each stream that saw an update, fixup global state */
167
+ while (grpc_chttp2_list_pop_parsing_seen_stream(
168
+ transport_global, transport_parsing, &stream_global, &stream_parsing)) {
169
+ if (stream_parsing->seen_error) {
170
+ stream_global->seen_error = 1;
171
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
172
+ }
173
+
174
+ /* update outgoing flow control window */
175
+ was_zero = stream_global->outgoing_window <= 0;
176
+ GRPC_CHTTP2_FLOW_MOVE_STREAM("parsed", transport_global, stream_global,
177
+ outgoing_window, stream_parsing,
178
+ outgoing_window);
179
+ is_zero = stream_global->outgoing_window <= 0;
180
+ if (was_zero && !is_zero) {
181
+ grpc_chttp2_list_add_writable_stream(transport_global, stream_global);
182
+ }
183
+
184
+ stream_global->max_recv_bytes -= (gpr_uint32)GPR_MIN(
185
+ stream_global->max_recv_bytes, stream_parsing->received_bytes);
186
+ stream_parsing->received_bytes = 0;
187
+
188
+ /* publish incoming stream ops */
189
+ if (stream_global->incoming_frames.tail != NULL) {
190
+ stream_global->incoming_frames.tail->is_tail = 0;
191
+ }
192
+ if (stream_parsing->data_parser.incoming_frames.head != NULL) {
193
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
194
+ }
195
+ grpc_chttp2_incoming_frame_queue_merge(
196
+ &stream_global->incoming_frames,
197
+ &stream_parsing->data_parser.incoming_frames);
198
+ if (stream_global->incoming_frames.tail != NULL) {
199
+ stream_global->incoming_frames.tail->is_tail = 1;
200
+ }
201
+
202
+ if (!stream_global->published_initial_metadata &&
203
+ stream_parsing->got_metadata_on_parse[0]) {
204
+ stream_parsing->got_metadata_on_parse[0] = 0;
205
+ stream_global->published_initial_metadata = 1;
206
+ GPR_SWAP(grpc_chttp2_incoming_metadata_buffer,
207
+ stream_parsing->metadata_buffer[0],
208
+ stream_global->received_initial_metadata);
209
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
210
+ }
211
+ if (!stream_global->published_trailing_metadata &&
212
+ stream_parsing->got_metadata_on_parse[1]) {
213
+ stream_parsing->got_metadata_on_parse[1] = 0;
214
+ stream_global->published_trailing_metadata = 1;
215
+ GPR_SWAP(grpc_chttp2_incoming_metadata_buffer,
216
+ stream_parsing->metadata_buffer[1],
217
+ stream_global->received_trailing_metadata);
218
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
219
+ }
220
+
221
+ if (stream_parsing->saw_rst_stream) {
222
+ if (stream_parsing->rst_stream_reason != GRPC_CHTTP2_NO_ERROR) {
223
+ grpc_status_code status_code = grpc_chttp2_http2_error_to_grpc_status(
224
+ (grpc_chttp2_error_code)stream_parsing->rst_stream_reason);
225
+ char *status_details;
226
+ gpr_slice slice_details;
227
+ gpr_asprintf(&status_details, "Received RST_STREAM err=%d",
228
+ stream_parsing->rst_stream_reason);
229
+ slice_details = gpr_slice_from_copied_string(status_details);
230
+ gpr_free(status_details);
231
+ grpc_chttp2_fake_status(exec_ctx, transport_global, stream_global,
232
+ status_code, &slice_details);
233
+ }
234
+ grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
235
+ 1, 1);
236
+ }
237
+
238
+ if (stream_parsing->received_close) {
239
+ grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
240
+ 1, 0);
241
+ }
242
+ }
243
+ }
244
+
245
+ int grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx,
246
+ grpc_chttp2_transport_parsing *transport_parsing,
247
+ gpr_slice slice) {
248
+ gpr_uint8 *beg = GPR_SLICE_START_PTR(slice);
249
+ gpr_uint8 *end = GPR_SLICE_END_PTR(slice);
250
+ gpr_uint8 *cur = beg;
251
+
252
+ if (cur == end) return 1;
253
+
254
+ switch (transport_parsing->deframe_state) {
255
+ case GRPC_DTS_CLIENT_PREFIX_0:
256
+ case GRPC_DTS_CLIENT_PREFIX_1:
257
+ case GRPC_DTS_CLIENT_PREFIX_2:
258
+ case GRPC_DTS_CLIENT_PREFIX_3:
259
+ case GRPC_DTS_CLIENT_PREFIX_4:
260
+ case GRPC_DTS_CLIENT_PREFIX_5:
261
+ case GRPC_DTS_CLIENT_PREFIX_6:
262
+ case GRPC_DTS_CLIENT_PREFIX_7:
263
+ case GRPC_DTS_CLIENT_PREFIX_8:
264
+ case GRPC_DTS_CLIENT_PREFIX_9:
265
+ case GRPC_DTS_CLIENT_PREFIX_10:
266
+ case GRPC_DTS_CLIENT_PREFIX_11:
267
+ case GRPC_DTS_CLIENT_PREFIX_12:
268
+ case GRPC_DTS_CLIENT_PREFIX_13:
269
+ case GRPC_DTS_CLIENT_PREFIX_14:
270
+ case GRPC_DTS_CLIENT_PREFIX_15:
271
+ case GRPC_DTS_CLIENT_PREFIX_16:
272
+ case GRPC_DTS_CLIENT_PREFIX_17:
273
+ case GRPC_DTS_CLIENT_PREFIX_18:
274
+ case GRPC_DTS_CLIENT_PREFIX_19:
275
+ case GRPC_DTS_CLIENT_PREFIX_20:
276
+ case GRPC_DTS_CLIENT_PREFIX_21:
277
+ case GRPC_DTS_CLIENT_PREFIX_22:
278
+ case GRPC_DTS_CLIENT_PREFIX_23:
279
+ while (cur != end && transport_parsing->deframe_state != GRPC_DTS_FH_0) {
280
+ if (*cur != GRPC_CHTTP2_CLIENT_CONNECT_STRING[transport_parsing
281
+ ->deframe_state]) {
282
+ gpr_log(GPR_INFO,
283
+ "Connect string mismatch: expected '%c' (%d) got '%c' (%d) "
284
+ "at byte %d",
285
+ GRPC_CHTTP2_CLIENT_CONNECT_STRING[transport_parsing
286
+ ->deframe_state],
287
+ (int)(gpr_uint8)GRPC_CHTTP2_CLIENT_CONNECT_STRING
288
+ [transport_parsing->deframe_state],
289
+ *cur, (int)*cur, transport_parsing->deframe_state);
290
+ return 0;
291
+ }
292
+ ++cur;
293
+ ++transport_parsing->deframe_state;
294
+ }
295
+ if (cur == end) {
296
+ return 1;
297
+ }
298
+ /* fallthrough */
299
+ dts_fh_0:
300
+ case GRPC_DTS_FH_0:
301
+ GPR_ASSERT(cur < end);
302
+ transport_parsing->incoming_frame_size = ((gpr_uint32)*cur) << 16;
303
+ if (++cur == end) {
304
+ transport_parsing->deframe_state = GRPC_DTS_FH_1;
305
+ return 1;
306
+ }
307
+ /* fallthrough */
308
+ case GRPC_DTS_FH_1:
309
+ GPR_ASSERT(cur < end);
310
+ transport_parsing->incoming_frame_size |= ((gpr_uint32)*cur) << 8;
311
+ if (++cur == end) {
312
+ transport_parsing->deframe_state = GRPC_DTS_FH_2;
313
+ return 1;
314
+ }
315
+ /* fallthrough */
316
+ case GRPC_DTS_FH_2:
317
+ GPR_ASSERT(cur < end);
318
+ transport_parsing->incoming_frame_size |= *cur;
319
+ if (++cur == end) {
320
+ transport_parsing->deframe_state = GRPC_DTS_FH_3;
321
+ return 1;
322
+ }
323
+ /* fallthrough */
324
+ case GRPC_DTS_FH_3:
325
+ GPR_ASSERT(cur < end);
326
+ transport_parsing->incoming_frame_type = *cur;
327
+ if (++cur == end) {
328
+ transport_parsing->deframe_state = GRPC_DTS_FH_4;
329
+ return 1;
330
+ }
331
+ /* fallthrough */
332
+ case GRPC_DTS_FH_4:
333
+ GPR_ASSERT(cur < end);
334
+ transport_parsing->incoming_frame_flags = *cur;
335
+ if (++cur == end) {
336
+ transport_parsing->deframe_state = GRPC_DTS_FH_5;
337
+ return 1;
338
+ }
339
+ /* fallthrough */
340
+ case GRPC_DTS_FH_5:
341
+ GPR_ASSERT(cur < end);
342
+ transport_parsing->incoming_stream_id = (((gpr_uint32)*cur) & 0x7f) << 24;
343
+ if (++cur == end) {
344
+ transport_parsing->deframe_state = GRPC_DTS_FH_6;
345
+ return 1;
346
+ }
347
+ /* fallthrough */
348
+ case GRPC_DTS_FH_6:
349
+ GPR_ASSERT(cur < end);
350
+ transport_parsing->incoming_stream_id |= ((gpr_uint32)*cur) << 16;
351
+ if (++cur == end) {
352
+ transport_parsing->deframe_state = GRPC_DTS_FH_7;
353
+ return 1;
354
+ }
355
+ /* fallthrough */
356
+ case GRPC_DTS_FH_7:
357
+ GPR_ASSERT(cur < end);
358
+ transport_parsing->incoming_stream_id |= ((gpr_uint32)*cur) << 8;
359
+ if (++cur == end) {
360
+ transport_parsing->deframe_state = GRPC_DTS_FH_8;
361
+ return 1;
362
+ }
363
+ /* fallthrough */
364
+ case GRPC_DTS_FH_8:
365
+ GPR_ASSERT(cur < end);
366
+ transport_parsing->incoming_stream_id |= ((gpr_uint32)*cur);
367
+ transport_parsing->deframe_state = GRPC_DTS_FRAME;
368
+ if (!init_frame_parser(exec_ctx, transport_parsing)) {
369
+ return 0;
370
+ }
371
+ if (transport_parsing->incoming_stream_id) {
372
+ transport_parsing->last_incoming_stream_id =
373
+ transport_parsing->incoming_stream_id;
374
+ }
375
+ if (transport_parsing->incoming_frame_size == 0) {
376
+ if (!parse_frame_slice(exec_ctx, transport_parsing, gpr_empty_slice(),
377
+ 1)) {
378
+ return 0;
379
+ }
380
+ transport_parsing->incoming_stream = NULL;
381
+ if (++cur == end) {
382
+ transport_parsing->deframe_state = GRPC_DTS_FH_0;
383
+ return 1;
384
+ }
385
+ goto dts_fh_0; /* loop */
386
+ }
387
+ if (++cur == end) {
388
+ return 1;
389
+ }
390
+ /* fallthrough */
391
+ case GRPC_DTS_FRAME:
392
+ GPR_ASSERT(cur < end);
393
+ if ((gpr_uint32)(end - cur) == transport_parsing->incoming_frame_size) {
394
+ if (!parse_frame_slice(exec_ctx, transport_parsing,
395
+ gpr_slice_sub_no_ref(slice, (size_t)(cur - beg),
396
+ (size_t)(end - beg)),
397
+ 1)) {
398
+ return 0;
399
+ }
400
+ transport_parsing->deframe_state = GRPC_DTS_FH_0;
401
+ transport_parsing->incoming_stream = NULL;
402
+ return 1;
403
+ } else if ((gpr_uint32)(end - cur) >
404
+ transport_parsing->incoming_frame_size) {
405
+ size_t cur_offset = (size_t)(cur - beg);
406
+ if (!parse_frame_slice(
407
+ exec_ctx, transport_parsing,
408
+ gpr_slice_sub_no_ref(
409
+ slice, cur_offset,
410
+ cur_offset + transport_parsing->incoming_frame_size),
411
+ 1)) {
412
+ return 0;
413
+ }
414
+ cur += transport_parsing->incoming_frame_size;
415
+ transport_parsing->incoming_stream = NULL;
416
+ goto dts_fh_0; /* loop */
417
+ } else {
418
+ if (!parse_frame_slice(exec_ctx, transport_parsing,
419
+ gpr_slice_sub_no_ref(slice, (size_t)(cur - beg),
420
+ (size_t)(end - beg)),
421
+ 0)) {
422
+ return 0;
423
+ }
424
+ transport_parsing->incoming_frame_size -= (gpr_uint32)(end - cur);
425
+ return 1;
426
+ }
427
+ GPR_UNREACHABLE_CODE(return 0);
428
+ }
429
+
430
+ GPR_UNREACHABLE_CODE(return 0);
431
+ }
432
+
433
+ static int init_frame_parser(grpc_exec_ctx *exec_ctx,
434
+ grpc_chttp2_transport_parsing *transport_parsing) {
435
+ if (transport_parsing->expect_continuation_stream_id != 0) {
436
+ if (transport_parsing->incoming_frame_type !=
437
+ GRPC_CHTTP2_FRAME_CONTINUATION) {
438
+ gpr_log(GPR_ERROR, "Expected CONTINUATION frame, got frame type %02x",
439
+ transport_parsing->incoming_frame_type);
440
+ return 0;
441
+ }
442
+ if (transport_parsing->expect_continuation_stream_id !=
443
+ transport_parsing->incoming_stream_id) {
444
+ gpr_log(GPR_ERROR,
445
+ "Expected CONTINUATION frame for grpc_chttp2_stream %08x, got "
446
+ "grpc_chttp2_stream %08x",
447
+ transport_parsing->expect_continuation_stream_id,
448
+ transport_parsing->incoming_stream_id);
449
+ return 0;
450
+ }
451
+ return init_header_frame_parser(exec_ctx, transport_parsing, 1);
452
+ }
453
+ switch (transport_parsing->incoming_frame_type) {
454
+ case GRPC_CHTTP2_FRAME_DATA:
455
+ return init_data_frame_parser(exec_ctx, transport_parsing);
456
+ case GRPC_CHTTP2_FRAME_HEADER:
457
+ return init_header_frame_parser(exec_ctx, transport_parsing, 0);
458
+ case GRPC_CHTTP2_FRAME_CONTINUATION:
459
+ gpr_log(GPR_ERROR, "Unexpected CONTINUATION frame");
460
+ return 0;
461
+ case GRPC_CHTTP2_FRAME_RST_STREAM:
462
+ return init_rst_stream_parser(exec_ctx, transport_parsing);
463
+ case GRPC_CHTTP2_FRAME_SETTINGS:
464
+ return init_settings_frame_parser(exec_ctx, transport_parsing);
465
+ case GRPC_CHTTP2_FRAME_WINDOW_UPDATE:
466
+ return init_window_update_frame_parser(exec_ctx, transport_parsing);
467
+ case GRPC_CHTTP2_FRAME_PING:
468
+ return init_ping_parser(exec_ctx, transport_parsing);
469
+ case GRPC_CHTTP2_FRAME_GOAWAY:
470
+ return init_goaway_parser(exec_ctx, transport_parsing);
471
+ default:
472
+ gpr_log(GPR_ERROR, "Unknown frame type %02x",
473
+ transport_parsing->incoming_frame_type);
474
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
475
+ }
476
+ }
477
+
478
+ static grpc_chttp2_parse_error skip_parser(
479
+ grpc_exec_ctx *exec_ctx, void *parser,
480
+ grpc_chttp2_transport_parsing *transport_parsing,
481
+ grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last) {
482
+ return GRPC_CHTTP2_PARSE_OK;
483
+ }
484
+
485
+ static void skip_header(void *tp, grpc_mdelem *md) { GRPC_MDELEM_UNREF(md); }
486
+
487
+ static int init_skip_frame_parser(
488
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
489
+ int is_header) {
490
+ if (is_header) {
491
+ gpr_uint8 is_eoh = transport_parsing->expect_continuation_stream_id != 0;
492
+ transport_parsing->parser = grpc_chttp2_header_parser_parse;
493
+ transport_parsing->parser_data = &transport_parsing->hpack_parser;
494
+ transport_parsing->hpack_parser.on_header = skip_header;
495
+ transport_parsing->hpack_parser.on_header_user_data = NULL;
496
+ transport_parsing->hpack_parser.is_boundary = is_eoh;
497
+ transport_parsing->hpack_parser.is_eof =
498
+ (gpr_uint8)(is_eoh ? transport_parsing->header_eof : 0);
499
+ } else {
500
+ transport_parsing->parser = skip_parser;
501
+ }
502
+ return 1;
503
+ }
504
+
505
+ void grpc_chttp2_parsing_become_skip_parser(
506
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
507
+ init_skip_frame_parser(
508
+ exec_ctx, transport_parsing,
509
+ transport_parsing->parser == grpc_chttp2_header_parser_parse);
510
+ }
511
+
512
+ static grpc_chttp2_parse_error update_incoming_window(
513
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
514
+ grpc_chttp2_stream_parsing *stream_parsing) {
515
+ gpr_uint32 incoming_frame_size = transport_parsing->incoming_frame_size;
516
+ if (incoming_frame_size > transport_parsing->incoming_window) {
517
+ gpr_log(GPR_ERROR, "frame of size %d overflows incoming window of %d",
518
+ transport_parsing->incoming_frame_size,
519
+ transport_parsing->incoming_window);
520
+ return GRPC_CHTTP2_CONNECTION_ERROR;
521
+ }
522
+
523
+ if (incoming_frame_size > stream_parsing->incoming_window) {
524
+ gpr_log(GPR_ERROR, "frame of size %d overflows incoming window of %d",
525
+ transport_parsing->incoming_frame_size,
526
+ stream_parsing->incoming_window);
527
+ return GRPC_CHTTP2_CONNECTION_ERROR;
528
+ }
529
+
530
+ GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("parse", transport_parsing, incoming_window,
531
+ incoming_frame_size);
532
+ GRPC_CHTTP2_FLOW_DEBIT_STREAM("parse", transport_parsing, stream_parsing,
533
+ incoming_window, incoming_frame_size);
534
+ stream_parsing->received_bytes += incoming_frame_size;
535
+
536
+ grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
537
+
538
+ return GRPC_CHTTP2_PARSE_OK;
539
+ }
540
+
541
+ static int init_data_frame_parser(
542
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
543
+ grpc_chttp2_stream_parsing *stream_parsing =
544
+ grpc_chttp2_parsing_lookup_stream(transport_parsing,
545
+ transport_parsing->incoming_stream_id);
546
+ grpc_chttp2_parse_error err = GRPC_CHTTP2_PARSE_OK;
547
+ if (!stream_parsing || stream_parsing->received_close)
548
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
549
+ if (err == GRPC_CHTTP2_PARSE_OK) {
550
+ err = update_incoming_window(exec_ctx, transport_parsing, stream_parsing);
551
+ }
552
+ if (err == GRPC_CHTTP2_PARSE_OK) {
553
+ err = grpc_chttp2_data_parser_begin_frame(
554
+ &stream_parsing->data_parser, transport_parsing->incoming_frame_flags);
555
+ }
556
+ switch (err) {
557
+ case GRPC_CHTTP2_PARSE_OK:
558
+ transport_parsing->incoming_stream = stream_parsing;
559
+ transport_parsing->parser = grpc_chttp2_data_parser_parse;
560
+ transport_parsing->parser_data = &stream_parsing->data_parser;
561
+ return 1;
562
+ case GRPC_CHTTP2_STREAM_ERROR:
563
+ stream_parsing->received_close = 1;
564
+ stream_parsing->saw_rst_stream = 1;
565
+ stream_parsing->rst_stream_reason = GRPC_CHTTP2_PROTOCOL_ERROR;
566
+ gpr_slice_buffer_add(
567
+ &transport_parsing->qbuf,
568
+ grpc_chttp2_rst_stream_create(transport_parsing->incoming_stream_id,
569
+ GRPC_CHTTP2_PROTOCOL_ERROR));
570
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
571
+ case GRPC_CHTTP2_CONNECTION_ERROR:
572
+ return 0;
573
+ }
574
+ GPR_UNREACHABLE_CODE(return 0);
575
+ }
576
+
577
+ static void free_timeout(void *p) { gpr_free(p); }
578
+
579
+ static void on_initial_header(void *tp, grpc_mdelem *md) {
580
+ grpc_chttp2_transport_parsing *transport_parsing = tp;
581
+ grpc_chttp2_stream_parsing *stream_parsing =
582
+ transport_parsing->incoming_stream;
583
+
584
+ GPR_TIMER_BEGIN("on_initial_header", 0);
585
+
586
+ GPR_ASSERT(stream_parsing);
587
+
588
+ GRPC_CHTTP2_IF_TRACING(gpr_log(
589
+ GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", stream_parsing->id,
590
+ transport_parsing->is_client ? "CLI" : "SVR",
591
+ grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value)));
592
+
593
+ if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
594
+ /* TODO(ctiller): check for a status like " 0" */
595
+ stream_parsing->seen_error = 1;
596
+ }
597
+
598
+ if (md->key == GRPC_MDSTR_GRPC_TIMEOUT) {
599
+ gpr_timespec *cached_timeout = grpc_mdelem_get_user_data(md, free_timeout);
600
+ if (!cached_timeout) {
601
+ /* not already parsed: parse it now, and store the result away */
602
+ cached_timeout = gpr_malloc(sizeof(gpr_timespec));
603
+ if (!grpc_chttp2_decode_timeout(grpc_mdstr_as_c_string(md->value),
604
+ cached_timeout)) {
605
+ gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'",
606
+ grpc_mdstr_as_c_string(md->value));
607
+ *cached_timeout = gpr_inf_future(GPR_TIMESPAN);
608
+ }
609
+ grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
610
+ }
611
+ grpc_chttp2_incoming_metadata_buffer_set_deadline(
612
+ &stream_parsing->metadata_buffer[0],
613
+ gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), *cached_timeout));
614
+ GRPC_MDELEM_UNREF(md);
615
+ } else {
616
+ grpc_chttp2_incoming_metadata_buffer_add(
617
+ &stream_parsing->metadata_buffer[0], md);
618
+ }
619
+
620
+ grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
621
+
622
+ GPR_TIMER_END("on_initial_header", 0);
623
+ }
624
+
625
+ static void on_trailing_header(void *tp, grpc_mdelem *md) {
626
+ grpc_chttp2_transport_parsing *transport_parsing = tp;
627
+ grpc_chttp2_stream_parsing *stream_parsing =
628
+ transport_parsing->incoming_stream;
629
+
630
+ GPR_TIMER_BEGIN("on_trailing_header", 0);
631
+
632
+ GPR_ASSERT(stream_parsing);
633
+
634
+ GRPC_CHTTP2_IF_TRACING(gpr_log(
635
+ GPR_INFO, "HTTP:%d:TRL:%s: %s: %s", stream_parsing->id,
636
+ transport_parsing->is_client ? "CLI" : "SVR",
637
+ grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value)));
638
+
639
+ if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
640
+ /* TODO(ctiller): check for a status like " 0" */
641
+ stream_parsing->seen_error = 1;
642
+ }
643
+
644
+ grpc_chttp2_incoming_metadata_buffer_add(&stream_parsing->metadata_buffer[1],
645
+ md);
646
+
647
+ grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
648
+
649
+ GPR_TIMER_END("on_trailing_header", 0);
650
+ }
651
+
652
+ static int init_header_frame_parser(
653
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
654
+ int is_continuation) {
655
+ gpr_uint8 is_eoh = (transport_parsing->incoming_frame_flags &
656
+ GRPC_CHTTP2_DATA_FLAG_END_HEADERS) != 0;
657
+ int via_accept = 0;
658
+ grpc_chttp2_stream_parsing *stream_parsing;
659
+
660
+ /* TODO(ctiller): when to increment header_frames_received? */
661
+
662
+ if (is_eoh) {
663
+ transport_parsing->expect_continuation_stream_id = 0;
664
+ } else {
665
+ transport_parsing->expect_continuation_stream_id =
666
+ transport_parsing->incoming_stream_id;
667
+ }
668
+
669
+ if (!is_continuation) {
670
+ transport_parsing->header_eof = (transport_parsing->incoming_frame_flags &
671
+ GRPC_CHTTP2_DATA_FLAG_END_STREAM) != 0;
672
+ }
673
+
674
+ /* could be a new grpc_chttp2_stream or an existing grpc_chttp2_stream */
675
+ stream_parsing = grpc_chttp2_parsing_lookup_stream(
676
+ transport_parsing, transport_parsing->incoming_stream_id);
677
+ if (stream_parsing == NULL) {
678
+ if (is_continuation) {
679
+ gpr_log(GPR_ERROR,
680
+ "grpc_chttp2_stream disbanded before CONTINUATION received");
681
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
682
+ }
683
+ if (transport_parsing->is_client) {
684
+ if ((transport_parsing->incoming_stream_id & 1) &&
685
+ transport_parsing->incoming_stream_id <
686
+ transport_parsing->next_stream_id) {
687
+ /* this is an old (probably cancelled) grpc_chttp2_stream */
688
+ } else {
689
+ gpr_log(GPR_ERROR,
690
+ "ignoring new grpc_chttp2_stream creation on client");
691
+ }
692
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
693
+ } else if (transport_parsing->last_incoming_stream_id >
694
+ transport_parsing->incoming_stream_id) {
695
+ gpr_log(GPR_ERROR,
696
+ "ignoring out of order new grpc_chttp2_stream request on server; "
697
+ "last grpc_chttp2_stream "
698
+ "id=%d, new grpc_chttp2_stream id=%d",
699
+ transport_parsing->last_incoming_stream_id,
700
+ transport_parsing->incoming_stream_id);
701
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
702
+ } else if ((transport_parsing->incoming_stream_id & 1) == 0) {
703
+ gpr_log(GPR_ERROR,
704
+ "ignoring grpc_chttp2_stream with non-client generated index %d",
705
+ transport_parsing->incoming_stream_id);
706
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
707
+ }
708
+ stream_parsing = transport_parsing->incoming_stream =
709
+ grpc_chttp2_parsing_accept_stream(
710
+ exec_ctx, transport_parsing, transport_parsing->incoming_stream_id);
711
+ if (stream_parsing == NULL) {
712
+ gpr_log(GPR_ERROR, "grpc_chttp2_stream not accepted");
713
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
714
+ }
715
+ via_accept = 1;
716
+ } else {
717
+ transport_parsing->incoming_stream = stream_parsing;
718
+ }
719
+ GPR_ASSERT(stream_parsing != NULL && (via_accept == 0 || via_accept == 1));
720
+ if (stream_parsing->received_close) {
721
+ gpr_log(GPR_ERROR, "skipping already closed grpc_chttp2_stream header");
722
+ transport_parsing->incoming_stream = NULL;
723
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
724
+ }
725
+ transport_parsing->parser = grpc_chttp2_header_parser_parse;
726
+ transport_parsing->parser_data = &transport_parsing->hpack_parser;
727
+ switch (stream_parsing->header_frames_received) {
728
+ case 0:
729
+ transport_parsing->hpack_parser.on_header = on_initial_header;
730
+ break;
731
+ case 1:
732
+ transport_parsing->hpack_parser.on_header = on_trailing_header;
733
+ break;
734
+ case 2:
735
+ gpr_log(GPR_ERROR, "too many header frames received");
736
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 1);
737
+ }
738
+ transport_parsing->hpack_parser.on_header_user_data = transport_parsing;
739
+ transport_parsing->hpack_parser.is_boundary = is_eoh;
740
+ transport_parsing->hpack_parser.is_eof =
741
+ (gpr_uint8)(is_eoh ? transport_parsing->header_eof : 0);
742
+ if (!is_continuation && (transport_parsing->incoming_frame_flags &
743
+ GRPC_CHTTP2_FLAG_HAS_PRIORITY)) {
744
+ grpc_chttp2_hpack_parser_set_has_priority(&transport_parsing->hpack_parser);
745
+ }
746
+ return 1;
747
+ }
748
+
749
+ static int init_window_update_frame_parser(
750
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
751
+ int ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_window_update_parser_begin_frame(
752
+ &transport_parsing->simple.window_update,
753
+ transport_parsing->incoming_frame_size,
754
+ transport_parsing->incoming_frame_flags);
755
+ if (transport_parsing->incoming_stream_id) {
756
+ transport_parsing->incoming_stream = grpc_chttp2_parsing_lookup_stream(
757
+ transport_parsing, transport_parsing->incoming_stream_id);
758
+ }
759
+ transport_parsing->parser = grpc_chttp2_window_update_parser_parse;
760
+ transport_parsing->parser_data = &transport_parsing->simple.window_update;
761
+ return ok;
762
+ }
763
+
764
+ static int init_ping_parser(grpc_exec_ctx *exec_ctx,
765
+ grpc_chttp2_transport_parsing *transport_parsing) {
766
+ int ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_ping_parser_begin_frame(
767
+ &transport_parsing->simple.ping,
768
+ transport_parsing->incoming_frame_size,
769
+ transport_parsing->incoming_frame_flags);
770
+ transport_parsing->parser = grpc_chttp2_ping_parser_parse;
771
+ transport_parsing->parser_data = &transport_parsing->simple.ping;
772
+ return ok;
773
+ }
774
+
775
+ static int init_rst_stream_parser(
776
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
777
+ int ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_rst_stream_parser_begin_frame(
778
+ &transport_parsing->simple.rst_stream,
779
+ transport_parsing->incoming_frame_size,
780
+ transport_parsing->incoming_frame_flags);
781
+ transport_parsing->incoming_stream = grpc_chttp2_parsing_lookup_stream(
782
+ transport_parsing, transport_parsing->incoming_stream_id);
783
+ if (!transport_parsing->incoming_stream) {
784
+ return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
785
+ }
786
+ transport_parsing->parser = grpc_chttp2_rst_stream_parser_parse;
787
+ transport_parsing->parser_data = &transport_parsing->simple.rst_stream;
788
+ return ok;
789
+ }
790
+
791
+ static int init_goaway_parser(
792
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
793
+ int ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_goaway_parser_begin_frame(
794
+ &transport_parsing->goaway_parser,
795
+ transport_parsing->incoming_frame_size,
796
+ transport_parsing->incoming_frame_flags);
797
+ transport_parsing->parser = grpc_chttp2_goaway_parser_parse;
798
+ transport_parsing->parser_data = &transport_parsing->goaway_parser;
799
+ return ok;
800
+ }
801
+
802
+ static int init_settings_frame_parser(
803
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing) {
804
+ int ok;
805
+
806
+ if (transport_parsing->incoming_stream_id != 0) {
807
+ gpr_log(GPR_ERROR, "settings frame received for grpc_chttp2_stream %d",
808
+ transport_parsing->incoming_stream_id);
809
+ return 0;
810
+ }
811
+
812
+ ok = GRPC_CHTTP2_PARSE_OK == grpc_chttp2_settings_parser_begin_frame(
813
+ &transport_parsing->simple.settings,
814
+ transport_parsing->incoming_frame_size,
815
+ transport_parsing->incoming_frame_flags,
816
+ transport_parsing->settings);
817
+ if (!ok) {
818
+ return 0;
819
+ }
820
+ if (transport_parsing->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
821
+ transport_parsing->settings_ack_received = 1;
822
+ grpc_chttp2_hptbl_set_max_bytes(
823
+ &transport_parsing->hpack_parser.table,
824
+ transport_parsing->last_sent_max_table_size);
825
+ }
826
+ transport_parsing->parser = grpc_chttp2_settings_parser_parse;
827
+ transport_parsing->parser_data = &transport_parsing->simple.settings;
828
+ return ok;
829
+ }
830
+
831
+ /*
832
+ static int is_window_update_legal(gpr_int64 window_update, gpr_int64 window) {
833
+ return window + window_update < MAX_WINDOW;
834
+ }
835
+ */
836
+
837
+ static int parse_frame_slice(grpc_exec_ctx *exec_ctx,
838
+ grpc_chttp2_transport_parsing *transport_parsing,
839
+ gpr_slice slice, int is_last) {
840
+ grpc_chttp2_stream_parsing *stream_parsing =
841
+ transport_parsing->incoming_stream;
842
+ switch (transport_parsing->parser(exec_ctx, transport_parsing->parser_data,
843
+ transport_parsing, stream_parsing, slice,
844
+ is_last)) {
845
+ case GRPC_CHTTP2_PARSE_OK:
846
+ if (stream_parsing) {
847
+ grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
848
+ stream_parsing);
849
+ }
850
+ return 1;
851
+ case GRPC_CHTTP2_STREAM_ERROR:
852
+ grpc_chttp2_parsing_become_skip_parser(exec_ctx, transport_parsing);
853
+ if (stream_parsing) {
854
+ stream_parsing->saw_rst_stream = 1;
855
+ stream_parsing->rst_stream_reason = GRPC_CHTTP2_PROTOCOL_ERROR;
856
+ gpr_slice_buffer_add(
857
+ &transport_parsing->qbuf,
858
+ grpc_chttp2_rst_stream_create(transport_parsing->incoming_stream_id,
859
+ GRPC_CHTTP2_PROTOCOL_ERROR));
860
+ }
861
+ return 1;
862
+ case GRPC_CHTTP2_CONNECTION_ERROR:
863
+ return 0;
864
+ }
865
+ GPR_UNREACHABLE_CODE(return 0);
866
+ }