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,162 @@
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_HTTPCLI_HTTPCLI_H
35
+ #define GRPC_INTERNAL_CORE_HTTPCLI_HTTPCLI_H
36
+
37
+ #include <stddef.h>
38
+
39
+ #include <grpc/support/time.h>
40
+
41
+ #include "src/core/iomgr/endpoint.h"
42
+ #include "src/core/iomgr/pollset_set.h"
43
+
44
+ /* User agent this library reports */
45
+ #define GRPC_HTTPCLI_USER_AGENT "grpc-httpcli/0.0"
46
+ /* Maximum length of a header string of the form 'Key: Value\r\n' */
47
+ #define GRPC_HTTPCLI_MAX_HEADER_LENGTH 4096
48
+
49
+ /* A single header to be passed in a request */
50
+ typedef struct grpc_httpcli_header {
51
+ char *key;
52
+ char *value;
53
+ } grpc_httpcli_header;
54
+
55
+ /* Tracks in-progress http requests
56
+ TODO(ctiller): allow caching and capturing multiple requests for the
57
+ same content and combining them */
58
+ typedef struct grpc_httpcli_context {
59
+ grpc_pollset_set pollset_set;
60
+ } grpc_httpcli_context;
61
+
62
+ typedef struct {
63
+ const char *default_port;
64
+ void (*handshake)(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *endpoint,
65
+ const char *host,
66
+ void (*on_done)(grpc_exec_ctx *exec_ctx, void *arg,
67
+ grpc_endpoint *endpoint));
68
+ } grpc_httpcli_handshaker;
69
+
70
+ extern const grpc_httpcli_handshaker grpc_httpcli_plaintext;
71
+ extern const grpc_httpcli_handshaker grpc_httpcli_ssl;
72
+
73
+ /* A request */
74
+ typedef struct grpc_httpcli_request {
75
+ /* The host name to connect to */
76
+ char *host;
77
+ /* The host to verify in the SSL handshake (or NULL) */
78
+ char *ssl_host_override;
79
+ /* The path of the resource to fetch */
80
+ char *path;
81
+ /* Additional headers: count and key/values; the following are supplied
82
+ automatically and MUST NOT be set here:
83
+ Host, Connection, User-Agent */
84
+ size_t hdr_count;
85
+ grpc_httpcli_header *hdrs;
86
+ /* handshaker to use ssl for the request */
87
+ const grpc_httpcli_handshaker *handshaker;
88
+ } grpc_httpcli_request;
89
+
90
+ /* A response */
91
+ typedef struct grpc_httpcli_response {
92
+ /* HTTP status code */
93
+ int status;
94
+ /* Headers: count and key/values */
95
+ size_t hdr_count;
96
+ grpc_httpcli_header *hdrs;
97
+ /* Body: length and contents; contents are NOT null-terminated */
98
+ size_t body_length;
99
+ char *body;
100
+ } grpc_httpcli_response;
101
+
102
+ /* Callback for grpc_httpcli_get and grpc_httpcli_post. */
103
+ typedef void (*grpc_httpcli_response_cb)(grpc_exec_ctx *exec_ctx,
104
+ void *user_data,
105
+ const grpc_httpcli_response *response);
106
+
107
+ void grpc_httpcli_context_init(grpc_httpcli_context *context);
108
+ void grpc_httpcli_context_destroy(grpc_httpcli_context *context);
109
+
110
+ /* Asynchronously perform a HTTP GET.
111
+ 'context' specifies the http context under which to do the get
112
+ 'pollset' indicates a grpc_pollset that is interested in the result
113
+ of the get - work on this pollset may be used to progress the get
114
+ operation
115
+ 'request' contains request parameters - these are caller owned and can be
116
+ destroyed once the call returns
117
+ 'deadline' contains a deadline for the request (or gpr_inf_future)
118
+ 'on_response' is a callback to report results to (and 'user_data' is a user
119
+ supplied pointer to pass to said call) */
120
+ void grpc_httpcli_get(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
121
+ grpc_pollset *pollset,
122
+ const grpc_httpcli_request *request,
123
+ gpr_timespec deadline,
124
+ grpc_httpcli_response_cb on_response, void *user_data);
125
+
126
+ /* Asynchronously perform a HTTP POST.
127
+ 'context' specifies the http context under which to do the post
128
+ 'pollset' indicates a grpc_pollset that is interested in the result
129
+ of the post - work on this pollset may be used to progress the post
130
+ operation
131
+ 'request' contains request parameters - these are caller owned and can be
132
+ destroyed once the call returns
133
+ 'body_bytes' and 'body_size' specify the payload for the post.
134
+ When there is no body, pass in NULL as body_bytes.
135
+ 'deadline' contains a deadline for the request (or gpr_inf_future)
136
+ 'em' points to a caller owned event manager that must be alive for the
137
+ lifetime of the request
138
+ 'on_response' is a callback to report results to (and 'user_data' is a user
139
+ supplied pointer to pass to said call)
140
+ Does not support ?var1=val1&var2=val2 in the path. */
141
+ void grpc_httpcli_post(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
142
+ grpc_pollset *pollset,
143
+ const grpc_httpcli_request *request,
144
+ const char *body_bytes, size_t body_size,
145
+ gpr_timespec deadline,
146
+ grpc_httpcli_response_cb on_response, void *user_data);
147
+
148
+ /* override functions return 1 if they handled the request, 0 otherwise */
149
+ typedef int (*grpc_httpcli_get_override)(grpc_exec_ctx *exec_ctx,
150
+ const grpc_httpcli_request *request,
151
+ gpr_timespec deadline,
152
+ grpc_httpcli_response_cb on_response,
153
+ void *user_data);
154
+ typedef int (*grpc_httpcli_post_override)(
155
+ grpc_exec_ctx *exec_ctx, const grpc_httpcli_request *request,
156
+ const char *body_bytes, size_t body_size, gpr_timespec deadline,
157
+ grpc_httpcli_response_cb on_response, void *user_data);
158
+
159
+ void grpc_httpcli_set_override(grpc_httpcli_get_override get,
160
+ grpc_httpcli_post_override post);
161
+
162
+ #endif /* GRPC_INTERNAL_CORE_HTTPCLI_HTTPCLI_H */
@@ -0,0 +1,189 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/httpcli/httpcli.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/security/handshake.h"
39
+ #include "src/core/support/string.h"
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include "src/core/tsi/ssl_transport_security.h"
44
+
45
+ typedef struct {
46
+ grpc_channel_security_connector base;
47
+ tsi_ssl_handshaker_factory *handshaker_factory;
48
+ char *secure_peer_name;
49
+ } grpc_httpcli_ssl_channel_security_connector;
50
+
51
+ static void httpcli_ssl_destroy(grpc_security_connector *sc) {
52
+ grpc_httpcli_ssl_channel_security_connector *c =
53
+ (grpc_httpcli_ssl_channel_security_connector *)sc;
54
+ if (c->handshaker_factory != NULL) {
55
+ tsi_ssl_handshaker_factory_destroy(c->handshaker_factory);
56
+ }
57
+ if (c->secure_peer_name != NULL) gpr_free(c->secure_peer_name);
58
+ gpr_free(sc);
59
+ }
60
+
61
+ static void httpcli_ssl_do_handshake(grpc_exec_ctx *exec_ctx,
62
+ grpc_security_connector *sc,
63
+ grpc_endpoint *nonsecure_endpoint,
64
+ grpc_security_handshake_done_cb cb,
65
+ void *user_data) {
66
+ grpc_httpcli_ssl_channel_security_connector *c =
67
+ (grpc_httpcli_ssl_channel_security_connector *)sc;
68
+ tsi_result result = TSI_OK;
69
+ tsi_handshaker *handshaker;
70
+ if (c->handshaker_factory == NULL) {
71
+ cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL, NULL);
72
+ return;
73
+ }
74
+ result = tsi_ssl_handshaker_factory_create_handshaker(
75
+ c->handshaker_factory, c->secure_peer_name, &handshaker);
76
+ if (result != TSI_OK) {
77
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
78
+ tsi_result_to_string(result));
79
+ cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL, NULL);
80
+ } else {
81
+ grpc_do_security_handshake(exec_ctx, handshaker, sc, nonsecure_endpoint, cb,
82
+ user_data);
83
+ }
84
+ }
85
+
86
+ static void httpcli_ssl_check_peer(grpc_exec_ctx *exec_ctx,
87
+ grpc_security_connector *sc,
88
+ tsi_peer peer,
89
+ grpc_security_peer_check_cb cb,
90
+ void *user_data) {
91
+ grpc_httpcli_ssl_channel_security_connector *c =
92
+ (grpc_httpcli_ssl_channel_security_connector *)sc;
93
+ grpc_security_status status = GRPC_SECURITY_OK;
94
+
95
+ /* Check the peer name. */
96
+ if (c->secure_peer_name != NULL &&
97
+ !tsi_ssl_peer_matches_name(&peer, c->secure_peer_name)) {
98
+ gpr_log(GPR_ERROR, "Peer name %s is not in peer certificate",
99
+ c->secure_peer_name);
100
+ status = GRPC_SECURITY_ERROR;
101
+ }
102
+ cb(exec_ctx, user_data, status, NULL);
103
+ tsi_peer_destruct(&peer);
104
+ }
105
+
106
+ static grpc_security_connector_vtable httpcli_ssl_vtable = {
107
+ httpcli_ssl_destroy, httpcli_ssl_do_handshake, httpcli_ssl_check_peer};
108
+
109
+ static grpc_security_status httpcli_ssl_channel_security_connector_create(
110
+ const unsigned char *pem_root_certs, size_t pem_root_certs_size,
111
+ const char *secure_peer_name, grpc_channel_security_connector **sc) {
112
+ tsi_result result = TSI_OK;
113
+ grpc_httpcli_ssl_channel_security_connector *c;
114
+
115
+ if (secure_peer_name != NULL && pem_root_certs == NULL) {
116
+ gpr_log(GPR_ERROR,
117
+ "Cannot assert a secure peer name without a trust root.");
118
+ return GRPC_SECURITY_ERROR;
119
+ }
120
+
121
+ c = gpr_malloc(sizeof(grpc_httpcli_ssl_channel_security_connector));
122
+ memset(c, 0, sizeof(grpc_httpcli_ssl_channel_security_connector));
123
+
124
+ gpr_ref_init(&c->base.base.refcount, 1);
125
+ c->base.base.is_client_side = 1;
126
+ c->base.base.vtable = &httpcli_ssl_vtable;
127
+ if (secure_peer_name != NULL) {
128
+ c->secure_peer_name = gpr_strdup(secure_peer_name);
129
+ }
130
+ result = tsi_create_ssl_client_handshaker_factory(
131
+ NULL, 0, NULL, 0, pem_root_certs, pem_root_certs_size, NULL, NULL, NULL,
132
+ 0, &c->handshaker_factory);
133
+ if (result != TSI_OK) {
134
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
135
+ tsi_result_to_string(result));
136
+ httpcli_ssl_destroy(&c->base.base);
137
+ *sc = NULL;
138
+ return GRPC_SECURITY_ERROR;
139
+ }
140
+ *sc = &c->base;
141
+ return GRPC_SECURITY_OK;
142
+ }
143
+
144
+ /* handshaker */
145
+
146
+ typedef struct {
147
+ void (*func)(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *endpoint);
148
+ void *arg;
149
+ } on_done_closure;
150
+
151
+ static void on_secure_transport_setup_done(grpc_exec_ctx *exec_ctx, void *rp,
152
+ grpc_security_status status,
153
+ grpc_endpoint *secure_endpoint,
154
+ grpc_auth_context *auth_context) {
155
+ on_done_closure *c = rp;
156
+ if (status != GRPC_SECURITY_OK) {
157
+ gpr_log(GPR_ERROR, "Secure transport setup failed with error %d.", status);
158
+ c->func(exec_ctx, c->arg, NULL);
159
+ } else {
160
+ c->func(exec_ctx, c->arg, secure_endpoint);
161
+ }
162
+ gpr_free(c);
163
+ }
164
+
165
+ static void ssl_handshake(grpc_exec_ctx *exec_ctx, void *arg,
166
+ grpc_endpoint *tcp, const char *host,
167
+ void (*on_done)(grpc_exec_ctx *exec_ctx, void *arg,
168
+ grpc_endpoint *endpoint)) {
169
+ grpc_channel_security_connector *sc = NULL;
170
+ const unsigned char *pem_root_certs = NULL;
171
+ on_done_closure *c = gpr_malloc(sizeof(*c));
172
+ size_t pem_root_certs_size = grpc_get_default_ssl_roots(&pem_root_certs);
173
+ if (pem_root_certs == NULL || pem_root_certs_size == 0) {
174
+ gpr_log(GPR_ERROR, "Could not get default pem root certs.");
175
+ on_done(exec_ctx, arg, NULL);
176
+ gpr_free(c);
177
+ return;
178
+ }
179
+ c->func = on_done;
180
+ c->arg = arg;
181
+ GPR_ASSERT(httpcli_ssl_channel_security_connector_create(
182
+ pem_root_certs, pem_root_certs_size, host, &sc) ==
183
+ GRPC_SECURITY_OK);
184
+ grpc_security_connector_do_handshake(exec_ctx, &sc->base, tcp,
185
+ on_secure_transport_setup_done, c);
186
+ GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "httpcli");
187
+ }
188
+
189
+ const grpc_httpcli_handshaker grpc_httpcli_ssl = {"https", ssl_handshake};
@@ -0,0 +1,211 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/httpcli/parser.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include <grpc/support/alloc.h>
39
+ #include <grpc/support/log.h>
40
+ #include <grpc/support/useful.h>
41
+
42
+ static int handle_response_line(grpc_httpcli_parser *parser) {
43
+ gpr_uint8 *beg = parser->cur_line;
44
+ gpr_uint8 *cur = beg;
45
+ gpr_uint8 *end = beg + parser->cur_line_length;
46
+
47
+ if (cur == end || *cur++ != 'H') goto error;
48
+ if (cur == end || *cur++ != 'T') goto error;
49
+ if (cur == end || *cur++ != 'T') goto error;
50
+ if (cur == end || *cur++ != 'P') goto error;
51
+ if (cur == end || *cur++ != '/') goto error;
52
+ if (cur == end || *cur++ != '1') goto error;
53
+ if (cur == end || *cur++ != '.') goto error;
54
+ if (cur == end || *cur < '0' || *cur++ > '1') goto error;
55
+ if (cur == end || *cur++ != ' ') goto error;
56
+ if (cur == end || *cur < '1' || *cur++ > '9') goto error;
57
+ if (cur == end || *cur < '0' || *cur++ > '9') goto error;
58
+ if (cur == end || *cur < '0' || *cur++ > '9') goto error;
59
+ parser->r.status =
60
+ (cur[-3] - '0') * 100 + (cur[-2] - '0') * 10 + (cur[-1] - '0');
61
+ if (cur == end || *cur++ != ' ') goto error;
62
+
63
+ /* we don't really care about the status code message */
64
+
65
+ return 1;
66
+
67
+ error:
68
+ gpr_log(GPR_ERROR, "Failed parsing response line");
69
+ return 0;
70
+ }
71
+
72
+ static char *buf2str(void *buffer, size_t length) {
73
+ char *out = gpr_malloc(length + 1);
74
+ memcpy(out, buffer, length);
75
+ out[length] = 0;
76
+ return out;
77
+ }
78
+
79
+ static int add_header(grpc_httpcli_parser *parser) {
80
+ gpr_uint8 *beg = parser->cur_line;
81
+ gpr_uint8 *cur = beg;
82
+ gpr_uint8 *end = beg + parser->cur_line_length;
83
+ grpc_httpcli_header hdr = {NULL, NULL};
84
+
85
+ GPR_ASSERT(cur != end);
86
+
87
+ if (*cur == ' ' || *cur == '\t') {
88
+ gpr_log(GPR_ERROR, "Continued header lines not supported yet");
89
+ goto error;
90
+ }
91
+
92
+ while (cur != end && *cur != ':') {
93
+ cur++;
94
+ }
95
+ if (cur == end) {
96
+ gpr_log(GPR_ERROR, "Didn't find ':' in header string");
97
+ goto error;
98
+ }
99
+ GPR_ASSERT(cur >= beg);
100
+ hdr.key = buf2str(beg, (size_t)(cur - beg));
101
+ cur++; /* skip : */
102
+
103
+ while (cur != end && (*cur == ' ' || *cur == '\t')) {
104
+ cur++;
105
+ }
106
+ GPR_ASSERT(end - cur >= 2);
107
+ hdr.value = buf2str(cur, (size_t)(end - cur) - 2);
108
+
109
+ if (parser->r.hdr_count == parser->hdr_capacity) {
110
+ parser->hdr_capacity =
111
+ GPR_MAX(parser->hdr_capacity + 1, parser->hdr_capacity * 3 / 2);
112
+ parser->r.hdrs = gpr_realloc(
113
+ parser->r.hdrs, parser->hdr_capacity * sizeof(*parser->r.hdrs));
114
+ }
115
+ parser->r.hdrs[parser->r.hdr_count++] = hdr;
116
+ return 1;
117
+
118
+ error:
119
+ gpr_free(hdr.key);
120
+ gpr_free(hdr.value);
121
+ return 0;
122
+ }
123
+
124
+ static int finish_line(grpc_httpcli_parser *parser) {
125
+ switch (parser->state) {
126
+ case GRPC_HTTPCLI_INITIAL_RESPONSE:
127
+ if (!handle_response_line(parser)) {
128
+ return 0;
129
+ }
130
+ parser->state = GRPC_HTTPCLI_HEADERS;
131
+ break;
132
+ case GRPC_HTTPCLI_HEADERS:
133
+ if (parser->cur_line_length == 2) {
134
+ parser->state = GRPC_HTTPCLI_BODY;
135
+ break;
136
+ }
137
+ if (!add_header(parser)) {
138
+ return 0;
139
+ }
140
+ break;
141
+ case GRPC_HTTPCLI_BODY:
142
+ GPR_UNREACHABLE_CODE(return 0);
143
+ }
144
+
145
+ parser->cur_line_length = 0;
146
+ return 1;
147
+ }
148
+
149
+ static int addbyte(grpc_httpcli_parser *parser, gpr_uint8 byte) {
150
+ switch (parser->state) {
151
+ case GRPC_HTTPCLI_INITIAL_RESPONSE:
152
+ case GRPC_HTTPCLI_HEADERS:
153
+ if (parser->cur_line_length >= GRPC_HTTPCLI_MAX_HEADER_LENGTH) {
154
+ gpr_log(GPR_ERROR, "HTTP client max line length (%d) exceeded",
155
+ GRPC_HTTPCLI_MAX_HEADER_LENGTH);
156
+ return 0;
157
+ }
158
+ parser->cur_line[parser->cur_line_length] = byte;
159
+ parser->cur_line_length++;
160
+ if (parser->cur_line_length >= 2 &&
161
+ parser->cur_line[parser->cur_line_length - 2] == '\r' &&
162
+ parser->cur_line[parser->cur_line_length - 1] == '\n') {
163
+ return finish_line(parser);
164
+ } else {
165
+ return 1;
166
+ }
167
+ GPR_UNREACHABLE_CODE(return 0);
168
+ case GRPC_HTTPCLI_BODY:
169
+ if (parser->r.body_length == parser->body_capacity) {
170
+ parser->body_capacity = GPR_MAX(8, parser->body_capacity * 3 / 2);
171
+ parser->r.body =
172
+ gpr_realloc((void *)parser->r.body, parser->body_capacity);
173
+ }
174
+ parser->r.body[parser->r.body_length] = (char)byte;
175
+ parser->r.body_length++;
176
+ return 1;
177
+ }
178
+ GPR_UNREACHABLE_CODE(return 0);
179
+ }
180
+
181
+ void grpc_httpcli_parser_init(grpc_httpcli_parser *parser) {
182
+ memset(parser, 0, sizeof(*parser));
183
+ parser->state = GRPC_HTTPCLI_INITIAL_RESPONSE;
184
+ parser->r.status = 500;
185
+ }
186
+
187
+ void grpc_httpcli_parser_destroy(grpc_httpcli_parser *parser) {
188
+ size_t i;
189
+ gpr_free(parser->r.body);
190
+ for (i = 0; i < parser->r.hdr_count; i++) {
191
+ gpr_free(parser->r.hdrs[i].key);
192
+ gpr_free(parser->r.hdrs[i].value);
193
+ }
194
+ gpr_free(parser->r.hdrs);
195
+ }
196
+
197
+ int grpc_httpcli_parser_parse(grpc_httpcli_parser *parser, gpr_slice slice) {
198
+ size_t i;
199
+
200
+ for (i = 0; i < GPR_SLICE_LENGTH(slice); i++) {
201
+ if (!addbyte(parser, GPR_SLICE_START_PTR(slice)[i])) {
202
+ return 0;
203
+ }
204
+ }
205
+
206
+ return 1;
207
+ }
208
+
209
+ int grpc_httpcli_parser_eof(grpc_httpcli_parser *parser) {
210
+ return parser->state == GRPC_HTTPCLI_BODY;
211
+ }