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,58 @@
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
+ #ifndef GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_FRAME_WINDOW_UPDATE_H
35
+ #define GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_FRAME_WINDOW_UPDATE_H
36
+
37
+ #include "src/core/iomgr/exec_ctx.h"
38
+ #include <grpc/support/slice.h>
39
+ #include "src/core/transport/chttp2/frame.h"
40
+
41
+ typedef struct {
42
+ gpr_uint8 byte;
43
+ gpr_uint8 is_connection_update;
44
+ gpr_uint32 amount;
45
+ } grpc_chttp2_window_update_parser;
46
+
47
+ gpr_slice grpc_chttp2_window_update_create(gpr_uint32 id,
48
+ gpr_uint32 window_delta);
49
+
50
+ grpc_chttp2_parse_error grpc_chttp2_window_update_parser_begin_frame(
51
+ grpc_chttp2_window_update_parser *parser, gpr_uint32 length,
52
+ gpr_uint8 flags);
53
+ grpc_chttp2_parse_error grpc_chttp2_window_update_parser_parse(
54
+ grpc_exec_ctx *exec_ctx, void *parser,
55
+ grpc_chttp2_transport_parsing *transport_parsing,
56
+ grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last);
57
+
58
+ #endif /* GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_FRAME_WINDOW_UPDATE_H */
@@ -0,0 +1,572 @@
1
+ /*
2
+ *
3
+ * Copyright 2015-2016, 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/hpack_encoder.h"
35
+
36
+ #include <assert.h>
37
+ #include <string.h>
38
+
39
+ /* This is here for grpc_is_binary_header
40
+ * TODO(murgatroid99): Remove this
41
+ */
42
+ #include <grpc/grpc.h>
43
+
44
+ #include <grpc/support/alloc.h>
45
+ #include <grpc/support/log.h>
46
+ #include <grpc/support/useful.h>
47
+
48
+ #include "src/core/transport/chttp2/bin_encoder.h"
49
+ #include "src/core/transport/chttp2/hpack_table.h"
50
+ #include "src/core/transport/chttp2/timeout_encoding.h"
51
+ #include "src/core/transport/chttp2/varint.h"
52
+ #include "src/core/transport/static_metadata.h"
53
+
54
+ #define HASH_FRAGMENT_1(x) ((x)&255)
55
+ #define HASH_FRAGMENT_2(x) ((x >> 8) & 255)
56
+ #define HASH_FRAGMENT_3(x) ((x >> 16) & 255)
57
+ #define HASH_FRAGMENT_4(x) ((x >> 24) & 255)
58
+
59
+ /* if the probability of this item being seen again is < 1/x then don't add
60
+ it to the table */
61
+ #define ONE_ON_ADD_PROBABILITY 128
62
+ /* don't consider adding anything bigger than this to the hpack table */
63
+ #define MAX_DECODER_SPACE_USAGE 512
64
+
65
+ typedef struct {
66
+ int is_first_frame;
67
+ /* number of bytes in 'output' when we started the frame - used to calculate
68
+ frame length */
69
+ size_t output_length_at_start_of_frame;
70
+ /* index (in output) of the header for the current frame */
71
+ size_t header_idx;
72
+ /* have we seen a regular (non-colon-prefixed) header yet? */
73
+ gpr_uint8 seen_regular_header;
74
+ /* output stream id */
75
+ gpr_uint32 stream_id;
76
+ gpr_slice_buffer *output;
77
+ } framer_state;
78
+
79
+ /* fills p (which is expected to be 9 bytes long) with a data frame header */
80
+ static void fill_header(gpr_uint8 *p, gpr_uint8 type, gpr_uint32 id, size_t len,
81
+ gpr_uint8 flags) {
82
+ GPR_ASSERT(len < 16777316);
83
+ *p++ = (gpr_uint8)(len >> 16);
84
+ *p++ = (gpr_uint8)(len >> 8);
85
+ *p++ = (gpr_uint8)(len);
86
+ *p++ = type;
87
+ *p++ = flags;
88
+ *p++ = (gpr_uint8)(id >> 24);
89
+ *p++ = (gpr_uint8)(id >> 16);
90
+ *p++ = (gpr_uint8)(id >> 8);
91
+ *p++ = (gpr_uint8)(id);
92
+ }
93
+
94
+ /* finish a frame - fill in the previously reserved header */
95
+ static void finish_frame(framer_state *st, int is_header_boundary,
96
+ int is_last_in_stream) {
97
+ gpr_uint8 type = 0xff;
98
+ type = st->is_first_frame ? GRPC_CHTTP2_FRAME_HEADER
99
+ : GRPC_CHTTP2_FRAME_CONTINUATION;
100
+ fill_header(
101
+ GPR_SLICE_START_PTR(st->output->slices[st->header_idx]), type,
102
+ st->stream_id, st->output->length - st->output_length_at_start_of_frame,
103
+ (gpr_uint8)(
104
+ (is_last_in_stream ? GRPC_CHTTP2_DATA_FLAG_END_STREAM : 0) |
105
+ (is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0)));
106
+ st->is_first_frame = 0;
107
+ }
108
+
109
+ /* begin a new frame: reserve off header space, remember how many bytes we'd
110
+ output before beginning */
111
+ static void begin_frame(framer_state *st) {
112
+ st->header_idx =
113
+ gpr_slice_buffer_add_indexed(st->output, gpr_slice_malloc(9));
114
+ st->output_length_at_start_of_frame = st->output->length;
115
+ }
116
+
117
+ /* make sure that the current frame is of the type desired, and has sufficient
118
+ space to add at least about_to_add bytes -- finishes the current frame if
119
+ needed */
120
+ static void ensure_space(framer_state *st, size_t need_bytes) {
121
+ if (st->output->length - st->output_length_at_start_of_frame + need_bytes <=
122
+ GRPC_CHTTP2_MAX_PAYLOAD_LENGTH) {
123
+ return;
124
+ }
125
+ finish_frame(st, 0, 0);
126
+ begin_frame(st);
127
+ }
128
+
129
+ /* increment a filter count, halve all counts if one element reaches max */
130
+ static void inc_filter(gpr_uint8 idx, gpr_uint32 *sum, gpr_uint8 *elems) {
131
+ elems[idx]++;
132
+ if (elems[idx] < 255) {
133
+ (*sum)++;
134
+ } else {
135
+ int i;
136
+ *sum = 0;
137
+ for (i = 0; i < GRPC_CHTTP2_HPACKC_NUM_FILTERS; i++) {
138
+ elems[i] /= 2;
139
+ (*sum) += elems[i];
140
+ }
141
+ }
142
+ }
143
+
144
+ static void add_header_data(framer_state *st, gpr_slice slice) {
145
+ size_t len = GPR_SLICE_LENGTH(slice);
146
+ size_t remaining;
147
+ if (len == 0) return;
148
+ remaining = GRPC_CHTTP2_MAX_PAYLOAD_LENGTH +
149
+ st->output_length_at_start_of_frame - st->output->length;
150
+ if (len <= remaining) {
151
+ gpr_slice_buffer_add(st->output, slice);
152
+ } else {
153
+ gpr_slice_buffer_add(st->output, gpr_slice_split_head(&slice, remaining));
154
+ finish_frame(st, 0, 0);
155
+ begin_frame(st);
156
+ add_header_data(st, slice);
157
+ }
158
+ }
159
+
160
+ static gpr_uint8 *add_tiny_header_data(framer_state *st, size_t len) {
161
+ ensure_space(st, len);
162
+ return gpr_slice_buffer_tiny_add(st->output, len);
163
+ }
164
+
165
+ static void evict_entry(grpc_chttp2_hpack_compressor *c) {
166
+ c->tail_remote_index++;
167
+ GPR_ASSERT(c->tail_remote_index > 0);
168
+ GPR_ASSERT(c->table_size >=
169
+ c->table_elem_size[c->tail_remote_index % c->cap_table_elems]);
170
+ GPR_ASSERT(c->table_elems > 0);
171
+ c->table_size = (gpr_uint16)(
172
+ c->table_size -
173
+ c->table_elem_size[c->tail_remote_index % c->cap_table_elems]);
174
+ c->table_elems--;
175
+ }
176
+
177
+ /* add an element to the decoder table */
178
+ static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) {
179
+ gpr_uint32 key_hash = elem->key->hash;
180
+ gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash);
181
+ gpr_uint32 new_index = c->tail_remote_index + c->table_elems + 1;
182
+ size_t elem_size = 32 + GPR_SLICE_LENGTH(elem->key->slice) +
183
+ GPR_SLICE_LENGTH(elem->value->slice);
184
+
185
+ GPR_ASSERT(elem_size < 65536);
186
+
187
+ if (elem_size > c->max_table_size) {
188
+ while (c->table_size > 0) {
189
+ evict_entry(c);
190
+ }
191
+ return;
192
+ }
193
+
194
+ /* Reserve space for this element in the remote table: if this overflows
195
+ the current table, drop elements until it fits, matching the decompressor
196
+ algorithm */
197
+ while (c->table_size + elem_size > c->max_table_size) {
198
+ evict_entry(c);
199
+ }
200
+ GPR_ASSERT(c->table_elems < c->max_table_size);
201
+ c->table_elem_size[new_index % c->cap_table_elems] = (gpr_uint16)elem_size;
202
+ c->table_size = (gpr_uint16)(c->table_size + elem_size);
203
+ c->table_elems++;
204
+
205
+ /* Store this element into {entries,indices}_elem */
206
+ if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == elem) {
207
+ /* already there: update with new index */
208
+ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index;
209
+ } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem) {
210
+ /* already there (cuckoo): update with new index */
211
+ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
212
+ } else if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == NULL) {
213
+ /* not there, but a free element: add */
214
+ c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = GRPC_MDELEM_REF(elem);
215
+ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index;
216
+ } else if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == NULL) {
217
+ /* not there (cuckoo), but a free element: add */
218
+ c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = GRPC_MDELEM_REF(elem);
219
+ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
220
+ } else if (c->indices_elems[HASH_FRAGMENT_2(elem_hash)] <
221
+ c->indices_elems[HASH_FRAGMENT_3(elem_hash)]) {
222
+ /* not there: replace oldest */
223
+ GRPC_MDELEM_UNREF(c->entries_elems[HASH_FRAGMENT_2(elem_hash)]);
224
+ c->entries_elems[HASH_FRAGMENT_2(elem_hash)] = GRPC_MDELEM_REF(elem);
225
+ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index;
226
+ } else {
227
+ /* not there: replace oldest */
228
+ GRPC_MDELEM_UNREF(c->entries_elems[HASH_FRAGMENT_3(elem_hash)]);
229
+ c->entries_elems[HASH_FRAGMENT_3(elem_hash)] = GRPC_MDELEM_REF(elem);
230
+ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
231
+ }
232
+
233
+ /* do exactly the same for the key (so we can find by that again too) */
234
+
235
+ if (c->entries_keys[HASH_FRAGMENT_2(key_hash)] == elem->key) {
236
+ c->indices_keys[HASH_FRAGMENT_2(key_hash)] = new_index;
237
+ } else if (c->entries_keys[HASH_FRAGMENT_3(key_hash)] == elem->key) {
238
+ c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index;
239
+ } else if (c->entries_keys[HASH_FRAGMENT_2(key_hash)] == NULL) {
240
+ c->entries_keys[HASH_FRAGMENT_2(key_hash)] = GRPC_MDSTR_REF(elem->key);
241
+ c->indices_keys[HASH_FRAGMENT_2(key_hash)] = new_index;
242
+ } else if (c->entries_keys[HASH_FRAGMENT_3(key_hash)] == NULL) {
243
+ c->entries_keys[HASH_FRAGMENT_3(key_hash)] = GRPC_MDSTR_REF(elem->key);
244
+ c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index;
245
+ } else if (c->indices_keys[HASH_FRAGMENT_2(key_hash)] <
246
+ c->indices_keys[HASH_FRAGMENT_3(key_hash)]) {
247
+ GRPC_MDSTR_UNREF(c->entries_keys[HASH_FRAGMENT_2(key_hash)]);
248
+ c->entries_keys[HASH_FRAGMENT_2(key_hash)] = GRPC_MDSTR_REF(elem->key);
249
+ c->indices_keys[HASH_FRAGMENT_2(key_hash)] = new_index;
250
+ } else {
251
+ GRPC_MDSTR_UNREF(c->entries_keys[HASH_FRAGMENT_3(key_hash)]);
252
+ c->entries_keys[HASH_FRAGMENT_3(key_hash)] = GRPC_MDSTR_REF(elem->key);
253
+ c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index;
254
+ }
255
+ }
256
+
257
+ static void emit_indexed(grpc_chttp2_hpack_compressor *c, gpr_uint32 elem_index,
258
+ framer_state *st) {
259
+ gpr_uint32 len = GRPC_CHTTP2_VARINT_LENGTH(elem_index, 1);
260
+ GRPC_CHTTP2_WRITE_VARINT(elem_index, 1, 0x80, add_tiny_header_data(st, len),
261
+ len);
262
+ }
263
+
264
+ static gpr_slice get_wire_value(grpc_mdelem *elem, gpr_uint8 *huffman_prefix) {
265
+ if (grpc_is_binary_header((const char *)GPR_SLICE_START_PTR(elem->key->slice),
266
+ GPR_SLICE_LENGTH(elem->key->slice))) {
267
+ *huffman_prefix = 0x80;
268
+ return grpc_mdstr_as_base64_encoded_and_huffman_compressed(elem->value);
269
+ }
270
+ /* TODO(ctiller): opportunistically compress non-binary headers */
271
+ *huffman_prefix = 0x00;
272
+ return elem->value->slice;
273
+ }
274
+
275
+ static void emit_lithdr_incidx(grpc_chttp2_hpack_compressor *c,
276
+ gpr_uint32 key_index, grpc_mdelem *elem,
277
+ framer_state *st) {
278
+ gpr_uint32 len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 2);
279
+ gpr_uint8 huffman_prefix;
280
+ gpr_slice value_slice = get_wire_value(elem, &huffman_prefix);
281
+ size_t len_val = GPR_SLICE_LENGTH(value_slice);
282
+ gpr_uint32 len_val_len;
283
+ GPR_ASSERT(len_val <= GPR_UINT32_MAX);
284
+ len_val_len = GRPC_CHTTP2_VARINT_LENGTH((gpr_uint32)len_val, 1);
285
+ GRPC_CHTTP2_WRITE_VARINT(key_index, 2, 0x40,
286
+ add_tiny_header_data(st, len_pfx), len_pfx);
287
+ GRPC_CHTTP2_WRITE_VARINT((gpr_uint32)len_val, 1, 0x00,
288
+ add_tiny_header_data(st, len_val_len), len_val_len);
289
+ add_header_data(st, gpr_slice_ref(value_slice));
290
+ }
291
+
292
+ static void emit_lithdr_noidx(grpc_chttp2_hpack_compressor *c,
293
+ gpr_uint32 key_index, grpc_mdelem *elem,
294
+ framer_state *st) {
295
+ gpr_uint32 len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 4);
296
+ gpr_uint8 huffman_prefix;
297
+ gpr_slice value_slice = get_wire_value(elem, &huffman_prefix);
298
+ size_t len_val = GPR_SLICE_LENGTH(value_slice);
299
+ gpr_uint32 len_val_len;
300
+ GPR_ASSERT(len_val <= GPR_UINT32_MAX);
301
+ len_val_len = GRPC_CHTTP2_VARINT_LENGTH((gpr_uint32)len_val, 1);
302
+ GRPC_CHTTP2_WRITE_VARINT(key_index, 4, 0x00,
303
+ add_tiny_header_data(st, len_pfx), len_pfx);
304
+ GRPC_CHTTP2_WRITE_VARINT((gpr_uint32)len_val, 1, 0x00,
305
+ add_tiny_header_data(st, len_val_len), len_val_len);
306
+ add_header_data(st, gpr_slice_ref(value_slice));
307
+ }
308
+
309
+ static void emit_lithdr_incidx_v(grpc_chttp2_hpack_compressor *c,
310
+ grpc_mdelem *elem, framer_state *st) {
311
+ gpr_uint32 len_key = (gpr_uint32)GPR_SLICE_LENGTH(elem->key->slice);
312
+ gpr_uint8 huffman_prefix;
313
+ gpr_slice value_slice = get_wire_value(elem, &huffman_prefix);
314
+ gpr_uint32 len_val = (gpr_uint32)GPR_SLICE_LENGTH(value_slice);
315
+ gpr_uint32 len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
316
+ gpr_uint32 len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
317
+ GPR_ASSERT(len_key <= GPR_UINT32_MAX);
318
+ GPR_ASSERT(GPR_SLICE_LENGTH(value_slice) <= GPR_UINT32_MAX);
319
+ *add_tiny_header_data(st, 1) = 0x40;
320
+ GRPC_CHTTP2_WRITE_VARINT(len_key, 1, 0x00,
321
+ add_tiny_header_data(st, len_key_len), len_key_len);
322
+ add_header_data(st, gpr_slice_ref(elem->key->slice));
323
+ GRPC_CHTTP2_WRITE_VARINT(len_val, 1, huffman_prefix,
324
+ add_tiny_header_data(st, len_val_len), len_val_len);
325
+ add_header_data(st, gpr_slice_ref(value_slice));
326
+ }
327
+
328
+ static void emit_lithdr_noidx_v(grpc_chttp2_hpack_compressor *c,
329
+ grpc_mdelem *elem, framer_state *st) {
330
+ gpr_uint32 len_key = (gpr_uint32)GPR_SLICE_LENGTH(elem->key->slice);
331
+ gpr_uint8 huffman_prefix;
332
+ gpr_slice value_slice = get_wire_value(elem, &huffman_prefix);
333
+ gpr_uint32 len_val = (gpr_uint32)GPR_SLICE_LENGTH(value_slice);
334
+ gpr_uint32 len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
335
+ gpr_uint32 len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
336
+ GPR_ASSERT(len_key <= GPR_UINT32_MAX);
337
+ GPR_ASSERT(GPR_SLICE_LENGTH(value_slice) <= GPR_UINT32_MAX);
338
+ *add_tiny_header_data(st, 1) = 0x00;
339
+ GRPC_CHTTP2_WRITE_VARINT(len_key, 1, 0x00,
340
+ add_tiny_header_data(st, len_key_len), len_key_len);
341
+ add_header_data(st, gpr_slice_ref(elem->key->slice));
342
+ GRPC_CHTTP2_WRITE_VARINT(len_val, 1, huffman_prefix,
343
+ add_tiny_header_data(st, len_val_len), len_val_len);
344
+ add_header_data(st, gpr_slice_ref(value_slice));
345
+ }
346
+
347
+ static void emit_advertise_table_size_change(grpc_chttp2_hpack_compressor *c,
348
+ framer_state *st) {
349
+ gpr_uint32 len = GRPC_CHTTP2_VARINT_LENGTH(c->max_table_size, 3);
350
+ GRPC_CHTTP2_WRITE_VARINT(c->max_table_size, 3, 0x20,
351
+ add_tiny_header_data(st, len), len);
352
+ c->advertise_table_size_change = 0;
353
+ }
354
+
355
+ static gpr_uint32 dynidx(grpc_chttp2_hpack_compressor *c,
356
+ gpr_uint32 elem_index) {
357
+ return 1 + GRPC_CHTTP2_LAST_STATIC_ENTRY + c->tail_remote_index +
358
+ c->table_elems - elem_index;
359
+ }
360
+
361
+ /* encode an mdelem */
362
+ static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem,
363
+ framer_state *st) {
364
+ gpr_uint32 key_hash = elem->key->hash;
365
+ gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash);
366
+ size_t decoder_space_usage;
367
+ gpr_uint32 indices_key;
368
+ int should_add_elem;
369
+
370
+ GPR_ASSERT(GPR_SLICE_LENGTH(elem->key->slice) > 0);
371
+ if (GPR_SLICE_START_PTR(elem->key->slice)[0] != ':') { /* regular header */
372
+ st->seen_regular_header = 1;
373
+ } else {
374
+ GPR_ASSERT(
375
+ st->seen_regular_header == 0 &&
376
+ "Reserved header (colon-prefixed) happening after regular ones.");
377
+ }
378
+
379
+ inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum, c->filter_elems);
380
+
381
+ /* is this elem currently in the decoders table? */
382
+
383
+ if (c->entries_elems[HASH_FRAGMENT_2(elem_hash)] == elem &&
384
+ c->indices_elems[HASH_FRAGMENT_2(elem_hash)] > c->tail_remote_index) {
385
+ /* HIT: complete element (first cuckoo hash) */
386
+ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_2(elem_hash)]),
387
+ st);
388
+ return;
389
+ }
390
+
391
+ if (c->entries_elems[HASH_FRAGMENT_3(elem_hash)] == elem &&
392
+ c->indices_elems[HASH_FRAGMENT_3(elem_hash)] > c->tail_remote_index) {
393
+ /* HIT: complete element (second cuckoo hash) */
394
+ emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_3(elem_hash)]),
395
+ st);
396
+ return;
397
+ }
398
+
399
+ /* should this elem be in the table? */
400
+ decoder_space_usage = 32 + GPR_SLICE_LENGTH(elem->key->slice) +
401
+ GPR_SLICE_LENGTH(elem->value->slice);
402
+ should_add_elem = decoder_space_usage < MAX_DECODER_SPACE_USAGE &&
403
+ c->filter_elems[HASH_FRAGMENT_1(elem_hash)] >=
404
+ c->filter_elems_sum / ONE_ON_ADD_PROBABILITY;
405
+
406
+ /* no hits for the elem... maybe there's a key? */
407
+
408
+ indices_key = c->indices_keys[HASH_FRAGMENT_2(key_hash)];
409
+ if (c->entries_keys[HASH_FRAGMENT_2(key_hash)] == elem->key &&
410
+ indices_key > c->tail_remote_index) {
411
+ /* HIT: key (first cuckoo hash) */
412
+ if (should_add_elem) {
413
+ emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st);
414
+ add_elem(c, elem);
415
+ return;
416
+ } else {
417
+ emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
418
+ return;
419
+ }
420
+ GPR_UNREACHABLE_CODE(return );
421
+ }
422
+
423
+ indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)];
424
+ if (c->entries_keys[HASH_FRAGMENT_3(key_hash)] == elem->key &&
425
+ indices_key > c->tail_remote_index) {
426
+ /* HIT: key (first cuckoo hash) */
427
+ if (should_add_elem) {
428
+ emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st);
429
+ add_elem(c, elem);
430
+ return;
431
+ } else {
432
+ emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
433
+ return;
434
+ }
435
+ GPR_UNREACHABLE_CODE(return );
436
+ }
437
+
438
+ /* no elem, key in the table... fall back to literal emission */
439
+
440
+ if (should_add_elem) {
441
+ emit_lithdr_incidx_v(c, elem, st);
442
+ add_elem(c, elem);
443
+ return;
444
+ } else {
445
+ emit_lithdr_noidx_v(c, elem, st);
446
+ return;
447
+ }
448
+ GPR_UNREACHABLE_CODE(return );
449
+ }
450
+
451
+ #define STRLEN_LIT(x) (sizeof(x) - 1)
452
+ #define TIMEOUT_KEY "grpc-timeout"
453
+
454
+ static void deadline_enc(grpc_chttp2_hpack_compressor *c, gpr_timespec deadline,
455
+ framer_state *st) {
456
+ char timeout_str[GRPC_CHTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE];
457
+ grpc_mdelem *mdelem;
458
+ grpc_chttp2_encode_timeout(
459
+ gpr_time_sub(deadline, gpr_now(deadline.clock_type)), timeout_str);
460
+ mdelem = grpc_mdelem_from_metadata_strings(
461
+ GRPC_MDSTR_GRPC_TIMEOUT, grpc_mdstr_from_string(timeout_str));
462
+ hpack_enc(c, mdelem, st);
463
+ GRPC_MDELEM_UNREF(mdelem);
464
+ }
465
+
466
+ static gpr_uint32 elems_for_bytes(gpr_uint32 bytes) {
467
+ return (bytes + 31) / 32;
468
+ }
469
+
470
+ void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor *c) {
471
+ memset(c, 0, sizeof(*c));
472
+ c->max_table_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
473
+ c->cap_table_elems = elems_for_bytes(c->max_table_size);
474
+ c->max_table_elems = c->cap_table_elems;
475
+ c->max_usable_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
476
+ c->table_elem_size =
477
+ gpr_malloc(sizeof(*c->table_elem_size) * c->cap_table_elems);
478
+ memset(c->table_elem_size, 0,
479
+ sizeof(*c->table_elem_size) * c->cap_table_elems);
480
+ }
481
+
482
+ void grpc_chttp2_hpack_compressor_destroy(grpc_chttp2_hpack_compressor *c) {
483
+ int i;
484
+ for (i = 0; i < GRPC_CHTTP2_HPACKC_NUM_VALUES; i++) {
485
+ if (c->entries_keys[i]) GRPC_MDSTR_UNREF(c->entries_keys[i]);
486
+ if (c->entries_elems[i]) GRPC_MDELEM_UNREF(c->entries_elems[i]);
487
+ }
488
+ gpr_free(c->table_elem_size);
489
+ }
490
+
491
+ void grpc_chttp2_hpack_compressor_set_max_usable_size(
492
+ grpc_chttp2_hpack_compressor *c, gpr_uint32 max_table_size) {
493
+ c->max_usable_size = max_table_size;
494
+ grpc_chttp2_hpack_compressor_set_max_table_size(
495
+ c, GPR_MIN(c->max_table_size, max_table_size));
496
+ }
497
+
498
+ static void rebuild_elems(grpc_chttp2_hpack_compressor *c, gpr_uint32 new_cap) {
499
+ gpr_uint16 *table_elem_size = gpr_malloc(sizeof(*table_elem_size) * new_cap);
500
+ gpr_uint32 i;
501
+
502
+ memset(table_elem_size, 0, sizeof(*table_elem_size) * new_cap);
503
+ GPR_ASSERT(c->table_elems <= new_cap);
504
+
505
+ for (i = 0; i < c->table_elems; i++) {
506
+ gpr_uint32 ofs = c->tail_remote_index + i + 1;
507
+ table_elem_size[ofs % new_cap] =
508
+ c->table_elem_size[ofs % c->cap_table_elems];
509
+ }
510
+
511
+ c->cap_table_elems = new_cap;
512
+ gpr_free(c->table_elem_size);
513
+ c->table_elem_size = table_elem_size;
514
+ }
515
+
516
+ void grpc_chttp2_hpack_compressor_set_max_table_size(
517
+ grpc_chttp2_hpack_compressor *c, gpr_uint32 max_table_size) {
518
+ max_table_size = GPR_MIN(max_table_size, c->max_usable_size);
519
+ if (max_table_size == c->max_table_size) {
520
+ return;
521
+ }
522
+ while (c->table_size > 0 && c->table_size > max_table_size) {
523
+ evict_entry(c);
524
+ }
525
+ c->max_table_size = max_table_size;
526
+ c->max_table_elems = elems_for_bytes(max_table_size);
527
+ if (c->max_table_elems > c->cap_table_elems) {
528
+ rebuild_elems(c, GPR_MAX(c->max_table_elems, 2 * c->cap_table_elems));
529
+ } else if (c->max_table_elems < c->cap_table_elems / 3) {
530
+ gpr_uint32 new_cap = GPR_MAX(c->max_table_elems, 16);
531
+ if (new_cap != c->cap_table_elems) {
532
+ rebuild_elems(c, new_cap);
533
+ }
534
+ }
535
+ c->advertise_table_size_change = 1;
536
+ gpr_log(GPR_DEBUG, "set max table size from encoder to %d", max_table_size);
537
+ }
538
+
539
+ void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor *c,
540
+ gpr_uint32 stream_id,
541
+ grpc_metadata_batch *metadata, int is_eof,
542
+ gpr_slice_buffer *outbuf) {
543
+ framer_state st;
544
+ grpc_linked_mdelem *l;
545
+ gpr_timespec deadline;
546
+
547
+ GPR_ASSERT(stream_id != 0);
548
+
549
+ st.seen_regular_header = 0;
550
+ st.stream_id = stream_id;
551
+ st.output = outbuf;
552
+ st.is_first_frame = 1;
553
+
554
+ /* Encode a metadata batch; store the returned values, representing
555
+ a metadata element that needs to be unreffed back into the metadata
556
+ slot. THIS MAY NOT BE THE SAME ELEMENT (if a decoder table slot got
557
+ updated). After this loop, we'll do a batch unref of elements. */
558
+ begin_frame(&st);
559
+ if (c->advertise_table_size_change != 0) {
560
+ emit_advertise_table_size_change(c, &st);
561
+ }
562
+ grpc_metadata_batch_assert_ok(metadata);
563
+ for (l = metadata->list.head; l; l = l->next) {
564
+ hpack_enc(c, l->md, &st);
565
+ }
566
+ deadline = metadata->deadline;
567
+ if (gpr_time_cmp(deadline, gpr_inf_future(deadline.clock_type)) != 0) {
568
+ deadline_enc(c, deadline, &st);
569
+ }
570
+
571
+ finish_frame(&st, 1, is_eof);
572
+ }