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,114 @@
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_SECURITY_SECURITY_CONTEXT_H
35
+ #define GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H
36
+
37
+ #include "src/core/iomgr/pollset.h"
38
+ #include "src/core/security/credentials.h"
39
+
40
+ /* --- grpc_auth_context ---
41
+
42
+ High level authentication context object. Can optionally be chained. */
43
+
44
+ /* Property names are always NULL terminated. */
45
+
46
+ typedef struct {
47
+ grpc_auth_property *array;
48
+ size_t count;
49
+ size_t capacity;
50
+ } grpc_auth_property_array;
51
+
52
+ struct grpc_auth_context {
53
+ struct grpc_auth_context *chained;
54
+ grpc_auth_property_array properties;
55
+ gpr_refcount refcount;
56
+ const char *peer_identity_property_name;
57
+ grpc_pollset *pollset;
58
+ };
59
+
60
+ /* Creation. */
61
+ grpc_auth_context *grpc_auth_context_create(grpc_auth_context *chained);
62
+
63
+ /* Refcounting. */
64
+ #ifdef GRPC_AUTH_CONTEXT_REFCOUNT_DEBUG
65
+ #define GRPC_AUTH_CONTEXT_REF(p, r) \
66
+ grpc_auth_context_ref((p), __FILE__, __LINE__, (r))
67
+ #define GRPC_AUTH_CONTEXT_UNREF(p, r) \
68
+ grpc_auth_context_unref((p), __FILE__, __LINE__, (r))
69
+ grpc_auth_context *grpc_auth_context_ref(grpc_auth_context *policy,
70
+ const char *file, int line,
71
+ const char *reason);
72
+ void grpc_auth_context_unref(grpc_auth_context *policy, const char *file,
73
+ int line, const char *reason);
74
+ #else
75
+ #define GRPC_AUTH_CONTEXT_REF(p, r) grpc_auth_context_ref((p))
76
+ #define GRPC_AUTH_CONTEXT_UNREF(p, r) grpc_auth_context_unref((p))
77
+ grpc_auth_context *grpc_auth_context_ref(grpc_auth_context *policy);
78
+ void grpc_auth_context_unref(grpc_auth_context *policy);
79
+ #endif
80
+
81
+ void grpc_auth_property_reset(grpc_auth_property *property);
82
+
83
+ /* --- grpc_client_security_context ---
84
+
85
+ Internal client-side security context. */
86
+
87
+ typedef struct {
88
+ grpc_call_credentials *creds;
89
+ grpc_auth_context *auth_context;
90
+ } grpc_client_security_context;
91
+
92
+ grpc_client_security_context *grpc_client_security_context_create(void);
93
+ void grpc_client_security_context_destroy(void *ctx);
94
+
95
+ /* --- grpc_server_security_context ---
96
+
97
+ Internal server-side security context. */
98
+
99
+ typedef struct {
100
+ grpc_auth_context *auth_context;
101
+ } grpc_server_security_context;
102
+
103
+ grpc_server_security_context *grpc_server_security_context_create(void);
104
+ void grpc_server_security_context_destroy(void *ctx);
105
+
106
+ /* --- Channel args for auth context --- */
107
+ #define GRPC_AUTH_CONTEXT_ARG "grpc.auth_context"
108
+
109
+ grpc_arg grpc_auth_context_to_arg(grpc_auth_context *c);
110
+ grpc_auth_context *grpc_auth_context_from_arg(const grpc_arg *arg);
111
+ grpc_auth_context *grpc_find_auth_context_in_args(
112
+ const grpc_channel_args *args);
113
+
114
+ #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURITY_CONTEXT_H */
@@ -0,0 +1,264 @@
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 <string.h>
35
+
36
+ #include "src/core/security/auth_filters.h"
37
+ #include "src/core/security/credentials.h"
38
+ #include "src/core/security/security_context.h"
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+
43
+ typedef struct call_data {
44
+ grpc_metadata_batch *recv_initial_metadata;
45
+ /* Closure to call when finished with the auth_on_recv hook. */
46
+ grpc_closure *on_done_recv;
47
+ /* Receive closures are chained: we inject this closure as the on_done_recv
48
+ up-call on transport_op, and remember to call our on_done_recv member after
49
+ handling it. */
50
+ grpc_closure auth_on_recv;
51
+ grpc_transport_stream_op transport_op;
52
+ grpc_metadata_array md;
53
+ const grpc_metadata *consumed_md;
54
+ size_t num_consumed_md;
55
+ grpc_auth_context *auth_context;
56
+ } call_data;
57
+
58
+ typedef struct channel_data {
59
+ grpc_auth_context *auth_context;
60
+ grpc_server_credentials *creds;
61
+ } channel_data;
62
+
63
+ static grpc_metadata_array metadata_batch_to_md_array(
64
+ const grpc_metadata_batch *batch) {
65
+ grpc_linked_mdelem *l;
66
+ grpc_metadata_array result;
67
+ grpc_metadata_array_init(&result);
68
+ for (l = batch->list.head; l != NULL; l = l->next) {
69
+ grpc_metadata *usr_md = NULL;
70
+ grpc_mdelem *md = l->md;
71
+ grpc_mdstr *key = md->key;
72
+ grpc_mdstr *value = md->value;
73
+ if (result.count == result.capacity) {
74
+ result.capacity = GPR_MAX(result.capacity + 8, result.capacity * 2);
75
+ result.metadata =
76
+ gpr_realloc(result.metadata, result.capacity * sizeof(grpc_metadata));
77
+ }
78
+ usr_md = &result.metadata[result.count++];
79
+ usr_md->key = grpc_mdstr_as_c_string(key);
80
+ usr_md->value = grpc_mdstr_as_c_string(value);
81
+ usr_md->value_length = GPR_SLICE_LENGTH(value->slice);
82
+ }
83
+ return result;
84
+ }
85
+
86
+ static grpc_mdelem *remove_consumed_md(void *user_data, grpc_mdelem *md) {
87
+ grpc_call_element *elem = user_data;
88
+ call_data *calld = elem->call_data;
89
+ size_t i;
90
+ for (i = 0; i < calld->num_consumed_md; i++) {
91
+ const grpc_metadata *consumed_md = &calld->consumed_md[i];
92
+ /* Maybe we could do a pointer comparison but we do not have any guarantee
93
+ that the metadata processor used the same pointers for consumed_md in the
94
+ callback. */
95
+ if (GPR_SLICE_LENGTH(md->key->slice) != strlen(consumed_md->key) ||
96
+ GPR_SLICE_LENGTH(md->value->slice) != consumed_md->value_length) {
97
+ continue;
98
+ }
99
+ if (memcmp(GPR_SLICE_START_PTR(md->key->slice), consumed_md->key,
100
+ GPR_SLICE_LENGTH(md->key->slice)) == 0 &&
101
+ memcmp(GPR_SLICE_START_PTR(md->value->slice), consumed_md->value,
102
+ GPR_SLICE_LENGTH(md->value->slice)) == 0) {
103
+ return NULL; /* Delete. */
104
+ }
105
+ }
106
+ return md;
107
+ }
108
+
109
+ /* called from application code */
110
+ static void on_md_processing_done(
111
+ void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md,
112
+ const grpc_metadata *response_md, size_t num_response_md,
113
+ grpc_status_code status, const char *error_details) {
114
+ grpc_call_element *elem = user_data;
115
+ call_data *calld = elem->call_data;
116
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
117
+
118
+ /* TODO(jboeuf): Implement support for response_md. */
119
+ if (response_md != NULL && num_response_md > 0) {
120
+ gpr_log(GPR_INFO,
121
+ "response_md in auth metadata processing not supported for now. "
122
+ "Ignoring...");
123
+ }
124
+
125
+ if (status == GRPC_STATUS_OK) {
126
+ calld->consumed_md = consumed_md;
127
+ calld->num_consumed_md = num_consumed_md;
128
+ grpc_metadata_batch_filter(calld->recv_initial_metadata, remove_consumed_md,
129
+ elem);
130
+ grpc_metadata_array_destroy(&calld->md);
131
+ calld->on_done_recv->cb(&exec_ctx, calld->on_done_recv->cb_arg, 1);
132
+ } else {
133
+ gpr_slice message;
134
+ grpc_transport_stream_op close_op;
135
+ memset(&close_op, 0, sizeof(close_op));
136
+ grpc_metadata_array_destroy(&calld->md);
137
+ error_details = error_details != NULL
138
+ ? error_details
139
+ : "Authentication metadata processing failed.";
140
+ message = gpr_slice_from_copied_string(error_details);
141
+ calld->transport_op.send_initial_metadata = NULL;
142
+ if (calld->transport_op.send_message != NULL) {
143
+ grpc_byte_stream_destroy(calld->transport_op.send_message);
144
+ calld->transport_op.send_message = NULL;
145
+ }
146
+ calld->transport_op.send_trailing_metadata = NULL;
147
+ grpc_transport_stream_op_add_close(&close_op, status, &message);
148
+ grpc_call_next_op(&exec_ctx, elem, &close_op);
149
+ calld->on_done_recv->cb(&exec_ctx, calld->on_done_recv->cb_arg, 0);
150
+ }
151
+
152
+ grpc_exec_ctx_finish(&exec_ctx);
153
+ }
154
+
155
+ static void auth_on_recv(grpc_exec_ctx *exec_ctx, void *user_data,
156
+ int success) {
157
+ grpc_call_element *elem = user_data;
158
+ call_data *calld = elem->call_data;
159
+ channel_data *chand = elem->channel_data;
160
+ if (success) {
161
+ if (chand->creds->processor.process != NULL) {
162
+ calld->md = metadata_batch_to_md_array(calld->recv_initial_metadata);
163
+ chand->creds->processor.process(
164
+ chand->creds->processor.state, calld->auth_context,
165
+ calld->md.metadata, calld->md.count, on_md_processing_done, elem);
166
+ return;
167
+ }
168
+ }
169
+ calld->on_done_recv->cb(exec_ctx, calld->on_done_recv->cb_arg, success);
170
+ }
171
+
172
+ static void set_recv_ops_md_callbacks(grpc_call_element *elem,
173
+ grpc_transport_stream_op *op) {
174
+ call_data *calld = elem->call_data;
175
+
176
+ if (op->recv_initial_metadata != NULL) {
177
+ /* substitute our callback for the higher callback */
178
+ calld->recv_initial_metadata = op->recv_initial_metadata;
179
+ calld->on_done_recv = op->on_complete;
180
+ op->on_complete = &calld->auth_on_recv;
181
+ calld->transport_op = *op;
182
+ }
183
+ }
184
+
185
+ /* Called either:
186
+ - in response to an API call (or similar) from above, to send something
187
+ - a network event (or similar) from below, to receive something
188
+ op contains type and call direction information, in addition to the data
189
+ that is being sent or received. */
190
+ static void auth_start_transport_op(grpc_exec_ctx *exec_ctx,
191
+ grpc_call_element *elem,
192
+ grpc_transport_stream_op *op) {
193
+ set_recv_ops_md_callbacks(elem, op);
194
+ grpc_call_next_op(exec_ctx, elem, op);
195
+ }
196
+
197
+ /* Constructor for call_data */
198
+ static void init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
199
+ grpc_call_element_args *args) {
200
+ /* grab pointers to our data from the call element */
201
+ call_data *calld = elem->call_data;
202
+ channel_data *chand = elem->channel_data;
203
+ grpc_server_security_context *server_ctx = NULL;
204
+
205
+ /* initialize members */
206
+ memset(calld, 0, sizeof(*calld));
207
+ grpc_closure_init(&calld->auth_on_recv, auth_on_recv, elem);
208
+
209
+ if (args->context[GRPC_CONTEXT_SECURITY].value != NULL) {
210
+ args->context[GRPC_CONTEXT_SECURITY].destroy(
211
+ args->context[GRPC_CONTEXT_SECURITY].value);
212
+ }
213
+
214
+ server_ctx = grpc_server_security_context_create();
215
+ server_ctx->auth_context = grpc_auth_context_create(chand->auth_context);
216
+ calld->auth_context = server_ctx->auth_context;
217
+
218
+ args->context[GRPC_CONTEXT_SECURITY].value = server_ctx;
219
+ args->context[GRPC_CONTEXT_SECURITY].destroy =
220
+ grpc_server_security_context_destroy;
221
+ }
222
+
223
+ static void set_pollset(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
224
+ grpc_pollset *pollset) {}
225
+
226
+ /* Destructor for call_data */
227
+ static void destroy_call_elem(grpc_exec_ctx *exec_ctx,
228
+ grpc_call_element *elem) {}
229
+
230
+ /* Constructor for channel_data */
231
+ static void init_channel_elem(grpc_exec_ctx *exec_ctx,
232
+ grpc_channel_element *elem,
233
+ grpc_channel_element_args *args) {
234
+ grpc_auth_context *auth_context =
235
+ grpc_find_auth_context_in_args(args->channel_args);
236
+ grpc_server_credentials *creds =
237
+ grpc_find_server_credentials_in_args(args->channel_args);
238
+ /* grab pointers to our data from the channel element */
239
+ channel_data *chand = elem->channel_data;
240
+
241
+ GPR_ASSERT(!args->is_last);
242
+ GPR_ASSERT(auth_context != NULL);
243
+ GPR_ASSERT(creds != NULL);
244
+
245
+ /* initialize members */
246
+ chand->auth_context =
247
+ GRPC_AUTH_CONTEXT_REF(auth_context, "server_auth_filter");
248
+ chand->creds = grpc_server_credentials_ref(creds);
249
+ }
250
+
251
+ /* Destructor for channel data */
252
+ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
253
+ grpc_channel_element *elem) {
254
+ /* grab pointers to our data from the channel element */
255
+ channel_data *chand = elem->channel_data;
256
+ GRPC_AUTH_CONTEXT_UNREF(chand->auth_context, "server_auth_filter");
257
+ grpc_server_credentials_unref(chand->creds);
258
+ }
259
+
260
+ const grpc_channel_filter grpc_server_auth_filter = {
261
+ auth_start_transport_op, grpc_channel_next_op, sizeof(call_data),
262
+ init_call_elem, set_pollset, destroy_call_elem, sizeof(channel_data),
263
+ init_channel_elem, destroy_channel_elem, grpc_call_next_get_peer,
264
+ "server-auth"};
@@ -0,0 +1,268 @@
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 <grpc/grpc.h>
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/channel/channel_args.h"
39
+ #include "src/core/channel/http_server_filter.h"
40
+ #include "src/core/iomgr/endpoint.h"
41
+ #include "src/core/iomgr/resolve_address.h"
42
+ #include "src/core/iomgr/tcp_server.h"
43
+ #include "src/core/security/auth_filters.h"
44
+ #include "src/core/security/credentials.h"
45
+ #include "src/core/security/security_connector.h"
46
+ #include "src/core/security/security_context.h"
47
+ #include "src/core/surface/api_trace.h"
48
+ #include "src/core/surface/server.h"
49
+ #include "src/core/transport/chttp2_transport.h"
50
+ #include <grpc/support/alloc.h>
51
+ #include <grpc/support/log.h>
52
+ #include <grpc/support/sync.h>
53
+ #include <grpc/support/useful.h>
54
+
55
+ typedef struct grpc_server_secure_state {
56
+ grpc_server *server;
57
+ grpc_tcp_server *tcp;
58
+ grpc_security_connector *sc;
59
+ grpc_server_credentials *creds;
60
+ int is_shutdown;
61
+ gpr_mu mu;
62
+ gpr_refcount refcount;
63
+ grpc_closure destroy_closure;
64
+ grpc_closure *destroy_callback;
65
+ } grpc_server_secure_state;
66
+
67
+ static void state_ref(grpc_server_secure_state *state) {
68
+ gpr_ref(&state->refcount);
69
+ }
70
+
71
+ static void state_unref(grpc_server_secure_state *state) {
72
+ if (gpr_unref(&state->refcount)) {
73
+ /* ensure all threads have unlocked */
74
+ gpr_mu_lock(&state->mu);
75
+ gpr_mu_unlock(&state->mu);
76
+ /* clean up */
77
+ GRPC_SECURITY_CONNECTOR_UNREF(state->sc, "server");
78
+ grpc_server_credentials_unref(state->creds);
79
+ gpr_free(state);
80
+ }
81
+ }
82
+
83
+ static void setup_transport(grpc_exec_ctx *exec_ctx, void *statep,
84
+ grpc_transport *transport,
85
+ grpc_auth_context *auth_context) {
86
+ static grpc_channel_filter const *extra_filters[] = {
87
+ &grpc_server_auth_filter, &grpc_http_server_filter};
88
+ grpc_server_secure_state *state = statep;
89
+ grpc_channel_args *args_copy;
90
+ grpc_arg args_to_add[2];
91
+ args_to_add[0] = grpc_server_credentials_to_arg(state->creds);
92
+ args_to_add[1] = grpc_auth_context_to_arg(auth_context);
93
+ args_copy = grpc_channel_args_copy_and_add(
94
+ grpc_server_get_channel_args(state->server), args_to_add,
95
+ GPR_ARRAY_SIZE(args_to_add));
96
+ grpc_server_setup_transport(exec_ctx, state->server, transport, extra_filters,
97
+ GPR_ARRAY_SIZE(extra_filters), args_copy);
98
+ grpc_channel_args_destroy(args_copy);
99
+ }
100
+
101
+ static void on_secure_handshake_done(grpc_exec_ctx *exec_ctx, void *statep,
102
+ grpc_security_status status,
103
+ grpc_endpoint *secure_endpoint,
104
+ grpc_auth_context *auth_context) {
105
+ grpc_server_secure_state *state = statep;
106
+ grpc_transport *transport;
107
+ if (status == GRPC_SECURITY_OK) {
108
+ if (secure_endpoint) {
109
+ gpr_mu_lock(&state->mu);
110
+ if (!state->is_shutdown) {
111
+ transport = grpc_create_chttp2_transport(
112
+ exec_ctx, grpc_server_get_channel_args(state->server),
113
+ secure_endpoint, 0);
114
+ setup_transport(exec_ctx, state, transport, auth_context);
115
+ grpc_chttp2_transport_start_reading(exec_ctx, transport, NULL, 0);
116
+ } else {
117
+ /* We need to consume this here, because the server may already have
118
+ * gone away. */
119
+ grpc_endpoint_destroy(exec_ctx, secure_endpoint);
120
+ }
121
+ gpr_mu_unlock(&state->mu);
122
+ }
123
+ } else {
124
+ gpr_log(GPR_ERROR, "Secure transport failed with error %d", status);
125
+ }
126
+ state_unref(state);
127
+ }
128
+
129
+ static void on_accept(grpc_exec_ctx *exec_ctx, void *statep,
130
+ grpc_endpoint *tcp) {
131
+ grpc_server_secure_state *state = statep;
132
+ state_ref(state);
133
+ grpc_security_connector_do_handshake(exec_ctx, state->sc, tcp,
134
+ on_secure_handshake_done, state);
135
+ }
136
+
137
+ /* Server callback: start listening on our ports */
138
+ static void start(grpc_exec_ctx *exec_ctx, grpc_server *server, void *statep,
139
+ grpc_pollset **pollsets, size_t pollset_count) {
140
+ grpc_server_secure_state *state = statep;
141
+ grpc_tcp_server_start(exec_ctx, state->tcp, pollsets, pollset_count,
142
+ on_accept, state);
143
+ }
144
+
145
+ static void destroy_done(grpc_exec_ctx *exec_ctx, void *statep, int success) {
146
+ grpc_server_secure_state *state = statep;
147
+ state->destroy_callback->cb(exec_ctx, state->destroy_callback->cb_arg,
148
+ success);
149
+ grpc_security_connector_shutdown(exec_ctx, state->sc);
150
+ state_unref(state);
151
+ }
152
+
153
+ /* Server callback: destroy the tcp listener (so we don't generate further
154
+ callbacks) */
155
+ static void destroy(grpc_exec_ctx *exec_ctx, grpc_server *server, void *statep,
156
+ grpc_closure *callback) {
157
+ grpc_server_secure_state *state = statep;
158
+ grpc_tcp_server *tcp;
159
+ gpr_mu_lock(&state->mu);
160
+ state->is_shutdown = 1;
161
+ state->destroy_callback = callback;
162
+ tcp = state->tcp;
163
+ gpr_mu_unlock(&state->mu);
164
+ grpc_closure_init(&state->destroy_closure, destroy_done, state);
165
+ grpc_tcp_server_destroy(exec_ctx, tcp, &state->destroy_closure);
166
+ }
167
+
168
+ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr,
169
+ grpc_server_credentials *creds) {
170
+ grpc_resolved_addresses *resolved = NULL;
171
+ grpc_tcp_server *tcp = NULL;
172
+ grpc_server_secure_state *state = NULL;
173
+ size_t i;
174
+ unsigned count = 0;
175
+ int port_num = -1;
176
+ int port_temp;
177
+ grpc_security_status status = GRPC_SECURITY_ERROR;
178
+ grpc_security_connector *sc = NULL;
179
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
180
+
181
+ GRPC_API_TRACE(
182
+ "grpc_server_add_secure_http2_port("
183
+ "server=%p, addr=%s, creds=%p)",
184
+ 3, (server, addr, creds));
185
+
186
+ /* create security context */
187
+ if (creds == NULL) goto error;
188
+ status = grpc_server_credentials_create_security_connector(creds, &sc);
189
+ if (status != GRPC_SECURITY_OK) {
190
+ gpr_log(GPR_ERROR,
191
+ "Unable to create secure server with credentials of type %s.",
192
+ creds->type);
193
+ goto error;
194
+ }
195
+ sc->channel_args = grpc_server_get_channel_args(server);
196
+
197
+ /* resolve address */
198
+ resolved = grpc_blocking_resolve_address(addr, "https");
199
+ if (!resolved) {
200
+ goto error;
201
+ }
202
+
203
+ tcp = grpc_tcp_server_create();
204
+ if (!tcp) {
205
+ goto error;
206
+ }
207
+
208
+ for (i = 0; i < resolved->naddrs; i++) {
209
+ grpc_tcp_listener *listener;
210
+ listener = grpc_tcp_server_add_port(
211
+ tcp, (struct sockaddr *)&resolved->addrs[i].addr,
212
+ resolved->addrs[i].len);
213
+ port_temp = grpc_tcp_listener_get_port(listener);
214
+ if (port_temp > 0) {
215
+ if (port_num == -1) {
216
+ port_num = port_temp;
217
+ } else {
218
+ GPR_ASSERT(port_num == port_temp);
219
+ }
220
+ count++;
221
+ }
222
+ }
223
+ if (count == 0) {
224
+ gpr_log(GPR_ERROR, "No address added out of total %d resolved",
225
+ resolved->naddrs);
226
+ goto error;
227
+ }
228
+ if (count != resolved->naddrs) {
229
+ gpr_log(GPR_ERROR, "Only %d addresses added out of total %d resolved",
230
+ count, resolved->naddrs);
231
+ /* if it's an error, don't we want to goto error; here ? */
232
+ }
233
+ grpc_resolved_addresses_destroy(resolved);
234
+
235
+ state = gpr_malloc(sizeof(*state));
236
+ memset(state, 0, sizeof(*state));
237
+ state->server = server;
238
+ state->tcp = tcp;
239
+ state->sc = sc;
240
+ state->creds = grpc_server_credentials_ref(creds);
241
+
242
+ state->is_shutdown = 0;
243
+ gpr_mu_init(&state->mu);
244
+ gpr_ref_init(&state->refcount, 1);
245
+
246
+ /* Register with the server only upon success */
247
+ grpc_server_add_listener(&exec_ctx, server, state, start, destroy);
248
+
249
+ grpc_exec_ctx_finish(&exec_ctx);
250
+ return port_num;
251
+
252
+ /* Error path: cleanup and return */
253
+ error:
254
+ if (sc) {
255
+ GRPC_SECURITY_CONNECTOR_UNREF(sc, "server");
256
+ }
257
+ if (resolved) {
258
+ grpc_resolved_addresses_destroy(resolved);
259
+ }
260
+ if (tcp) {
261
+ grpc_tcp_server_destroy(&exec_ctx, tcp, NULL);
262
+ }
263
+ if (state) {
264
+ gpr_free(state);
265
+ }
266
+ grpc_exec_ctx_finish(&exec_ctx);
267
+ return 0;
268
+ }